pz2.js update
[pazpar2-moved-to-github.git] / www / pz2_js / pz2.js
1 /* prevent execution of more than once */
2 if(typeof window.pz2 == "undefined") {
3 window.undefined = window.undefined;
4
5 var pz2 = function(callbackArr, autoInit, keepAlive) {
6     //for convenience
7     myself = this;
8
9     // at least one callback required
10     if ( !callbackArr )
11         throw new Error("Callback parameters array has to be suplied when instantiating a class");   
12     
13     // function callbacks
14     myself.statCallback = callbackArr.onstat;
15     myself.showCallback = callbackArr.onshow;
16     myself.termlistCallback = callbackArr.onterm;
17     myself.recordCallback = callbackArr.onrecord || null;
18
19     // termlist keys
20     myself.termKeys = callbackArr.termlist || "subject";
21     
22     myself.pz2String = "search.pz2";
23     myself.sessionID = null;
24     myself.initStatusOK = false;
25     myself.pingStatusOK = false;
26     myself.searchStatusOK = false;
27     myself.keepAlive = 50000;
28
29     if ( keepAlive < myself.keepAlive )
30         myself.keepAlive = keepAlive;
31
32     // for sorting
33     myself.currentSort = "relevance";
34     // where are we?
35     myself.currentStart = 0;
36     myself.currentNum = 20;
37
38     //timers
39     myself.statTime = 2000;
40     myself.statTimer = null;
41     myself.termTime = 1000;
42     myself.termTimer = null;
43     myself.showTime = 1000;
44     myself.showTimer = null;
45
46     // error handling
47     $(document).ajaxError( 
48     function (request, settings, exception) {
49         if ( settings.responseXML && settings.responseXML.getElementsByTagName("error")[0].childNodes[0].nodeValue)
50             throw new Error( settings.responseXML.getElementsByTagName("error")[0].childNodes[0].nodeValue);
51     });
52
53     if (autoInit !== false)
54         myself.init(myself.keepAlive);
55 }
56 pz2.prototype = {
57     init: function(keepAlive) {
58         if ( keepAlive < myself.keepAlive ) myself.keepAlive = keepAlive;  
59         $.get( myself.pz2String,
60             { command: "init" },
61             function(data) {
62                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
63                     myself.initStatusOK = true;
64                     myself.sessionID = data.getElementsByTagName("session")[0].childNodes[0].nodeValue;
65                     setTimeout(myself.ping, myself.keepAlive);
66                 }
67             }
68         );
69     },
70     // no need to ping explicitly
71     ping: function() {
72         if( !myself.initStatusOK )
73             return;
74             // session is not initialized code here
75         $.get( myself.pz2String,
76             { command: "ping", session: myself.sessionID },
77             function(data) {
78                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
79                     myself.pingStatusOK = true;
80                     setTimeout("myself.ping()", myself.keepAlive);
81                 }
82                 else
83                     location = "?";
84             }
85         );
86     },
87     search: function(query, num, sort) {
88         clearTimeout(myself.statTimer);
89         clearTimeout(myself.showTimer);
90         clearTimeout(myself.termTimer);
91         if( !myself.initStatusOK )
92             return;
93         $.get( myself.pz2String,
94             { command: "search", session: myself.sessionID, query: query },
95             function(data) {
96                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
97                     myself.searchStatusOK = true;
98                     //piggyback search
99                     myself.show(0, num, sort)
100                     if ( myself.statCallback )
101                         myself.statTimer = setTimeout("myself.stat()", myself.statTime / 2);
102                     if ( myself.termlistCallback )
103                         myself.termTimer = setTimeout("myself.termlist()", myself.termTime / 2);
104                 }
105                 else
106                     location = "?";
107             }
108         );
109     },
110     // callback, not to be called explicitly
111     stat: function(test) {
112         if( !myself.searchStatusOK )
113             return;
114         $.get( myself.pz2String,
115             { command: "stat", session: myself.sessionID },
116             function(data) {
117                 if ( data.getElementsByTagName("stat") ) {
118                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
119                     var stat = {
120                     "activeclients": activeClients,
121                     "hits": Number( data.getElementsByTagName("hits")[0].childNodes[0].nodeValue ),
122                     "records": Number( data.getElementsByTagName("records")[0].childNodes[0].nodeValue ),
123                     "clients": Number( data.getElementsByTagName("clients")[0].childNodes[0].nodeValue ),
124                     "initializing": Number( data.getElementsByTagName("initializing")[0].childNodes[0].nodeValue ),
125                     "searching": Number( data.getElementsByTagName("searching")[0].childNodes[0].nodeValue ),
126                     "presenting": Number( data.getElementsByTagName("presenting")[0].childNodes[0].nodeValue ),
127                     "idle": Number( data.getElementsByTagName("idle")[0].childNodes[0].nodeValue ),
128                     "failed": Number( data.getElementsByTagName("failed")[0].childNodes[0].nodeValue ),
129                     "error": Number( data.getElementsByTagName("error")[0].childNodes[0].nodeValue )
130                     }
131                     myself.statCallback(stat);
132                     if (activeClients > 0)
133                         myself.statTimer = setTimeout("myself.stat()", myself.statTime); 
134                 }
135                 else
136                     myself.statTimer = setTimeout("myself.stat()", myself.statTime / 4)
137                     //location = "?";
138                     // some error handling
139             }
140         );
141     },
142     //callback not to be called explicitly
143     show: function(start, num, sort) {
144         clearTimeout(myself.showTimer);
145         if( !myself.searchStatusOK )
146             return;
147         
148         if( sort !== undefined )
149             myself.currentSort = sort;
150         if( start !== undefined )
151             myself.currentStart = Number( start );
152         if( num !== undefined )
153             myself.currentNum = Number( num );
154         
155         $.get( myself.pz2String,
156             { "command": "show", "session": myself.sessionID, "start": myself.currentStart, "num": myself.currentNum, "sort": myself.currentSort, "block": 1 },
157             function(data) {
158                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
159                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
160                     var show = {
161                     "activeclients": activeClients,
162                     "merged": Number( data.getElementsByTagName("merged")[0].childNodes[0].nodeValue ),
163                     "total": Number( data.getElementsByTagName("total")[0].childNodes[0].nodeValue ),
164                     "start": Number( data.getElementsByTagName("start")[0].childNodes[0].nodeValue ),
165                     "num": Number( data.getElementsByTagName("num")[0].childNodes[0].nodeValue ),
166                     "hits": []
167                     }
168
169                     var hits = data.getElementsByTagName("hit");
170                     var hit = new Array();
171                     for (i = 0; i < hits.length; i++) {
172                         show.hits[i] = new Array();
173                         for ( j = 0; j < hits[i].childNodes.length; j++) {
174                             if ( hits[i].childNodes[j].nodeType == Node.ELEMENT_NODE ) {
175                                 var nodeName = hits[i].childNodes[j].nodeName;
176                                 var nodeText = hits[i].childNodes[j].firstChild.nodeValue;
177                                 show.hits[i][nodeName] = nodeText;
178                             }
179                         }
180                     }
181
182                     //TODO include records
183                     myself.showCallback(show);
184                     if (activeClients > 0)
185                         myself.showTimer = setTimeout("myself.show()", myself.showTime);
186                 }
187                 else
188                     myself.showTimer = setTimeout("myself.show()", myself.showTime / 4);
189                     // location = "?";
190                     // some error handling
191             }
192         );
193     },
194     record: function(id) {
195         if( !myself.searchStatusOK )
196             return;
197         $.get( myself.pz2String,
198             { "command": "record", "session": myself.sessionID, "id": id },
199             function(data) {
200                 var recordNode;
201                 var record = new Array();
202                 if ( recordNode = data.getElementsByTagName("record")[0] ) {
203                     for ( i = 0; i < recordNode.childNodes.length; i++) {
204                         if ( recordNode.childNodes[i].nodeType == Node.ELEMENT_NODE ) {
205                             var nodeName = recordNode.childNodes[i].nodeName;
206                             var nodeText = recordNode.childNodes[i].firstChild.nodeValue;
207                             record[nodeName] = nodeText;
208                         }
209                     }
210                     myself.recordCallback(record);
211                 }
212                 else
213                     alert("");
214                     //location = "?";
215                     // some error handling
216             }
217         );
218         
219     },
220     termlist: function() {
221         if( !myself.searchStatusOK )
222             return;
223         $.get( myself.pz2String,
224             { "command": "termlist", "session": myself.sessionID, "name": myself.termKeys },
225             function(data) {
226                 if ( data.getElementsByTagName("termlist") ) {
227                     var termList = { "activeclients": Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue ) }
228                     var termLists = data.getElementsByTagName("list");
229                     //for each termlist
230                     for (i = 0; i < termLists.length; i++) {
231                         var listName = termLists[i].getAttribute('name');
232                         termList[listName] = new Array();
233                         var terms = termLists[i].getElementsByTagName('term');
234                         //for each term in the list
235                         for (j = 0; j < terms.length; j++) { 
236                             var term = {
237                                 "name": terms[j].getElementsByTagName("name")[0].childNodes[0].nodeValue,
238                                 "freq": terms[j].getElementsByTagName("frequency")[0].childNodes[0].nodeValue,
239                             }
240                             termList[listName][j] = term;
241                         }
242                     }
243                     myself.termlistCallback(termList);
244                     if (termList["activeclients"] > 0)
245                         myself.termTimer = setTimeout("myself.termlist()", myself.termTime); 
246                 }
247                 else
248                     myself.termTimer = setTimeout("myself.termlist()", myself.termTime / 4); 
249                     //location = "?";
250                     // some error handling
251             }
252         );
253
254     },
255     bytarget: function() {
256     }
257 };
258 }