summaryrefslogtreecommitdiffstats
path: root/modules-available/locationinfo/frontend/panel.html
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/locationinfo/frontend/panel.html')
-rw-r--r--modules-available/locationinfo/frontend/panel.html700
1 files changed, 0 insertions, 700 deletions
diff --git a/modules-available/locationinfo/frontend/panel.html b/modules-available/locationinfo/frontend/panel.html
deleted file mode 100644
index dd5fc25d..00000000
--- a/modules-available/locationinfo/frontend/panel.html
+++ /dev/null
@@ -1,700 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
-<head>
- <script type='text/javascript' src='../../../script/jquery.js'></script>
-
- <style type='text/css'>
- body {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- background-color: lightgrey;
- color: black;
- }
-
- #main {
- display: flex;
- flex-wrap: wrap;
- }
-
- .outermost {
- font-size: 16pt;
- }
-
- .parent, .child {
- padding: 5px;
- float: left;
- background-color: white;
- font-size: 90%;
- min-height: 7em;
- flex-grow: 1;
- align-items: stretch;
- }
-
- .parent .parent, .parent .child {
- min-height: 5em;
- }
-
- .border {
- flex-grow: 1;
- display: inline-flex;
- align-items: stretch;
- padding: 5px;
- }
-
- .courseFont {
- padding: 2px;
- font-size: 90%;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: bold;
- overflow: hidden;
- }
-
- .headerFont {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: bold;
- border: 0px;
- border-bottom: 1px;
- margin-bottom: 1px;
- border-color: grey;
- border-style: solid;
- }
-
- .pc-idle, .pc-occupied, .pc-off, .pc-broken {
- padding: 2px 1px;
- text-align: center;
- font-size: 90%;
- font-weight: 800;
- overflow: hidden;
- transition: width 2s;
- width: 25%;
- }
-
- .pc-idle {
- background-color: green;
- }
-
- .pc-occupied {
- background-color: red;
- border-radius: 3px 0px 0px 3px;
- }
-
- .pc-off {
- background-color: darkgrey;
- }
-
- .pc-broken {
- background-color: black;
- color: white;
- border-radius: 0px 3px 3px 0px;
- }
-
- .pc-state-wrapper {
- display: flex;
- }
-
- .paperEffect {
- margin: 0 auto;
- background-color: #fff;
- box-shadow: 0 0 0.2vmin rgba(0, 0, 0, 0.4), inset 0 0 1vmin rgba(0, 0, 0, 0.1);
- border-radius: 1px;
- }
-
-
- </style>
- <script type='text/javascript'>
-
- var rooms = {};
- var startdate;
- var roomidsString = "";
-
-
- $(document).ready(function () {
- //temp
- SetUpDate(new Date());
- init();
- });
-
- function init() {
- var ids = getUrlParameter("id");
- $.getJSON("../../../api.php?do=locationinfo&action=locationtree&id=" + ids, function (result) {
- generateLayout(result);
-
- setTimeout(update, 1000);
- });
-
- }
-
- function SetUpDate(d) {
- startdate = d.getTime() - new Date().getTime();
- }
-
- function MyDate() {
- return new Date(startdate + new Date().getTime());
- }
-
- function generateLayout(json) {
- for (var i = 0; i < json.length; i++) {
- console.log('Outermost for ' + json[i].locationid);
- var el = generateObject(json[i], ($("#main")), true);
- }
- }
-
- /**
- * generates the divs, decidecs if parent or child
- * @param json Room tree json
- * @param myParent parent div
- * @param outermost if the object is a root node
- * @returns generated div
- */
- function generateObject(json, myParent, outermost) {
- var obj;
- if (!json.children || json.children.length == 0) {
- obj = generateChild(myParent, json.locationid, json.locationname, outermost);
- } else {
- obj = generateParent(myParent, json.locationid, json.locationname, outermost);
- for (var i = 0; i < json.children.length; i++) {
- generateObject(json.children[i], $("#parent_" + json.locationid), false);
- }
- }
- return obj;
-
- }
-
- /**
- * Helper function to generate id string used in query functions
- * @param list A string, wicht contains ids or not(for now)
- * @param id An ID which should be added to the list
- */
- function addIdToUpdateList(list, id) {
- if (list == "") {
- list += id;
- } else {
- list += ("," + id);
- }
- return list;
- }
-
-
- const ROOMUPDATE_MS = 2*60*1000;
- const CALUPDATE_MS = 20*60*1000;
-
- function update() {
- var calendarUpdateIds = "";
- var rommUpdateIds = "";
- var count = 0;
- var nextUpdate = 15000;
- for (var property in rooms) {
- if (rooms[property].lastCalendarUpdate === null || rooms[property].lastCalendarUpdate + CALUPDATE_MS < MyDate().getTime()) {
- calendarUpdateIds = addIdToUpdateList(calendarUpdateIds, rooms[property].id);
- count++;
- rooms[property].lastCalendarUpdate = MyDate().getTime();
- }
- if (rooms[property].lastRoomUpdate === null || rooms[property].lastRoomUpdate + ROOMUPDATE_MS < MyDate().getTime()) {
- rommUpdateIds = addIdToUpdateList(rommUpdateIds, rooms[property].id);
- count++;
- rooms[property].lastRoomUpdate = MyDate().getTime();
- }
- if (count > 7) break;
- }
- if (calendarUpdateIds !== "") {
- queryCalendars(calendarUpdateIds);
- nextUpdate = 1000;
- }
- if (rommUpdateIds !== "") {
- queryRooms(rommUpdateIds);
- nextUpdate = 1000;
- }
- for (var property in rooms) {
- upDateRoomState(rooms[property]);
- }
- setTimeout(update, nextUpdate);
- }
-
-
- function UpdateTimeTables(json) {
- var l = json.length;
- for (var i = 0; i < l; i++) {
- rooms[json[i].id].timetable = json[i].calendar;
- for (var property in rooms[json[i].id].timetable) {
- rooms[json[i].id].timetable[property].start = new Date(rooms[json[i].id].timetable[property].start);
- rooms[json[i].id].timetable[property].end = new Date(rooms[json[i].id].timetable[property].end);
- }
- ComputeCurrentState(rooms[json[i].id]);
- }
- }
-
- /**
- * Querys Pc states
- * @param ids Room ID's which should be queried. Format for e.g.: "20,5,6"
- */
- function queryRooms(ids) {
- $.ajax({
- url: "../../../api.php?do=locationinfo&action=pcstates&id=" + ids,
- dataType: 'json',
- cache: false,
- timeout: 30000,
- success: function (result) {
- var l = result.length;
- if (result[0] == null) {
- console.log("Error: Backend reported null back for RoomUpdate, this might happend if the room isn't" +
- "configurated.");
- return;
- }
- updatePcStates(result);
- }, error: function () {
-
- }
- })
- }
-
- /**
- * Updates a room visualy
- * @param room A room to update
- */
- function upDateRoomState(room) {
- if (room === undefined || room.lastRoomUpdate === null) {
- return;
- }
-
- var state = room.getState();
-
- if (state.state == "CalendarEvent") {
- updateCourseText(room.id, state.titel);
- updateCoursTimer(room.id, GetTimeDiferenceAsString(state.end, MyDate()));
- } else if (state.state == "Free") {
- updateCourseText(room.id, "Frei");
- updateCoursTimer(room.id, GetTimeDiferenceAsString(state.end, MyDate()));
- } else if (state.state == "FreeNoEnd") {
- updateCourseText(room.id, "Frei");
- updateCoursTimer(room.id, "");
- }
- else if (state.state == "closed") {
- updateCourseText(room.id, "Geschlossen");
- updateCoursTimer(room.id, "");
- }
-
- }
-
- /**
- * Updates for all rooms the PC's states
- * @param json Json with information about the PC's states
- */
- function updatePcStates(json) {
- var l = json.length;
- for (var i = 0; i < l; i++) {
- updateRoomUsage(json[i].id, json[i].idle, json[i].occupied, json[i].off, json[i].broken)
- }
-
- }
- /**
- * Generates a room Object and adds it to the rooms array
- * @param id ID of the room
- * @param name Name of the room
- * @param config Config Json of the room
- */
- function addRoom(id, name) {
- var room = {
- id: id,
- name: name,
- timetable: null,
- currentEvent: null,
- nextEventEnd: null,
- timeTilFree: null,
- state: null,
- openingTimes: null,
- lastCalendarUpdate: null,
- lastRoomUpdate: null,
- getState: function () {
- if (!this.state) {
- ComputeCurrentState(this);
- return this.state;
- }
- if (this.state.end != "") {
- if (this.state.end < new MyDate()) {
- ComputeCurrentState(this);
- }
- }
- return this.state;
- }
-
-
- };
-
- rooms[id] = room;
-
- if (roomidsString == "") {
- roomidsString = id;
- } else {
- roomidsString = roomidsString + "," + id;
- }
- }
-
-
- /**
- * computes state of a room, states are:
- * closed, FreeNoEnd, Free, ClaendarEvent.
- * @param Room Object
- */
- function ComputeCurrentState(room) {
- if (room.lastRoomUpdate === null) {
- room.state = {state: 'unknown'};
- return;
- }
- if (!IsOpenNow(room)) {
- room.state = {state: "closed", end: GetNextOpening(room), titel: "", next: ""};
-
- return;
- }
- var closing = GetNextClosing(room);
-
- var event = getNextEvent(room.timetable);
- // no event and no closing
- if (closing == null && event == null) {
- room.state = {state: "FreeNoEnd", end: "", titel: "", next: ""};
- return;
- }
-
- // no event so closing is next
- if (event == null) {
- room.state = {state: "Free", end: closing, titel: "", next: "closing"};
- return;
- }
-
- // event is at the moment
- if ((closing == null || event.start.getTime() < closing.getTime()) && event.start.getTime() < new MyDate()) {
- room.state = {state: "CalendarEvent", end: event.end, titel: event.title, next: ""};
- return;
- }
-
- // no closing so event is next
- if (closing == null) {
- room.state = {state: "Free", end: event.start, titel: "", next: "event"};
- return;
- }
-
- // event sooner then closing
- if (event.start.getTime() < closing) {
- room.state = {state: "Free", end: event.start, titel: "", next: "event"};
- } else if (event.start.getTime() > closing) {
- room.state = {state: "Free", end: closing, titel: "", next: "closing"};
- }
- }
- /**
- * checks if a room is open
- * @param room Room object
- * @returns bool for open or not
- */
- function IsOpenNow(room) {
- var now = new MyDate();
- if (room.openingTimes == null) {
-
- // changes from falls needs testing
- return true;
- }
- var tmp = room.openingTimes[now.getDay()];
- if (tmp == null) {
- return false;
- }
- for (var i = 0; i < tmp.length; i++) {
- var openDate = new MyDate();
- openDate.setHours(tmp[i].HourOpen);
- openDate.setMinutes(tmp[i].MinutesOpen);
- var closeDate = new MyDate();
- closeDate.setHours(tmp[i].HourClose);
- closeDate.setMinutes(tmp[i].MinutesClose);
- if (openDate < now && closeDate > now) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * returns next event from a given json of events
- * @param json Json which contains the calendar data.
- * @returns event next Carlendar Event
- */
- function getNextEvent(json) {
- if (json == null) {
- return;
- }
- var event;
- var now = new MyDate();
- for (var i = 0; i < json.length; i++) {
- //event is now active
- if (json[i].start.getTime() < now.getTime() && json[i].end.getTime() > now.getTime()) {
- return json[i];
- }
- //first element to consider
- if (event == null) {
- if (json[i].start.getTime() > now.getTime()) {
- event = json[i];
- }
- }
- if (json[i].start.getTime() > now.getTime() && event.start.getTime() > json[i].start.getTime()) {
- event = json[i];
- }
- }
- return event;
- }
-
- /**
- * Retruns next Opening
- * @param room Room Object
- * @returns bestdate Date Object of next opening
- */
- function GetNextOpening(room) {
- var now = new MyDate();
- var day = now.getDay();
- var offset = 0;
- var bestdate;
- for (var a = 0; a < 7; a++) {
- if (room.openingTimes == null) {
- return null;
- }
- var tmp = room.openingTimes[day];
- if (tmp != null) {
- for (var i = 0; i < tmp.length; i++) {
- var openDate = new MyDate();
- openDate.setDate(now.getDate() + offset);
- openDate.setHours(tmp[i].HourOpen);
- openDate.setMinutes(tmp[i].MinutesOpen);
- if (openDate > now) {
- if (!IsOpen(new Date(openDate.getTime() - 60000))) {
- if (bestdate == null || bestdate > openDate) {
- bestdate = openDate;
- }
- }
- }
- }
- }
- offset++;
- day++;
- if (day > 6) {
- day = 0;
- }
- }
- return bestdate;
- }
-
- /**
- * returns next closing time of a given room
- * @param room
- * @returns Date Object of next closing
- */
- function GetNextClosing(room) {
- var now = new MyDate();
- var day = now.getDay();
- var offset = 0;
- var bestdate;
- for (var a = 0; a < 7; a++) {
- //Test
- if (room.openingTimes === null) {
- return null;
- }
- var tmp = room.openingTimes[day];
- if (tmp != null) {
- for (var i = 0; i < tmp.length; i++) {
- var closeDate = new MyDate();
- closeDate.setDate(now.getDate() + offset);
- closeDate.setHours(tmp[i].HourClose);
- closeDate.setMinutes(tmp[i].MinutesClose);
- if (closeDate > now) {
- if (!IsOpen(new Date(closeDate.getTime() + 60000))) {
- if (bestdate == null || bestdate > closeDate) {
- bestdate = closeDate;
- }
- }
- }
- }
- }
- offset++;
- day++;
- if (day > 6) {
- day = 0;
- }
- }
- return bestdate;
- }
-
- /**
- * Updates the Course Text of a child
- * @param id of the child
- * @param idle PC's on
- * @param occupied PC's used
- * @param off PC's that are off
- * @param broken PC's that are broken
- */
- function updateRoomUsage(id, idle, occupied, off, broken) {
- if (idle == 0 && occupied == 0 && off == 0) {
- $('#parent_' + id).parent().hide();
- return;
- }
- $('#parent_' + id).parent().show();
- var total = parseInt(idle) + parseInt(occupied) + parseInt(off) + parseInt(broken);
- $("#pc_Idle_" + id).text(idle).width((idle / total) * 100 + '%');
- $("#pc_Occupied_" + id).text(occupied).width((occupied / total) * 100 + '%');
- $("#pc_Off_" + id).text(off).width((off / total) * 100 + '%');
- $("#pc_Broken_" + id).text(broken).width((broken / total) * 100 + '%');
- }
-
- /**
- * Updates the Course Text of a child
- * @param id of the child
- * @param text Text
- */
- function updateCourseText(id, text) {
- $("#div_course" + id).text(text);
- }
-
- /**
- * Updates the Course time of a child
- * @param id of the child
- * @param time Time value
- */
- function updateCoursTimer(id, time) {
- $("#div_Time_" + id).text(time);
- }
-
- /**
- * generates a Div, used for a child node
- * @param target Div it should be inserted
- * @param id ID of the Object it represents
- * @param name Name of the Object it represents
- * @param outermost if the object is a root node
- * @returns generated div
- */
- function generateChild(target, id, name, outermost) {
-
- var c = "";
- if (outermost) {
- c = "outermost";
- }
-
- var text = "<div class='border " + c + "'>" +
- "<div class='child paperEffect' id='parent_" + id + "'>" +
- "<div class='headerFont'>" + name + "</div>" +
- "<div class='pc-state-wrapper'>" +
- "<div id = 'pc_Occupied_" + id + "' class='pc-occupied'>?</div>" +
- "<div id = 'pc_Idle_" + id + "' class='pc-idle'>?</div>" +
- "<div id = 'pc_Off_" + id + "' class='pc-off'>?</div>" +
- "<div id = 'pc_Broken_" + id + "' class='pc-broken'>?</div>" +
- "</div>" +
- "<div class='aroundCourse'>" +
- "<div id = 'div_course" + id + "'class='courseFont'>?</div>" +
- "<div id = 'div_Time_" + id + "'class='courseFont'></div></div></div></div>";
- var obj = $(target).append(text);
- addRoom(id, name);
- return obj
-
- }
-
- /**
- * generates a Div, used for a parent node
- * @param target Div it should be inserted
- * @param id ID of the Object it represents
- * @param name Name of the Object it represents
- * @param outermost if the object is a root node
- * @returns generated div
- */
- function generateParent(target, id, name, outermost) {
- var c = "";
- if (outermost) {
- c = "outermost";
- }
-
- var text = "<div class='border " + c + "'>" +
- "<div class='parent paperEffect'>" +
- "<div class='headerFont'>" + name + "</div>" +
- "<div id='parent_" + id + "'></div>" +
- "</div></div>";
- return $(target).append(text);
- }
-
- /**
- * returns parameter value from the url
- * @param sParam
- * @returns value for given parameter
- */
- var getUrlParameter = function getUrlParameter(sParam) {
- var sPageURL = decodeURIComponent(window.location.search.substring(1)),
- sURLVariables = sPageURL.split('&'),
- sParameterName,
- i;
-
- for (i = 0; i < sURLVariables.length; i++) {
- sParameterName = sURLVariables[i].split('=');
-
- if (sParameterName[0] === sParam) {
- return sParameterName[1] === undefined ? true : sParameterName[1];
- }
- }
- };
-
-
- /**
- * querys the Calendar data
- * @param ids ID'S of rooms to query as string, for e.g.: "5,17,8" or "5"
- */
- function queryCalendars(ids) {
- var url = "../../../api.php?do=locationinfo&action=calendar&id=" + ids;
-
- // Todo reimplement Frontend methode if needed
- /*
- if(!(room.config.calendarqueryurl === undefined)) {
- url = room.config.calendarqueryurl;
- }
- */
- $.ajax({
- url: url,
- dataType: 'json',
- cache: false,
- timeout: 30000,
- success: function (result) {
- UpdateTimeTables(result);
-
-
- }, error: function () {
-
- }
- });
- }
-
-
- /**
- * used for countdown
- * computes the time difference between 2 Date objects
- * @param a Date Object
- * @param b Date Object
- * @returns time string
- */
- function GetTimeDiferenceAsString(a, b) {
- if (a == null || b == null) {
- return "";
- }
- var milliseconds = a.getTime() - b.getTime();
- var seconds = Math.floor((milliseconds / 1000) % 60);
- milliseconds -= seconds * 1000;
- var minutes = Math.floor((milliseconds / (1000 * 60)) % 60);
- milliseconds -= minutes * 1000 * 60;
- var hours = Math.floor((milliseconds / (1000 * 60 * 60)) % 24);
-
- var days = Math.floor((milliseconds / (1000 * 60 * 60 * 24)) % 31);
- if (seconds < 10) {
- seconds = "0" + seconds;
- }
- if (minutes < 10) {
- minutes = "0" + minutes;
- }
- if (days != 0) {
- // dont show?
- return "";
- }
- return hours + ":" + minutes + ":" + seconds;
- }
- </script>
-</head>
-<body>
-<div id="main"></div>
-</body>
-</html>