very early stage od pz2.js lib
[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     // 
7     if ( callbackArr == null )
8         return null;
9
10     //for convenience
11     myself = this;
12     
13     myself.pz2String = "search.pz2";
14     myself.sessionID;
15     myself.initStatus = 0;
16     myself.pingStatus = 0;
17     myself.keepAlive = 50000;
18
19     if ( keepAlive < myself.keepAlive )
20         myself.keepAlive = keepAlive;
21
22     // for sorting
23     myself.currentSort = "relevance";
24     myself.sortKeywords = [ "relevance", "title", "author" ];
25     
26     // function callbacks
27     myself.statCallback = callbackArr.onstat;
28     myself.showCallback = callbackArr.onshow;
29     myself.termlistCallback = callbackArr.onterm;
30
31     //timers
32     myself.statTime = 2000;
33     myself.statTimer;
34     myself.termTime = 1000;
35     myself.termTimer;
36     myself.showTime = 1000;
37     myself.showTimer;
38
39     if (autoInit == true)
40         myself.init(myself.keepAlive);
41 }
42 pz2.prototype = {
43     init: function(keepAlive) {
44         if ( keepAlive < myself.keepAlive ) myself.keepAlive = keepAlive;  
45         $.get( myself.pz2String,
46             { command: "init" },
47             function(data) {
48                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" )
49                     myself.initStatus = 1;
50                 myself.sessionID = data.getElementsByTagName("session")[0].childNodes[0].nodeValue;
51                 setTimeout(myself.ping, myself.keepAlive);
52             }
53         );
54     },
55     // no need to ping explicitly
56     ping: function() {
57         if( !myself.initStatus )
58             return;
59             // session is not initialized code here
60         $.get( myself.pz2String,
61             { command: "ping", session: myself.sessionID },
62             function(data) {
63                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
64                     myself.pingStatus = 1;
65                     setTimeout(myself.ping, myself.keepAlive);
66                 }
67                 else
68                     location = "?";
69             }
70         );
71     },
72     search: function(query, num, sort) {
73         clearTimeout(myself.statTimer);
74         clearTimeout(myself.showTimer);
75         clearTimeout(myself.termTimer);
76         if( !myself.initStatus )
77             return;
78         $.get( myself.pz2String,
79             { command: "search", session: myself.sessionID, query: query },
80             function(data) {
81                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
82                     myself.searchStatus = 1;
83                     //piggyback search
84                     myself.show(0, num, sort)
85                     if ( myself.statCallback )
86                         myself.statTimer = setTimeout(myself.stat, myself.statTime / 2);
87                     if ( myself.termlistCallback )
88                         myself.termTimer = setTimeout(myself.termlist, myself.termTime / 2);
89                 }
90                 else
91                     location = "?";
92             }
93         );
94     },
95     // callback, not to be called explicitly
96     stat: function() {
97         if( !myself.searchStatus )
98             return;
99         $.get( myself.pz2String,
100             { command: "stat", session: myself.sessionID },
101             function(data) {
102                 if ( data.getElementsByTagName("stat") ) {
103                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
104                     var stat = {
105                     "activeclients": activeClients,
106                     "hits": Number( data.getElementsByTagName("hits")[0].childNodes[0].nodeValue ),
107                     "records": Number( data.getElementsByTagName("records")[0].childNodes[0].nodeValue ),
108                     "clients": Number( data.getElementsByTagName("clients")[0].childNodes[0].nodeValue ),
109                     "initializing": Number( data.getElementsByTagName("initializing")[0].childNodes[0].nodeValue ),
110                     "searching": Number( data.getElementsByTagName("searching")[0].childNodes[0].nodeValue ),
111                     "presenting": Number( data.getElementsByTagName("presenting")[0].childNodes[0].nodeValue ),
112                     "idle": Number( data.getElementsByTagName("idle")[0].childNodes[0].nodeValue ),
113                     "failed": Number( data.getElementsByTagName("failed")[0].childNodes[0].nodeValue ),
114                     "error": Number( data.getElementsByTagName("error")[0].childNodes[0].nodeValue )
115                     }
116                     myself.statCallback(stat);
117                     if (activeClients > 0)
118                         myself.statTimer = setTimeout(myself.stat, myself.statTime); 
119                 }
120                 else
121                     myself.statTimer = setTimeout(myself.stat, myself.statTime / 4)
122                     //location = "?";
123                     // some error handling
124             }
125         );
126     },
127     //callback not to be called explicitly
128     show: function(start, num, sort) {
129         clearTimeout(myself.showTimer);
130         if( !myself.searchStatus )
131             return;
132         if ( myself.sortKeywords.some( function(element, index, arr) { if (element == sort) return true; else return false; } ) )
133             myself.currentSort = sort;
134         $.get( myself.pz2String,
135             { "command": "show", "session": myself.sessionID, "start": start, "num": num, "sort": myself.currentSort, "block": 1 },
136             function(data) {
137                 if ( data.getElementsByTagName("status")[0].childNodes[0].nodeValue == "OK" ) {
138                     var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
139                     var show = {
140                     "activeclients": activeClients,
141                     "merged": Number( data.getElementsByTagName("merged")[0].childNodes[0].nodeValue ),
142                     "total": Number( data.getElementsByTagName("total")[0].childNodes[0].nodeValue ),
143                     "start": Number( data.getElementsByTagName("start")[0].childNodes[0].nodeValue ),
144                     "num": Number( data.getElementsByTagName("num")[0].childNodes[0].nodeValue )
145                     }
146                     //TODO include records
147                     myself.showCallback(show);
148                     if (activeClients > 0)
149                         myself.showTimer = setTimeout("myself.show(" + start + "," + num + "," + sort + ")", myself.showTime);
150                 }
151                 else
152                     myself.showTimer = setTimeout("myself.show(" + start + "," + num + "," + sort + ")", myself.showTime / 4);
153                     // location = "?";
154                     // some error handling
155             }
156         );
157     },
158     record: function(id) {
159     },
160     termlist: function(name) {
161         if( !myself.searchStatus )
162             return;
163         $.get( myself.pz2String,
164             { "command": "termlist", "session": myself.sessionID, "name": "author" },
165             function(data) {
166                 if ( data.getElementsByTagName("termlist") ) {
167                     var termList = { "activeclients": Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue ) }
168                     var termLists = data.getElementsByTagName("list");
169                     //for each termlist
170                     for (i = 0; i < termLists.length; i++) {
171                         var listName = termLists[i].getAttribute('name');
172                         termList[listName] = new Array();
173                         var terms = termLists[i].getElementsByTagName('term');
174                         //for each term in the list
175                         for (j = 0; j < terms.length; j++) { 
176                             var term = {
177                                 "name": terms[j].getElementsByTagName("name")[0].childNodes[0].nodeValue,
178                                 "freq": terms[j].getElementsByTagName("frequency")[0].childNodes[0].nodeValue,
179                             }
180                             termList[listName][j] = term;
181                         }
182                     }
183                     myself.termlistCallback(termList);
184                     if (termList["activeclients"] > 0)
185                         myself.termTimer = setTimeout("myself.termlist(" + name + ")" , myself.termTime); 
186                 }
187                 else
188                     myself.termTimer = setTimeout("myself.termlist(" + name + ")" , myself.termTime / 4); 
189                     //location = "?";
190                     // some error handling
191             }
192         );
193
194     },
195     bytarget: function() {
196     }
197 };
198 }