Refactors state management
[mkjsf-moved-to-github.git] / src / META-INF / resources / pz2utils / fieldlisteners.js
1   var renderTargetsReqVar;\r
2   var renderOnRecordTargetsReqVar;\r
3     \r
4   function renderTargets(doRefresh)\r
5   {\r
6         //console.log('rendering ' + renderWhileActiveclients);\r
7         var sourcecomp = document.getElementById("pz2watch:activeclientsField");\r
8     jsf.ajax.request(sourcecomp, null,{render: renderWhileActiveclients + " pz2watch:errorMessages"});\r
9     if (doRefresh) {\r
10                 //console.log('Will do another ajax request after a timeout in order to render: pz2watch:activeclientsField');  \r
11             renderTargetsReqVar=setTimeout(\r
12              function() {              \r
13                //console.log('Making request for pz2watch:activeclientsField');\r
14                jsf.ajax.request(sourcecomp, null,{render: "pz2watch:activeclientsField"});       \r
15              }\r
16              ,500);\r
17     } else {\r
18         //console.log("No further updates from server requested");\r
19     }\r
20   }\r
21   \r
22   function renderOnRecordTargets(doRefresh)\r
23   {\r
24         console.log('rendering ' + renderWhileActiveclientsRecord);\r
25         var sourcecomp = document.getElementById("pz2watch:activeclientsFieldRecord");\r
26     jsf.ajax.request(sourcecomp, null,{render: renderWhileActiveclientsRecord});\r
27     if (doRefresh) {\r
28                 console.log('Will do another ajax request after a timeout in order to render: pz2watch:activeclientsFieldRecord');  \r
29             renderOnRecordTargetsReqVar=setTimeout(\r
30              function() {              \r
31                console.log('Making request for pz2watch:activeclientsFieldRecord');\r
32                jsf.ajax.request(sourcecomp, null,{render: "pz2watch:activeclientsFieldRecord"});       \r
33              }\r
34              ,1000);\r
35     } else {\r
36         //console.log("No further updates from server requested");\r
37     }\r
38   }\r
39 \r
40 \r
41   function windowlocationhashListener () {\r
42           if (trackHistory) {\r
43               //console.log("browser hash update detected");\r
44               var stateKey = document.getElementById("pz2watch:windowlocationhash");\r
45               if (window.location.hash != stateKey.value) {\r
46                 //console.log("updating stateKey with new browser hash: " + window.location.hash);\r
47                 stateKey.value = window.location.hash;\r
48                 if (! stateKey.value) window.location.hash = '#initial';\r
49                 stateKey.onchange();\r
50               } else {\r
51                 //console.log("State hash already has the value of the new browser hash - not updating state hash");\r
52               }           \r
53           }       \r
54   }      \r
55 \r
56   function fieldUpdateListener (data) {\r
57           if (data.status === "success") {\r
58                 var updates = data.responseXML.getElementsByTagName("update");\r
59                 for (var i=0, max=updates.length; i<max; i++) {\r
60                         var lsnri = fieldListeners.getListener(updates[i].getAttribute("id"));\r
61                         if (lsnri) {\r
62                                 lsnri.invoke(updates[i]);\r
63                         }\r
64                 }\r
65           }\r
66   }\r
67         \r
68   var Pz2listeners = function () {\r
69         var lsnrs = {};\r
70         this.addListener = function (key, lsnr) {\r
71                 lsnrs[key] =lsnr;\r
72         };\r
73         this.getListener = function (key) {\r
74                 return lsnrs[key];\r
75         };\r
76   };\r
77 \r
78   var fieldListeners = new Pz2listeners();\r
79 \r
80   var StateListener = function () {\r
81         this.invoke = function (field) {\r
82       var stateKeyDoc = StringtoXML(field.textContent || field.text);\r
83       var stateKeyValue = stateKeyDoc.childNodes[0].getAttribute("value");\r
84       //console.log('Application hash update detected. New value: ' + stateKeyValue);\r
85       if (stateKeyValue !== window.location.hash) {\r
86         window.location.hash = stateKeyValue;\r
87         //console.log("Browsers hash updated accordingly.");\r
88       } else {\r
89         //console.log("Browsers hash already has the value of the state hash. Not updating browser hash."); \r
90       }\r
91 \r
92         };\r
93   };\r
94   \r
95   var ActiveclientsListener = function () {\r
96     this.invoke = function (field) {\r
97       var updateDoc = StringtoXML(field.textContent || field.text);\r
98       var activeClientsValue = (updateDoc.childNodes[0].textContent || updateDoc.childNodes[0].text);\r
99       //console.log('Activeclients response detected: ' + activeClientsValue);\r
100       clearTimeout(renderTargetsReqVar);\r
101       if (activeClientsValue > '0') {\r
102         renderTargets(true);\r
103       } else {\r
104         renderTargets(false);\r
105       }\r
106         };\r
107   };\r
108   \r
109   var ActiveclientsRecordListener = function () {\r
110             this.invoke = function (field) {\r
111               var updateDoc = StringtoXML(field.textContent || field.text);\r
112               var activeClientsRecordValue = (updateDoc.childNodes[0].textContent || updateDoc.childNodes[0].text);\r
113               console.log('Activeclients response for record detected: ' + activeClientsRecordValue);\r
114               clearTimeout(renderOnRecordTargetsReqVar);\r
115               if (activeClientsRecordValue > '0') {\r
116                 renderOnRecordTargets(true);\r
117               } else {\r
118                 console.log('Active clients is 0, final rendering');\r
119                 renderOnRecordTargets(false);\r
120               }\r
121                 };\r
122           };\r
123 \r
124     \r
125   jsf.ajax.addOnEvent(fieldUpdateListener);\r
126   \r
127   function StringtoXML(text){\r
128                 var doc;\r
129             if (window.ActiveXObject){\r
130               doc=new ActiveXObject('Microsoft.XMLDOM');\r
131               doc.async=false;\r
132               doc.loadXML(text);\r
133             } else {\r
134               var parser=new DOMParser();\r
135               doc=parser.parseFromString(text,'text/xml');\r
136             }\r
137             return doc;\r
138   }\r
139 \r
140   var setUpListeners = function () {\r
141     //console.log("Starts tracking activeclientsField");\r
142     fieldListeners.addListener("pz2watch:activeclientsField", new ActiveclientsListener());\r
143     fieldListeners.addListener("pz2watch:activeclientsFieldRecord", new ActiveclientsRecordListener());\r
144     if (trackHistory) {\r
145         //console.log("Starts tracking windowlocationhash field");\r
146         fieldListeners.addListener("pz2watch:windowlocationhash", new StateListener());\r
147         //console.log("Setting listener for browser onhashchange");\r
148         window.onload = window.onhashchange = windowlocationhashListener;\r
149     }\r
150   };