summaryrefslogblamecommitdiffstats
path: root/modules-available/locationinfo/frontend/panel.html
blob: eb8c2fd87a6e3c10b694e8ac15c0b76f4675658d (plain) (tree)
1
2
3
4
5
6
7
8
9




                                                                                      
 
                               

                                                                                    
                                                    
                 








                                                                                    
                                       





                                                                                    


                                     



                                             

                 






                                  
                        
                                             
                                     
                 




                                             
                            

                                         

                                                                                    
                                         

                            
                                         


                                                                                    

                                               




                                                                    

                                      
                                           
                                         
                                         
                                               


                 
 
























                                                   


                                                                                                               






                                           




                                       
                                        

                                    
                                                         
                                                             

 
                                               

                                              
                               

                   

                                                        
                                                                                                                   
                                                       
 
                                                         
                          
                           
 

                 




























































































                                                                                          








                                                                         








                                                                             
 

                 
 
                 
 








                                                                 
                                                     
                                                                                          
                                
                                                                                           




                                                                                             
                                   


                 
           















                                                                                        










                                                                                                     
                                 


                          
                 
 

















                                                                          

















                                                                        
 

                                


                                             
                                                                                                                                                                   
                                                                                                     
                                                                                
                     
                                                                                                                                                            
                                                                                             

                                                                            

                     
                                              






                                                      
                                                             

                                                     
                        

                 

 










                                                                                                                                            
 























                                                                                                                              



                                               
                                        



                                                     
 

                                                    

                                                                      
                                                                                                       

                                                                 
                                                                                                       


                                                                 
                         


                                                                        
                         
 
                 
 



                                                                          


                                                   
                                                                                                                    


                         





                                                                  
                                                  
                                    







                                                   


                                         
                                                       
                                                                 

                                                                          


                                                                                    
                                                                                  

                                                 
                                                          

                                 
 









                                                                                              
                                       








                                                                      




                                                  
                                                    
                                               
                                                                                                               
 


                                                           
 













                                                                                                       
                                                                                                                                 
















                                                                                                                    




                                        


                                                        


                                                                   


















                                                                          




                                                             
                                             


                               








                                                                                                                       
                                                                                     








                                                                                                                                 
 




                                                        








                                                                
                                                                 























                                                                                                              




                                                    





                                                     



                                                               
























                                                                                                               







                                                     






                                                                




                                             


                                                       





                                                     


                                                      


















                                                                  
 



                                
 
                                                                   
                                                                         

                                                                          



                                                                                                      
                                          
                                                             
                                                                                         
                                                                                                         
                                                         
                            
















                                                                   
 
                                                    
                                                            


                                                                  
                                                      
                 
 



                                         
















                                                                               




                                               




                                                                                               
 







                                                                                                          




















                                                                                   









                                             






                                                              





















                                                                                           

                                                                     

                 
               
                                
                             

       
<!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;
		}
		.main{
			background-color: lightgrey;

		}

		.child{
			background-color: white;
			display: inline-block;
			font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
			padding: 1vmin;
			float:left;
		}
		.parent{
			background-color: white;
			display: inline-block;
			font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
			padding: 5px;
			float:left;

		}
		.childWithBorder{
			display: inline-flex;
			padding: 0.4vmin;

		}
		.outermost{


		}
		.row{
			float:left
		}
		.border{
			display: inline-flex;
			padding: 5px;
		}
		.borderout{
			display: inline-flex;
			padding: 0.4vmin;
		}

		.courseFont{
			padding: 0.5vmin;
			font-size: 2vmin;
			font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
			font-weight: bold;
			overflow: hidden;
		}
		.headerFont{
			font-size: 4vmin;
			font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
			font-weight: bold;
			border: 0px;
			border-bottom: 0.2vmin;
			margin-bottom: 1vmin;
			border-color: grey;
			border-style:solid;

		}
		.divPcOn, .divPcPcUsed, .divPcPcOff, .divPcPcDefect{
			width: 4vmin;
			height: 4vmin;
			text-align: center;
			font-size: 3vmin;
			font-weight: 800;
			border-radius: 0.4vmin;

		}


		.divPcOn {
			background-color: green;
			text-align: center;
		}
		.divPcPcUsed{

			background-color: red;
		}
		.divPcPcOff{
			background-color: darkgrey;
		}
		.divPcPcDefect{
			background-color: black;
			color: white;
		}

		.divAroundPcStates{
			display: flex;
			justify-content: flex-end;

		}
		.paperEffect
		{
			margin: 0 auto;
			background-color: #fff;
			-webkit-box-shadow: 0 0 0.2vmin rgba(0, 0, 0, 0.4), inset 0 0 1vmin rgba(0, 0, 0, 0.1);
			-moz-box-shadow: 0 0 0.2vmin rgba(0, 0, 0, 0.4), inset 0 0 1vmin rgba(0, 0, 0, 0.1);
			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 = "";
		var lastPcUpdate;
		var lastTimeTableUpdate;

		// Todo change these
		var pcStateUpdateTime = 60; // in seconds
		var TimeTableUpdateTime = 60*30; //in seconds


		$(document).ready(function () {
			//temp
			SetUpDate(new Date());
			init();
		});

		function init() {
			var ids = getUrlParameter("id");
			$.getJSON("../../../api.php?do=locationinfo&action=roomtree&id=" + ids, function (result) {
				generateLayout(result);

				setInterval(update,1000);
                arrange();
			});

		}

		/**
		 * Main Fuction for aranging the divs
		 */
		function arrange() {
		    var height = $( window ).height();
            var width = $( window ).width();
       	    var childs = $(".childWithBorder");
			var parents = [];
			for(var i = 0; i < childs.length;i++){
              	var parent= $(childs[i]).parent();
              	if($.inArray(parent[0],parents)==-1){
			       parents.push(parent[0]);
				}
			}
			for (var i = 0; i < parents.length;i++) {
			    childs = $(parents[i]).children();

               if(checkForLineBreak(parents[i],childs) > 0){
                   makeItFit(parents[i],childs,childs.length/2);
			   }

          	}

        }
		/**
		 * rekursive calls itselfs and trys to find the best number off childs
		 * which should be side by side.
         * @param parent Parent div
         * @param childs Child divs
         * @param breakAfter number after the divs should go in the next row
		 */
        function makeItFit(parent,childs,breakAfter) {
            breakAfter= Math.abs(breakAfter);
            var width =  checkIfFit(parent,childs,breakAfter)
			if(width > 0){
				$(parent).width(width+20);
			} else {
                makeItFit(parent, childs, breakAfter-1);
            }
        }

		/**
		 * checks if a given number off divs(side by side) would fit on the screen
         * @param parent Parent div
         * @param childs Child divs
		 * @param breakAfter number after the divs should go in the next row
		 * @returns -1 if it wouldn't fit else the width the div should have
		 */
        function checkIfFit(parent,childs,breakAfter) {
            var parentWidth = $(parent).width();
            var maxWidth = 0;
            var curWidth = 0;
            var t = 0;
            for (var i = 0; i < childs.length;i++) {
                var childWidth = $(childs[i]).width();
                if((curWidth + childWidth > parentWidth && breakAfter > 1)){
                    return -1;
				}
                curWidth += childWidth;
                t++;
				if(t == breakAfter){
                    maxWidth =Math.max(curWidth,maxWidth);
                    curWidth = 0;
                    t=0;
				}

            }
            return maxWidth
        }

        /**
		 * return the number of Linebreaks the divs would make
		 * @param parent Parent div
		 * @param childs Child divs
		 * @returns the number of Linebreaks the divs would make
		 */
        function checkForLineBreak (parent,childs){
		    var linebreaks = 0;
			var curWidth = 0;
            var parentWidth = $(parent).width();
            for (var i = 0; i < childs.length;i++) {
                var childWidth = $(childs[i]).width();
            	if(curWidth + childWidth < parentWidth ){
                    curWidth += childWidth;
				} else {
                    linebreaks++;

                    curWidth = childWidth;
				}
            }
            return linebreaks;
		}

		function SetUpDate(d) {
			startdate = d.getTime()-new Date().getTime();
		}

		function MyDate() {
			return new Date(startdate +new Date().getTime());
		}

		function generateLayout(json) {
            var ids = getUrlParameter("id");
            ids = ids.split(',');
            for(var t = 0; t< ids.length;t++)
            {

                for (var i = 0; i < json.length; i++) {
                    if(ids[t]== json[i].id) {
                        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.childs.length == 0) {
				obj  =generateChild(myParent,json.id,json.name,outermost);
			} else {
				obj = generateParent(myParent,json.id,json.name,outermost);
				for (var i = 0; i < json.childs.length;i++){

					generateObject(json.childs[i],$("#parent_"+json.id));
				}
			}
			return obj;

		}

        /**
         * Retruns the number of childs of the current node (inklusive childs of childs)
         * @param json Json of the room tree
         * @returns number of childs of the current node
         */
        function getAllchildsRekusivly(json){
            var childs = 0;
            for (var i = 0; i < json.childs.length;i++){
                childs++;
                if(json.childs[i].childs.length != 0){
                    childs = getAllchildsRekusivly(json.childs[i]);
                }
            }
            return childs;
		}

        /**
         * Retruns the number of leaveschilds of the current node (inklusive leaves childs of childs)
         * @param json Json of the room tree
         * @returns number of leaveschilds of the current node
         */
		function getChildsRekusivly(json){
		    var childs = 0;
            for (var i = 0; i < json.childs.length;i++){
                if(json.childs[i].childs.length == 0){
                    childs++;
                } else {
                    childs = getChildsRekusivly(json.childs[i]);
				}

            }
            return childs;
		}

		/**
		 * Retruns the number of leaves childs of the current node
		 * @param json Json of the room tree
		 * @returns number of leaveschilds of the current node
		 */
		function getChilds(json) {

		    var childs = 0;
            for (var i = 0; i < json.childs.length;i++){
                if(json.childs[i].childs.length == 0){
                    childs++;
				}
            }
            return childs;
        }



        /**
         * 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;
        }



        var timeSteps = 10;
		function update() {

            if (timeSteps > 9) {
                timeSteps = 0;
                var calendarUpdateIds = "";
                var rommUpdateIds = "";
                for (var property in rooms) {
                    if (rooms[property].lastCalendarUpdate == null || rooms[property].lastCalendarUpdate + rooms[property].config.calupdates< MyDate().getTime()) {
                        calendarUpdateIds = addIdToUpdateList(calendarUpdateIds, rooms[property].id);
                        rooms[property].lastCalendarUpdate = MyDate().getTime();
                    }
                    if (rooms[property].lastRoomUpdate == null || rooms[property].lastRoomUpdate + rooms[property].config.roomupdate < MyDate().getTime()) {
                        rommUpdateIds = addIdToUpdateList(rommUpdateIds, rooms[property].id);
                        rooms[property].lastRoomUpdate = MyDate().getTime();

                    }
                }
                if (calendarUpdateIds != "") {
                    queryCalendars(calendarUpdateIds);
                }
                if (rommUpdateIds != "") {
                    queryRooms(rommUpdateIds);
                }
            }
            // TODO
				for (var property in rooms) {
                    upDateRoomState(rooms[property]);
                }
            timeSteps++;

		}


		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){
				console.log("error");
				return;
			}

			var state = room.getState();

			if(state.state == "ClaendarEvent") {
				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,config) {
			var room = {
				id: id,
				name: name,
				timetable: null,
				currentEvent: null,
				nextEventEnd: null,
				timeTilFree: null,
				state: null,
				openingTimes: null,
                config: config,
                lastCalendarUpdate: null,
                lastRoomUpdate: null,
				getState: function () {
					if (this.state == null) {
						ComputeCurrentState(this);
						return this.state;
					}
					if (this.state.end != "") {
						if (this.state.end < new MyDate()) {
							ComputeCurrentState(this);
						}
					}
					return this.state;
				}


			};
			if( room.config.calupdate === undefined || room.config.calupdate < 1){
                room.config.calupdate = 1;
            }
            room.config.calupdate = room.config.calupdate * 60 * 1000;
            if( room.config.roomupdate === undefined || room.config.roomupdate < 1){
                room.config.roomupdate = 1;
            }
            room.config.roomupdate = room.config.roomupdate  * 1000;

			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 (!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: "ClaendarEvent", 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 on PC's on
		 * @param used PC's used
		 * @param off PC's that are off
		 * @param defect PC's that are defect
         */
		function updateRoomUsage(id,on,used,off,defect){
			$("#div_pc_On_"+id).text(on);
			$("#div_pc_Used_"+id).text(used);
			$("#div_pc_Off_"+id).text(off);
			$("#div_pc_Defect_"+id).text(defect);
		}

        /**
         * 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 new Div
         * @param target Div it should be inserted
         * @returns generated div
		 */
        function generateRow(target){
			var text="<div class='row' ></div>";
            return $(target).append(text);
		}

        /**
         * 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='childWithBorder'>"  +
				"<div class='child paperEffect "+c+"'>" +
				"<div class='headerFont'>"+name+"</div>" +
				"<div class='divAroundPcStates'>" +
				"<div id = 'div_pc_On_"+id+"'  class='divPcOn '>"+0+"</div>" +
				"<div id = 'div_pc_Used_"+id+"' class='divPcPcUsed'>"+0+"</div>" +
				"<div id = 'div_pc_Off_"+id+"' class='divPcPcOff'>"+0+"</div>" +
				"<div id = 'div_pc_Defect_"+id+"' class='divPcPcDefect'>"+0+"</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);
            getConfig((id));
            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);
		}

        /**
         * Downloads the config of a room
         * @param id ID of the room
         */
        function getConfig(id) {
            $.ajax({
                url: "../../../api.php?do=locationinfo&action=config&id=" + id,
                dataType: 'json',
                cache: false,
                timeout: 30000,
                success: function (result) {
                        if (result.room != null) {
                            delete result.time;
                            room = addRoom(id, result.room, result);
                        }
                }, error: function () {
                    //Todo Error handling:
                }
            })
        }

        /**
         * 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 class="">
	<h1>Raum Übersicht</h1>
	<div id="main"></div>
</body>
</html>