summaryrefslogtreecommitdiff
path: root/www/js/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/js/index.js')
-rw-r--r--www/js/index.js1016
1 files changed, 1016 insertions, 0 deletions
diff --git a/www/js/index.js b/www/js/index.js
new file mode 100644
index 0000000..ddedc8f
--- /dev/null
+++ b/www/js/index.js
@@ -0,0 +1,1016 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+*/
+
+version = '0.9.5_rc4';
+
+function istPremium(benutzer, key){ // Supersicherer Keygenerator :P Inspiriert von kryptochef.de
+ sollKey = '';
+
+ switch(benutzer.length % 10){ // Anzahl Zeichen ausschreiben
+ case 0: sollKey = 'NULL'; break;
+ case 1: sollKey = 'EINS'; break;
+ case 2: sollKey = 'ZWEI'; break;
+ case 3: sollKey = 'DREI'; break;
+ case 4: sollKey = 'VIER'; break;
+ case 5: sollKey = 'FUNF'; break;
+ case 6: sollKey = 'SECHS'; break;
+ case 7: sollKey = 'SIEBEN'; break;
+ case 8: sollKey = 'ACHT'; break;
+ case 9: sollKey = 'NEUN'; break;
+ }
+
+ sollKey = sollKey.replace(/[A-Z]/g, function(s){
+ return String.fromCharCode(s.charCodeAt(0) + (s < 'N' ? 13 : -13)); // ROT13
+ });
+
+ sollKey = sollKey + Math.round(benutzer.length * 3.14); // Eine Zahl anfügen
+
+ if(sollKey === key){
+ return true;
+ }else{
+ return false;
+ }
+}
+
+function updateCheck(){
+ var request = $.ajax({
+ url: 'http://klimaag.***REMOVED***/app/www/knockout.html',
+ cache: false
+ });
+
+ request.done(function(resultHtml){
+ var appStatus = $('li[id="' + version + '"]', resultHtml).text().trim();
+ var loginOk = true;
+
+ console.log('Appstatus: ' + appStatus);
+
+ switch(appStatus){
+ case 'ok':
+ break;
+ case 'hangon':
+ $('#versioninfo').text('Es besteht ein Problem mit der aktuellen Version. Ein Update ist in Arbeit.');
+ break;
+ case 'info':
+ $('#versioninfo').text('Ein Update ist im Appstore verfügbar.').show();
+ break;
+ case 'warn':
+ $('#versioninfo').text('Ein wichtiges Update ist im Appstore verfügbar.').show();
+ break;
+ case 'force':
+ $('#versioninfo').text('Ein wichtiges Update ist im Appstore verfügbar. Du musst es installieren, um dich weiterhin einloggen zu können.').show();
+ $('#loginsubmit').prop('disabled', true);
+ loginOk = false;
+ break;
+ default:
+ $('#versioninfo').text('Diese Appversion wird nicht mehr unterstützt, bitte aktualisiere auf die neueste Version aus dem Appstore.').show();
+ $('#loginsubmit').prop('disabled', true);
+ loginOk = false;
+ }
+
+ if(loginOk === true){
+ tryLogin(); // nur wenn alles in Ordnung ist, einloggen lassen
+ }
+ });
+
+ request.fail(fail);
+}
+
+function track(what){
+ _paq.push(['setCustomUrl', what]);
+ _paq.push(['trackPageView', what]);
+}
+
+function trackPlan(vdate){
+ track('plan/' + vdate.format('YYYY/MM/DD'));
+}
+
+$('#settingspanel').change(function(){
+ localStorage.setItem('dntrack', $('#dntflip').val());
+ localStorage.setItem('classes', $('#addclass').val().toUpperCase());
+ localStorage.setItem('notifyday', $('#notifydayflip').val());
+ localStorage.setItem('notifynull', $('#notifynullflip').val());
+ localStorage.setItem('notifydate', $('#notifydate').val());
+ localStorage.setItem('apptheme', $('#themeselect').val());
+});
+
+document.addEventListener('offline', function(){
+ $('#loginsubmit').prop('disabled', true);
+ $('#error_noconn').show('fast');
+}, false);
+
+document.addEventListener('online', function(){
+ $('#loginsubmit').prop('disabled', false);
+ $('#error_noconn').hide('fast');
+}, false);
+
+$('#mainpage').on('swiperight', function(){
+ $('#settingspanel').panel('open');
+});
+
+var _paq = _paq || [];
+$('#mainpage').on('pagebeforeshow', function(){
+ /* Versionsnummer zeigen */
+ $('.version').text(version);
+
+ /* 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 notifyNull = localStorage.getItem('notifynull');
+ var notifyDate = localStorage.getItem('notifydate');
+ var premium = localStorage.getItem('premium');
+ var easteregg = localStorage.getItem('easteregg');
+ var apptheme = localStorage.getItem('apptheme');
+
+ 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(notifyNull === null || notifyNull.length === 0){
+ notifyNull = 0;
+ }
+ $('#notifynullflip').val(notifyNull).slider('refresh');
+
+ if(notifyDate === null || notifyDate.length === 0){
+ notifyDate = '18:00';
+ }
+ $('#notifydate').val(notifyDate).textinput('refresh');
+
+ if(premium === null || premium.length === 0){
+ premium = 'false';
+ }
+ if(premium === 'true'){
+ $('#themeselect').append('<option value="c">Gold</option>').selectmenu('refresh');
+ console.log('Premium geladen');
+ }
+
+ if(easteregg === null || easteregg.length === 0){
+ easteregg = 'false';
+ }
+ if(easteregg === 'true'){
+ $('#themeselect').append('<option value="d">Pink</option>').selectmenu('refresh');
+ console.log('Easteregg geladen');
+ }
+
+ if(apptheme === null || apptheme.length === 0){
+ apptheme = 'a';
+ }
+ $('#themeselect').val(apptheme).selectmenu('refresh');
+
+ /* Piwik initialisieren */
+ _paq.push(['setDoNotTrack', dntrack]);
+});
+
+// Login-Popup beim Start
+document.addEventListener('deviceready', function(){
+ /* iOS fix */
+ if(window.device && parseFloat(window.device.version) >= 7.0) {
+ $('body').addClass('iOS7');
+ }
+
+ /* los geht's */
+ _paq.push(['setCustomVariable', 1, 'Modell', device.model, 'visit']);
+ _paq.push(['setCustomVariable', 2, 'Version', device.version, 'visit']);
+ _paq.push(['setCustomVariable', 3, 'Appversion', version, 'visit']);
+ track('load');
+
+ fillForm();
+
+ if(navigator.connection.type !== Connection.NONE){ // falls Netz da ist
+ updateCheck(); // checkt ob aktuellste Version und loggt ein
+ }
+
+ window.plugin.notification.local.cancelAll(); // alle Benachrichtigungen canceln, werden während des Renderings neu gesetzt
+ load();
+}, false);
+
+/* der Loader wird nur angezeigt, wenn das Popup zu ist */
+$('#loginpopup').on('popupafteropen', function(){
+ $.mobile.loading('hide');
+});
+
+/* 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 = 'Vertretungen für ' + vdate.format('dddd');
+ var ndate = vdate.subtract('days', 1).add('days', $('#notifydayflip').val()); // Bei Bedarf einen Tag vorher
+
+ if(moment().isBefore(ndate)){
+ window.plugin.notification.local.add({
+ date: ndate.toDate(),
+ message: msg,
+ title: title,
+ autoCancel: true,
+ json: JSON.stringify({id: $div.attr('id')})
+ });
+
+ 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: ' + ndate.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 sharebtns = $('button', $div);
+
+ if(sharebtns.length === 0){
+ var btn = $('<button />')
+ .text('Teile die Vertretungen')
+ .data('msg', msg)
+
+ .click(function(){
+ window.plugins.socialsharing.share('Hey Leute! Laut der WvS-VPlan-App gibt es folgende Vertretungen am ' + datestr + ': ' + $(this).data('msg'));
+ console.log('Vertretungsplan geteilt: ' + datestr);
+ track('share');
+ })
+
+ .addClass('ui-btn ui-corner-all ui-btn-inline ui-btn-icon-left ui-icon-share-square-o');
+
+ var btnholder = $('<div />');
+ btnholder.append(btn);
+ $div.prepend(btnholder);
+
+ console.log('Teilen-Button hinzugefügt: ' + datestr + ' ' + msg);
+ }else{
+ sharebtns.first().data('msg', sharebtns.first().data('msg') + ', ' + msg);
+ console.log('Zum 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;
+}
+
+function entkuerzeleLehrer(kuerzel){ // wenn vorhanden, Langform zurückgeben
+ if(window.lehrerKuerzel[kuerzel] !== undefined){
+ return window.lehrerKuerzel[kuerzel];
+ }else{
+ return kuerzel;
+ }
+}
+
+function entkuerzeleFach(kuerzel){ // wenn vorhanden, Langform zurückgeben
+ if(window.fachKuerzel[kuerzel] !== undefined){
+ return window.fachKuerzel[kuerzel];
+ }else{
+ return kuerzel;
+ }
+}
+
+/* konvertiert die extrahierten Strings in ein lesbares Format und filtert nach relevanten Vertretungen */
+function parseVertretungen(str, username){
+ /*
+ * Abstandhalter [ ]*
+ *
+ * ([\wäöü]+)
+ * Klasse
+ *
+ * (\d+(?:[ ]*-[ ]*\d+)?)
+ * (Stunde x bis)? Stunde y
+ *
+ * (x?)
+ * Entfall ja/nein
+ *
+ * (?:(?:([\wäöü]+|\+)[ ]*->[ ]*([\wäöü]+|\+))|(?:()([\wäöü]+|\+)))
+ * Altes Fach -> Neues Fach | Neues Fach
+ *
+ * (?:(?:(\d+|---)[ ]*->[ ]*(\d+|---))|(?:()(\d+|---)))
+ * Alter Raum -> neuer Raum | neuer Raum
+ *
+ * ([\wäöü]+|---|[+.])
+ * Art-Text
+ *
+ * (?:(?:([\wäöü]+|\+)[ ]*->[ ]*([\wäöü]+|\+))|(?:()([\wäöü]+|\+)))
+ * Alter Lehrer -> Neuer Lehrer | Neuer Lehrer
+ *
+ * ([\wäöü]*)
+ * Info-Text
+ */
+
+ var vertretungenRe = /([\wäöü]+)[ ]+(\d+(?:[ ]*-[ ]*\d+)?)[ ]+(x?)[ ]*(?:(?:([\wäöü]+|\+)[ ]*->[ ]*([\wäöü]+|\+))|(?:()([\wäöü]+|\+)))[ ]+(?:(?:(\d+|---)[ ]*->[ ]*(\d+|---))|(?:()(\d+|---)))[ ]+([\wäöü]+|---|[+.])[ ]+(?:(?:([\wäöü]+|\+)[ ]*->[ ]*([\wäöü]+|\+))|(?:()([\wäöü]+|\+)))[ ]*([\wäöü]*)/i;
+ var res;
+ var vertretungen = [];
+ var nutzerklasse;
+
+ if(/\w+_.*/.test(username)){
+ nutzerklasse = username.match(/(\w+)_.*/)[1].toUpperCase();
+ }else{
+ return [];
+ }
+
+ str.split('\n').forEach(function(vertretungsstr){
+ result = vertretungsstr.match(vertretungenRe);
+
+ if(result !== null){
+ // aufräumen
+ var res = [];
+
+ for(var j = 0; j < result.length; j++){
+ if(result[j] != null){ // jshint ignore:line
+ res.push(result[j]);
+ }
+ }
+
+ var klasse = res[1].toUpperCase();
+ var stunde = res[2].trim();
+ var entfall = res[3].indexOf('x') > -1;
+ var altFach = res[4];
+ var fach = res[5];
+ var altRaum = res[6];
+ var raum = res[7];
+ var art = res[8];
+ var lehrer = res[9];
+ var vertreter = res[10];
+ var info = res[11];
+
+ 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;
+ }
+ });
+ }
+
+ /* entkürzeln :) */
+ lehrer = entkuerzeleLehrer(lehrer);
+ vertreter = entkuerzeleLehrer(vertreter);
+ altFach = entkuerzeleFach(altFach);
+ fach = entkuerzeleFach(fach);
+
+ if(wichtig === false){
+ return;
+ }
+
+ if(entfall === false){
+ if(info.length <= 1){
+ info = "";
+ }else{
+ info = " Info:" + info;
+ }
+
+ if(art.length <= 1){
+ art = "";
+ }else{
+ art = art + " in ";
+ }
+
+ var nlehrer;
+ var nraum;
+ var nfach;
+
+ if(lehrer != vertreter && lehrer !== '' && vertreter !== ''){
+ nlehrer = "mit " + vertreter + " (statt " + lehrer + ") ";
+ }else{
+ nlehrer = "mit " + vertreter + " ";
+ }
+
+ if(raum != altRaum && raum !== '' && altRaum !== ''){
+ nraum = "in Raum " + raum + " (statt " + altRaum + ") ";
+ }else{
+ nraum = "in Raum " + raum + " ";
+ }
+
+ if(fach != altFach && fach !== '' && altFach !== ''){
+ nfach = fach + " (statt " + altFach + ") ";
+ }else{
+ nfach = fach + " ";
+ }
+
+ vertretungen.push(klasse + " " + stunde + ". Stunde " + art + nfach + nlehrer + nraum + info);
+ }else{
+ var nstr = " (statt " + fach + " mit " + vertreter + ")";
+
+ if(info.length <= 1){
+ info = "";
+ }else{
+ info = " Info:" + info;
+ }
+
+ vertretungen.push(klasse + " " + stunde + ". Stunde Entfall" + nstr + 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;
+}
+
+/* schreibt ein Bild und eine Textdatei mit dem Inhalt der PDF-Seite */
+function schreibeCache($div, pageNumber, canvasUrl, extrakt){
+ var prefix = $div.data('file').replace(/\.pdf/gi, '') + '-' + pageNumber;
+ var bildName = prefix + '.png';
+
+ window.requestFileSystem(
+ LocalFileSystem.PERSISTENT, 0,
+ function(fileSystem){
+ fileSystem.root.getDirectory('WvS-VPlan', {create: true, exclusive: false},
+ function(dirEntry){
+ dirEntry.getFile(bildName, {create: true, exclusive: false},
+ function(fileEntry){
+ var fileTransfer = new FileTransfer();
+
+ fileTransfer.download(
+ canvasUrl,
+ fileEntry.toURL(),
+ function(theFile){
+ // Stille.
+ }, fail);
+ });
+ }, fail);
+ });
+
+ var textName = prefix + '.txt';
+
+ window.requestFileSystem(
+ LocalFileSystem.PERSISTENT, 0,
+ function(fileSystem){
+ fileSystem.root.getDirectory('WvS-VPlan', {create: true, exclusive: false},
+ function(dirEntry){
+ dirEntry.getFile(textName, {create: true, exclusive: false},
+ function(fileEntry){
+ fileEntry.createWriter(
+ function(fileWriter){
+ var blob;
+
+ try{
+ blob = new Blob([extrakt], {type: 'text/plain'}); // Kein 'new Blob' für Android, obwohl BlobBuilder obsolet ist
+ }catch(e){
+ window.BlobBuilder = window.BlobBuilder ||
+ window.WebKitBlobBuilder ||
+ window.MozBlobBuilder ||
+ window.MSBlobBuilder;
+ if(e.name == 'TypeError' && window.BlobBuilder){
+ var bb = new BlobBuilder();
+ bb.append(extrakt);
+ blob = bb.getBlob('text/plain');
+ }
+ }
+
+ fileWriter.write(blob);
+ }, fail);
+ });
+ }, fail);
+ });
+
+ console.log($div.attr('id') + '-' + pageNumber + ' gecached');
+}
+
+function benutzeVertretungen(pageText, $div){
+ var userdata = getUserData();
+
+ if(userdata === null){
+ return;
+ }
+
+ var username = userdata[0];
+ var vertretungen = parseVertretungen(pageText, username);
+
+ 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]);
+
+ if(vertretungen.length > 0){
+ addSocialButton(vdate, vertretungen.join(', '), $div);
+ addNotification(vdate, vertretungen.join('\n'), $div);
+ }else{
+ if($('#notifynullflip').val() == 'true'){
+ addNotification(vdate, 'Keine weiteren Vertretungen', $div); // TODO FIXME Problem bei mehreren Seiten!
+ }
+ }
+}
+
+/* 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 $canvas = $('<canvas></canvas>');
+ var canvas = $canvas.get(0);
+ canvas.className = 'pdfcanvas';
+ var context = canvas.getContext('2d');
+ canvas.width = pageDisplayWidth;
+ canvas.height = pageDisplayHeight;
+
+ $div.append($canvas);
+
+ 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.items.length; j++){
+ var block = textContent.items[j];
+ if(lastBlock !== null && lastBlock.str[lastBlock.str.length - 1] !== ' '){
+ if(block.transform[4] < lastBlock.transform[4]){
+ pageText += '\n';
+ }else if(lastBlock.transform[5] !== block.transform[5] && (lastBlock.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) === null )){
+ pageText += '\n';
+ }
+ }
+
+ pageText += block.str + ' ';
+ lastBlock = block;
+ }
+
+ benutzeVertretungen(pageText, $div);
+
+ /* Als Bild und Text speichern */
+ schreibeCache($div, pageNumber, canvas.toDataURL(), pageText);
+ });
+
+ 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');
+}
+
+function replaceUmlauts(umlautstr){
+ tr = {'ä': 'ae', 'ü': 'ue', 'ö': 'oe', 'ß': 'ss'};
+
+ return umlautstr.replace(/[äöüß]/g, function($0) { return tr[$0]; });
+}
+
+function getPlanTabName(fname){
+ var name, vdate;
+ var fnameRe = /.*?(\d{4}-\d{2}-\d{2})(.*?)\.(?:pdf|png|txt)/;
+ var results = fname.match(fnameRe);
+
+ if(results !== null){
+ 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]);
+ }else{
+ return null;
+ }
+
+ return [name, vdate, results[1]]; // TODO aua, das geht aber schöner
+}
+
+/* fügt ein neues Tab in die Navigationsleiste ein und gibt den Namen des Tab-Divs zurück */
+function neuesPlanTab(fname){
+ var dname = decodeURIComponent(fname);
+ var name = "";
+ var vdate, rdate;
+
+ console.log('Dateiname: ' + dname);
+
+ name = getPlanTabName(dname)[0];
+ vdate = getPlanTabName(dname)[1];
+ rdate = getPlanTabName(dname)[2];
+
+ if(name !== null){
+ if(!$(name).length){
+ $('#vplannavbar').find('*').andSelf().each(function(){ // Navbar neuzeichnen; hier hat jQuery Mobile eine Schwäche :(
+ $(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('<li><a href="#' + name + '">' + name.replace(/_/g, '.') + '</a></li>');
+ $('#vplannavbar ul li:last').click(function(){
+ trackPlan(vdate);
+ });
+
+ $('#vplannavbar').navbar();
+
+ $('#vplantabs').append('<div id="' + name + '" class="tablist-content"></div>');
+ $('#vplantabs').tabs('refresh');
+
+ $('#' + name).data('date', rdate);
+ $('#' + name).data('file', dname);
+ }
+ }
+
+ return name;
+}
+
+/* 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 = neuesPlanTab(fileEntry.name);
+
+ renderPdf(sPath, name);
+}
+
+/* lädt ein PDF anhand eines Links herunter, benötigt ID zur Sortierung */
+function downloadPdf(link){
+ var filename = link.substring(link.lastIndexOf("/") + 1);
+
+ window.requestFileSystem(
+ LocalFileSystem.PERSISTENT, 0,
+ function(fileSystem){
+ fileSystem.root.getDirectory('WvS-VPlan', {create: true, exclusive: false},
+ function(dirEntry){
+ dirEntry.getFile(filename, {create: false, exclusive: false},
+ function(fileEntry){
+ // Datei ist schon heruntergeladen
+ console.log('Datei schon heruntergeladen');
+ $.mobile.loading('hide'); // Loader verstecken
+ },
+ function(err){
+ // Datei existiert noch nicht
+ dirEntry.getFile(filename, {create: true, exclusive: false},
+ function(fileEntry){
+ var fileTransfer = new FileTransfer();
+
+ fileTransfer.download(
+ link,
+ fileEntry.toURL(),
+ function(theFile){
+ console.log('Download fertig: ' + theFile.toURL());
+ addPlanAttr(theFile, true);
+ }, fail);
+ }, fail);
+ });
+ }, fail);
+ });
+}
+
+/* sucht den Downloadlink eines Plans mithilfe eines Links aus der Kursübersicht */
+function getPlan(link){
+ var request = $.ajax({
+ url: link
+ });
+
+ request.done(function gotPlan(resultHtml){
+ var pdflink = $('.resourceworkaround a', resultHtml).attr('href');
+
+ if(pdflink === undefined){
+ return;
+ }
+
+ console.log('Plan gefunden: ' + pdflink);
+ downloadPdf(pdflink);
+ });
+
+ request.fail(fail);
+}
+
+/* holt die Kursübersicht */
+function getOverview(link){
+ var request = $.ajax({
+ url: link
+ });
+ console.log('Hole Übersicht');
+
+ request.done(function gotOverview(resultHtml){
+ /* ruft getPlan für jeden Link in der Kursübersicht auf */
+ var as = $('.activityinstance a', resultHtml);
+
+ if(as.length !== 0){
+ var benutzername = getUserData()[0];
+ var key = $('#addclass').val().split('\n')[0]; // erste zusätzliche Klasse
+
+ if(istPremium(benutzername, key)){
+ localStorage.setItem('premium', 'true');
+ console.log('Premium freigeschaltet');
+ }else if(key.toUpperCase() === 'PINK'){
+ localStorage.setItem('easteregg', 'true');
+ console.log('Easteregg freigeschaltet');
+ }
+ }
+
+ as.each(function(index, element){
+ console.log('suche Plan ' + element);
+ getPlan(element);
+ });
+
+ console.log('Übersichts-Request erfolgreich');
+ });
+
+ request.fail(fail);
+}
+
+/* such den Link zur Übersicht von der Startseite aus */
+function loggedIn(resultHtml){
+ var istLehrer = new RegExp(/\d/).test(getUserData()[0]) === false; // wenn eine Zahl vorhanden ist, ist es ein Schüler
+
+ var link;
+
+ if(istLehrer === false){
+ link = $('.coursebox .info .coursename a:contains("Vertretungsplan")', resultHtml).attr('href');
+ }else{
+ console.log('Lehrer erkannt');
+ link = $('.coursebox .info .coursename a:contains("Vertretungsplan (Lehrer)")', resultHtml).attr('href');
+ }
+
+ if(link === undefined){
+ $('#lnklogin').click();
+ $('#error_passwd').show('fast');
+ return;
+ }
+
+ localStorage.setItem('overviewlink', link);
+ console.log('Eingeloggt');
+ getOverview(link);
+}
+
+/* sendet einen HTTPost-Request mit Logindaten */
+function sendLogin(username, password){
+ var params = 'username=' + username + '&password=' + password;
+
+ $('#error_general').hide('fast');
+ $('#error_passwd').hide('fast');
+
+ var request = $.ajax({
+ type: 'POST',
+ url: 'https://***REMOVED***/moodle/login/index.php',
+ data: {username: username, password: password}
+ });
+
+ console.log('Logge ein');
+
+ request.done(loggedIn);
+ request.fail(fail);
+}
+
+/* lädt Benutzerdaten 1) aus den Userinterfaces oder 2) aus dem HTML5 Local Storage */
+/* oder 3) gibt null zurück */
+function getUserData(){
+ var username = encodeURIComponent($('#username').val());
+
+ if(username === ''){
+ username = localStorage.getItem('username');
+ }else{
+ localStorage.setItem('username', username);
+ }
+
+ var password = encodeURIComponent($('#password').val());
+
+ if(password === ''){
+ password = localStorage.getItem('password');
+ }else{
+ localStorage.setItem('password', password);
+ }
+
+ if(username !== null && username.length !== 0 && password !== null && password.length !== 0){
+ return [username, password];
+ }else{
+ return null;
+ }
+}
+
+/* loggt ein oder zeigt Loginform */
+function login(){
+ $.mobile.loading('show');
+ userdata = getUserData();
+
+ if(userdata){
+ sendLogin(userdata[0], userdata[1]);
+ $('#loginpopup').popup('close');
+ $('#lnklogin').text('Aktualisieren');
+ return 1;
+ }else{
+ $('#lnklogin').click();
+ return 0;
+ }
+}
+
+/* loggt automatisch ein */
+function tryLogin(){
+ $('#loginpopup').popup('close');
+
+ console.log('Teste Login');
+ login();
+}
+
+function leseVCache(fileEntry, $div){
+ fileEntry.file(function(file){
+ var reader = new FileReader();
+
+ reader.onloadend = function(e){
+ benutzeVertretungen(this.result, $div);
+ };
+
+ reader.readAsText(file);
+ }, fail);
+}
+
+function ladeCache(fileEntry){
+ var name = fileEntry.name;
+
+ if(fileEntry.name.indexOf('.pdf') > -1){
+ console.log('Bereit zum Laden von ' + neuesPlanTab(name));
+ }else{
+ name = getPlanTabName(name.replace(/-\d+\./, '.'))[0]; // Das '-1' entfernen
+ }
+
+ if(fileEntry.name.indexOf('.png') > -1){
+ $('#' + name).append($('<img>').attr('src', fileEntry.toURL()));
+ }else if(fileEntry.name.indexOf('.txt') > -1){
+ leseVCache(fileEntry, $('#' + name));
+ }
+}
+
+/* gibt aktuelle Pläne aus entries zurück */
+function getActual(entries){
+ var fnameRe = new RegExp('.*?(\\d{4}-\\d{2}-\\d{2}).*?\\.(?:pdf|png|txt)');
+ var today = moment().startOf('day');
+ var actual = [];
+
+ entries.forEach(function(entry){
+ console.log(entry.name);
+ var results = decodeURIComponent(entry.name).match(fnameRe);
+
+ if(results !== null){
+ var fdate = moment(results[1], 'YYYY-MM-DD');
+
+ if(today.isBefore(fdate) || today.isSame(fdate, 'day')){
+ actual.push(entry);
+ }
+ }
+ });
+
+ return actual;
+}
+
+/* lädt Vertretungspläne aus dem Speicher [1) SD-Karte oder 2) dem internen Speicher] */
+function load(){
+ $.mobile.loading('show');
+ window.requestFileSystem(
+ LocalFileSystem.PERSISTENT, 0,
+ function(fileSystem){
+ fileSystem.root.getDirectory('WvS-VPlan', {create: true, exclusive: false},
+ function(dirEntry){
+ var dirReader = dirEntry.createReader();
+
+ dirReader.readEntries(
+ function(entries){
+ var actual = getActual(entries);
+
+ console.log('Im Speicher: ' + actual.length + ' aktuelle Dateien');
+
+ if(actual.length > 0){
+ for(j = 0; j < actual.length; j++){
+ ladeCache(actual[j], false);
+ }
+ }else{
+ $.mobile.loading('hide');
+ }
+ }, fail);
+ }, fail);
+ });
+}
+
+/* löscht alle Pläne im Speicher */
+function purge(){
+ $('#purgebtn').hide('fast');
+
+ window.requestFileSystem(
+ LocalFileSystem.PERSISTENT, 0,
+ function(fileSystem){
+ fileSystem.root.getDirectory('WvS-VPlan', {create: true, exclusive: false},
+ function(dirEntry){
+ var dirReader = dirEntry.createReader();
+
+ dirReader.readEntries(
+ function(entries){
+ var actual = getActual(entries);
+
+ actual.forEach(function(entry){ // akuelle aus entries löschen
+ var index = entries.indexOf(entry);
+ if(index !== -1){
+ entries.splice(index, 1);
+ }
+ });
+
+ console.log('Lösche ' + entries.length + ' alte Pläne');
+
+ entries.forEach(function(entry){
+ entry.remove(null, fail); // Datei löschen
+ });
+ }, fail);
+ }, fail);
+ }, fail);
+}