/*
* 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 .
*/
// Login-Popup beim Start
$(document).bind('pageinit', function(){
setTimeout(function(){
load();
}, 1000);
setTimeout(function(){
trylogin();
}, 2000);
});
/* PDF Rendering */
function renderPage($div, pdf, pageNumber, callback){
pdf.getPage(pageNumber).then(function(page){
var scale = 2;
var viewport = page.getViewport(scale);
var pageDisplayWidth = viewport.width;
var pageDisplayHeight = viewport.height;
var pageDivHolder = document.createElement('div');
pageDivHolder.className = 'pdfpage';
var $canvas = $('');
var canvas = $canvas.get(0);
canvas.className = 'pdfcanvas';
var context = canvas.getContext('2d');
canvas.width = pageDisplayWidth;
canvas.height = pageDisplayHeight;
pageDivHolder.appendChild(canvas);
$div.append(pageDivHolder);
var renderContext = {
canvasContext: context,
viewport: viewport
};
page.render(renderContext).promise.then(callback);
});
}
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){
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);
}
/* fügt die lokale URL des Plans ein und ruft die Seite zum Rendering auf */
function addplanattr(fileEntry){
var sPath = fileEntry.toURL();
var name = fileEntry.name;
console.log('Dateiname: ' + name);
var fname_re = new RegExp('.*?([^-]{4})-([^-]{2})-([^-]{2}).*?\.pdf'); // \d funktioniert nicht
var results = name.match(fname_re);
name = results[3] + "_" + results[2] + "_" + results[1];
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('
' + name.replace(/_/g, '.') + '');
$('#vplannavbar').navbar();
$('#vplantabs').append('');
$('#vplantabs').tabs('refresh');
}
render_pdf(sPath, name);
}
/* lädt ein PDF anhand eines Links herunter, benötigt ID zur Sortierung */
function download_pdf(link){
var filename = link.substring(link.lastIndexOf("/") + 1);
window.requestFileSystem(
LocalFileSystem.PERSISTENT, 0,
function(fileSystem){
fileSystem.root.getDirectory('WvSVPlan', {create: true, exclusive: false},
function(dirEntry){
dirEntry.getFile(filename, {create: false, exclusive: false},
function(fileEntry){
// Datei ist schon heruntergeladen
console.log('Datei schon heruntergeladen');
},
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);
}, fail);
}, fail);
});
}, fail);
});
}
/* sucht den Downloadlink eines Plans mithilfe eines Links aus der Kursübersicht */
function get_plan(link){
var request = $.ajax({
url: link
});
request.done(function gotplan(resulthtml){
var pdf_re = new RegExp('(http://***REMOVED***\\.de/moodle/pluginfile\\.php/\\d+/mod_resource/content/\\d+/.*?\\.pdf)');
var pdflink = pdf_re.exec(resulthtml)[1];
if(pdflink == null){
return 0;
}
console.log('Plan gefunden: ' + pdflink);
download_pdf(pdflink);
return 1;
});
request.fail(fail);
}
/* holt die Kursübersicht - bei Verbindungsfehlern wird onfail aufgerufen */
function get_overview(link, onfail){
var request = $.ajax({
url: link
});
console.log('Hole Übersicht');
request.done(function gotoverview(resulthtml){
/* ruft get_plan für jeden Link in der Kursübersicht auf */
var plans_re = new RegExp('window\\.open\\('(http://***REMOVED***\\.de/moodle/mod/resource/view\\.php\\?id=\\d+)&redirect=1'\\)', 'g');
var resultarr = resulthtml.match(plans_re);
if(resultarr == null){
$('#error_passwd').show('fast');
onfail();
return 0;
}
var resultl = resultarr.length;
while((link = plans_re.exec(resulthtml)) !== null){
console.log('suche Plan ' + link[1]);
get_plan(link[1]);
}
console.log('Übersichts-Request erfolgreich');
return 1;
});
request.fail(onfail);
}
/* such den Link zur Übersicht von der Startseite aus */
function loggedin(resulthtml){
var vertretungs_re = new RegExp('title="Vertretungsplan" href="(http://***REMOVED***\\.de/moodle/course/view\\.php\\?id=\\d+)"');
var link = vertretungs_re.exec(resulthtml)[1];
if(link == null){
return 0;
}
window.localStorage.setItem('overviewlink', link);
console.log('Eingeloggt');
get_overview(link, fail);
return 1;
}
/* sendet einen HTTPost-Request mit Logindaten */
function sendlogin(username, password){
var params = 'username=' + username + '&password=' + password;
$('#error_noconn').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 = window.localStorage.getItem('username');
}else{
window.localStorage.setItem('username', username);
}
var password = encodeURIComponent($('#password').val());
if(password == ''){
password = window.localStorage.getItem('password');
}else{
window.localStorage.setItem('password', password);
}
console.log('Benutzerdaten geladen');
if(username !== 'undefined' && username != null && username != '' && password !== 'undefined' && password != null && password != ''){
return [username, password];
}else{
return null;
}
}
/* loggt ein oder zeigt Loginform */
function login(){
userdata = getuserdata();
if(userdata){
sendlogin(userdata[0], userdata[1]);
$('#loginpopup').popup('close');
return 1;
}else{
$('#lnklogin').click();
return 0;
}
}
/* versucht ohne HTTPost die Übersicht zu holen */
/* bei einem Fehlschlag wird in login() versucht, die Nutzerdaten zu laden */
/* und wenn das schiefläuft, muss der Nutzer seine Daten selbst eingeben */
function trylogin(){
var link = window.localStorage.getItem('overviewlink');
$('#loginpopup').popup('close');
if(typeof link !== 'undefined' && link != null){
console.log('Teste Login');
console.log(link);
get_overview(link, login);
}else{
login();
}
}
/* gibt aktuelle Pläne aus entries zurück */
function getactual(entries){
var fname_re = new RegExp('.*?([^-]{4})-([^-]{2})-([^-]{2}).*?\.pdf'); // \d funktioniert nicht
var today = new Date();
var actual = [];
entries.forEach(function(entry){
console.log(entry.name);
var results = entry.name.match(fname_re);
var fdate = new Date(parseInt(results[1]), parseInt(results[2]) - 1, parseInt(results[3]));
if(fdate >= today){
actual.push(entry);
}
});
return actual;
}
/* lädt Vertretungspläne aus dem Speicher [1) SD-Karte oder 2) dem internen Speicher] */
function load(){
window.requestFileSystem(
LocalFileSystem.PERSISTENT, 0,
function(fileSystem){
fileSystem.root.getDirectory('WvSVPlan', {create: true, exclusive: false},
function(dirEntry){
var dirReader = dirEntry.createReader();
dirReader.readEntries(
function(entries){
var actual = getactual(entries);
console.log("Im Speicher: " + actual.length + " Pläne");
if(actual.length > 0){
$('#noplans').hide('slow');
for(j = 0; j < actual.length; j++){
addplanattr(actual[j]);
}
}else{
$('#noplans').show('fast');
$('#lnklogin').show('fast');
}
}, fail);
}, fail);
});
}