Comments added
[knw_133/.git] / js / main.js
1 /*********************************
2 * Kalender, quick&dirty solution *
3 *********************************/
4
5 model=window.model||{};
6
7 var lastxhr;
8
9 // Funktion zum Laden von Inhalten
10 function load(path,onload,onerror){
11   onerror = onerror||function(){};
12   var xhr = new XMLHttpRequest();
13   xhr.onload = function(){
14     if( this.status != 200 ){
15       onerror( this.responseText, this.status );
16     }else{
17       onload( this.responseText );
18     }
19   };
20   function errorHandler( e ){
21     onerror( (e||e.error).stack );
22   }
23   xhr.onerror = errorHandler;
24   try {
25     xhr.open("GET",path,true);
26     xhr.send();
27   } catch( e ) {
28     errorHandler(e);
29   }
30   if( lastxhr && lastxhr.readyState != 4 && lastxhr.abord )
31     lastxhr.abord();
32   lastxhr = xhr;
33 }
34
35 var jobId = null;
36 var classId = null;
37 var date = new Date();
38
39 /*
40 * Funktionen zum Prototyp des Konstruktors hinzufügen
41 * Diese können bei Datumsobjekten aufgerufen werden
42 * weil new Date().__proto__ === Date.prototype
43 * und JS bei x.y auch nach x.__proto__.y und x.__proto__.__proto__.y etc. sucht.
44 */
45 // Tag des Jahres ermitteln
46 Date.prototype.getDayOfYear = function(){
47   var start = new Date(this.getFullYear(), 0, 0);
48   var diff = this - start;
49   var oneDay = 1000 * 60 * 60 * 24;
50   var day = Math.floor(diff / oneDay);
51   return day;
52 };
53
54 // Eine woche zum Datum hinzufügen
55 Date.prototype.nextWeek = function(){
56   this.setDate(this.getDate()+7);
57 }
58
59 // Eine woche vom Datum entfernen
60 Date.prototype.lastWeek = function(){
61   this.setDate(this.getDate()-7);
62 }
63
64 /*
65 * Lade und Updatefunktionen
66 */
67
68 // Datum auf Seite aktualisieren
69 function updateDate(){
70   model.week = Math.floor(date.getDayOfYear()/7) + '-' + date.getFullYear();
71   loadCalendar();
72 }
73
74 // Funktion für nächste Woche Knopf
75 model.nextWeek = function(){
76   date.nextWeek();
77   updateDate();
78 }
79
80 // Funktion für letzte Woche Knopf
81 model.lastWeek = function(){
82   date.lastWeek();
83   updateDate();
84 }
85
86 // Klassen laden
87 function loadClasses(){
88   jobId = this.value;
89   if(window.localStorage)
90     localStorage.jobId = jobId;
91   classId = null;
92   model.classes = null;
93   model.displayInfo="none";
94   model.calendar = null;
95   load(
96     "http://home.gibm.ch/interfaces/133/klassen.php?beruf_id=" + jobId,
97     function( res ){
98       model.classes = {
99         list: JSON.parse( res ),
100         loadCalendar: loadCalendar
101       };
102     },
103     console.error
104   );
105 }
106
107 // Kalender laden
108 function loadCalendar(){
109   if( "value" in this )
110     classId = this.value;
111   if( classId === null || jobId === null )
112     return;
113   model.calendar = null;
114   model.displayInfo="none";
115   load(
116     "http://home.gibm.ch/interfaces/133/tafel.php?klasse_id=" + classId + "&woche=" + model.week,
117     function( res ){
118       var events = JSON.parse( res );
119       if( events.length ){
120         model.calendar = {
121           events: events
122         };
123         model.displayInfo="none";
124       }else{
125         model.displayInfo="block"; // Keine Termine meldung anzeigen
126       }
127     },
128     console.error
129   );
130 }
131
132 // Datum aktualisieren
133 updateDate();
134
135 model.displayInfo="none";
136
137 // Berufe laden
138 model.jobs = null;
139 load("http://home.gibm.ch/interfaces/133/berufe.php", function( res ){
140   jobId = null;
141   setTimeout(function(){
142     if(window.jobList&&window.localStorage&&localStorage.jobId){
143       jobList.value = localStorage.jobId;
144       jobList.onchange.call(jobList);
145     }
146   },33);
147   model.displayInfo="none";
148   model.jobs = {
149     list: JSON.parse( res ),
150     loadClasses: loadClasses
151   };
152 },console.error);