/*
-** $Id: pz2.js,v 1.14 2007-05-16 07:53:32 jakub Exp $
+** $Id: pz2.js,v 1.45 2007-07-10 10:17:17 adam Exp $
** pz2.js - pazpar2's javascript client library.
*/
//supported pazpar2's protocol version
__myself.suppProtoVer = '1';
- __myself.pz2String = "search.pz2";
+ __myself.pz2String = paramArray.pazpar2path || "search.pz2";
__myself.stylesheet = paramArray.detailstylesheet || null;
-
+ __myself.useSessions = true;
+ if (paramArray.usesessions != undefined) {
+ __myself.useSessions = paramArray.usesessions;
+ }
+
//load stylesheet if required in async mode
if( __myself.stylesheet ) {
var request = new pzHttpRequest( __myself.stylesheet );
- request.get(
- {},
- function ( doc ) {
- __myself.xslDoc = doc;
- }
- );
+ request.get( {}, function ( doc ) { __myself.xslDoc = doc; } );
}
-
+
// at least one callback required
if ( !paramArray )
throw new Error("An array with parameters has to be suplied when instantiating a class");
__myself.currQuery = null;
//timers
- __myself.statTime = paramArray.stattime || 2000;
+ __myself.statTime = paramArray.stattime || 1000;
__myself.statTimer = null;
__myself.termTime = paramArray.termtime || 1000;
__myself.termTimer = null;
__myself.bytargetTime = paramArray.bytargettime || 1000;
__myself.bytargetTimer = null;
- //useful?
+ // counters for each command and applied delay
__myself.dumpFactor = 500;
__myself.showCounter = 0;
__myself.termCounter = 0;
+ __myself.statCounter = 0;
+ __myself.bytargetCounter = 0;
// active clients, updated by stat and show
// might be an issue since bytarget will poll accordingly
if (paramArray.autoInit !== false)
__myself.init();
};
-pz2.prototype = {
+pz2.prototype =
+{
+ stop: function ()
+ {
+ clearTimeout(__myself.statTimer);
+ clearTimeout(__myself.showTimer);
+ clearTimeout(__myself.termTimer);
+ clearTimeout(__myself.bytargetTimer);
+ },
+
reset: function ()
{
__myself.sessionID = null;
__myself.pingStatusOK = false;
__myself.searchStatusOK = false;
- clearTimeout(__myself.statTimer);
- clearTimeout(__myself.showTimer);
- clearTimeout(__myself.termTimer);
- clearTimeout(__myself.bytargetTimer);
+ __myself.stop();
if ( __myself.resetCallback )
__myself.resetCallback();
init: function ( sessionId )
{
__myself.reset();
+
if ( sessionId != undefined ) {
__myself.initStatusOK = true;
__myself.sessionID = sessionId;
__myself.ping();
-
- } else {
+ } else if (__myself.useSessions) {
var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
request.get(
{ "command": "init" },
setTimeout("__myself.init()", 1000);
}
);
- }
+ } else {
+ __myself.initStatusOK = true;
+ }
},
// no need to ping explicitly
ping: function ()
__myself.showCounter = 0;
__myself.termCounter = 0;
+ __myself.bytargetCounter = 0;
+ __myself.statCounter = 0;
if( !__myself.initStatusOK )
return;
else
throw new Error("You need to supply query to the search command");
- if( filter !== undefined )
- var searchParams = { "command": "search", "session": __myself.sessionID, "query": __myself.currQuery, "filter": filter };
- else
- var searchParams = { "command": "search", "session": __myself.sessionID, "query": __myself.currQuery };
+ var searchParams = { "command": "search", "query": __myself.currQuery, "session": __myself.sessionID };
+
+ if (filter !== undefined)
+ searchParams["filter"] = filter;
+
var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
request.get(
searchParams,
//piggyback search
__myself.show(0, num, sort);
if ( __myself.statCallback )
- __myself.statTimer = setTimeout("__myself.stat()", __myself.statTime / 2);
+ __myself.stat();
+ //__myself.statTimer = setTimeout("__myself.stat()", __myself.statTime / 4);
if ( __myself.termlistCallback )
- //__myself.termlist();
- __myself.termTimer = setTimeout("__myself.termlist()", __myself.termTime / 2);
+ __myself.termlist();
+ //__myself.termTimer = setTimeout("__myself.termlist()", __myself.termTime / 4);
if ( __myself.bytargetCallback )
- __myself.bytargetTimer = setTimeout("__myself.bytarget()", __myself.bytargetTime / 2);
+ __myself.bytarget();
+ //__myself.bytargetTimer = setTimeout("__myself.bytarget()", __myself.bytargetTime / 4);
}
else
// if it gets here the http return code was 200 (pz2 errors are 417)
// but the response was invalid, it should never occur
- setTimeout("__myself.search(__myself.currQuery)", 1000);
+ setTimeout("__myself.search(__myself.currQuery)", 500);
}
);
},
stat: function()
{
- if( !__myself.searchStatusOK )
+ if( !__myself.initStatusOK )
return;
// if called explicitly takes precedence
clearTimeout(__myself.statTimer);
"failed": Number( data.getElementsByTagName("failed")[0].childNodes[0].nodeValue ),
"error": Number( data.getElementsByTagName("error")[0].childNodes[0].nodeValue )
};
+
+ __myself.statCounter++;
+ var delay = __myself.statTime + __myself.statCounter * __myself.dumpFactor;
+ if ( activeClients > 0 )
+ __myself.statTimer = setTimeout("__myself.stat()", delay);
+
__myself.statCallback(stat);
- if (activeClients > 0)
- __myself.statTimer = setTimeout("__myself.stat()", __myself.statTime);
}
else
// if it gets here the http return code was 200 (pz2 errors are 417)
// first parse the status data send along with records
// this is strictly bound to the format
var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
+ __myself.activeClients = activeClients;
var show = {
"activeclients": activeClients,
"merged": Number( data.getElementsByTagName("merged")[0].childNodes[0].nodeValue ),
}
else {
var nodeName = hits[i].childNodes[j].nodeName;
- var nodeText = hits[i].childNodes[j].firstChild.nodeValue;
+ var nodeText = 'ERROR'
+ if ( hits[i].childNodes[j].firstChild )
+ nodeText = hits[i].childNodes[j].firstChild.nodeValue;
show.hits[i][nodeName] = nodeText;
}
}
}
}
- __myself.showCallback(show);
__myself.showCounter++;
var delay = __myself.showTime;
if (__myself.showCounter > __myself.showFastCount)
- delay *= 2;
- if (activeClients > 0)
+ delay += __myself.showCounter * __myself.dumpFactor;
+ if ( activeClients > 0 )
__myself.showTimer = setTimeout("__myself.show()", delay);
+
+ __myself.showCallback(show);
}
else
// if it gets here the http return code was 200 (pz2 errors are 417)
}
);
},
- record: function(id)
+ record: function(id,offset)
{
- if( !__myself.searchStatusOK )
+ if( !__myself.searchStatusOK && __myself.useSessions)
return;
if( id !== undefined )
__myself.currRecID = id;
var request = new pzHttpRequest(__myself.pz2String, __myself.errorHandler);
+
+ var recordParams = { "command": "record", "session": __myself.sessionID, "id": __myself.currRecID };
+ if (offset !== undefined) {
+ recordParams["offset"] = offset;
+ }
+ __myself.currRecOffset = offset;
request.get(
- { "command": "record", "session": __myself.sessionID, "id": __myself.currRecID },
+ recordParams,
function(data) {
var recordNode;
var record = new Array();
- if ( recordNode = data.getElementsByTagName("record")[0] ) {
+ record['xmlDoc'] = data;
+ if (__myself.currRecOffset !== undefined) {
+ record['offset'] = __myself.currRecOffset;
+ __myself.recordCallback(record);
+ } else if ( recordNode = data.getElementsByTagName("record")[0] ) {
// if stylesheet was fetched do not parse the response
if ( __myself.xslDoc ) {
- record['xmlDoc'] = data;
+ record['recid'] = recordNode.getElementsByTagName("recid")[0].firstChild.nodeValue;
record['xslDoc'] = __myself.xslDoc;
} else {
for ( i = 0; i < recordNode.childNodes.length; i++) {
- if ( recordNode.childNodes[i].nodeType == Node.ELEMENT_NODE ) {
+ if ( recordNode.childNodes[i].nodeType == Node.ELEMENT_NODE
+ && recordNode.childNodes[i].nodeName != 'location' ) {
var nodeName = recordNode.childNodes[i].nodeName;
var nodeText = recordNode.childNodes[i].firstChild.nodeValue;
record[nodeName] = nodeText;
}
}
- // the location is hard coded
+ // the location might be empty!!
var locationNodes = recordNode.getElementsByTagName("location");
record["location"] = new Array();
for ( i = 0; i < locationNodes.length; i++ ) {
"id": locationNodes[i].getAttribute("id"),
"name": locationNodes[i].getAttribute("name")
};
+
for ( j = 0; j < locationNodes[i].childNodes.length; j++) {
if ( locationNodes[i].childNodes[j].nodeType == Node.ELEMENT_NODE ) {
var nodeName = locationNodes[i].childNodes[j].nodeName;
- var nodeText;
+ var nodeText = '';
if (locationNodes[i].childNodes[j].firstChild)
nodeText = locationNodes[i].childNodes[j].firstChild.nodeValue;
- else
- nodeText = '';
record["location"][i][nodeName] = nodeText;
}
}
}
}
+
__myself.recordCallback(record);
}
else
// if it gets here the http return code was 200 (pz2 errors are 417)
// but the response was invalid, it should never occur
- setTimeout("__myself.record(__myself.currRecID)", 1000);
+ setTimeout("__myself.record(__myself.currRecID)", 500);
}
);
},
{ "command": "termlist", "session": __myself.sessionID, "name": __myself.termKeys },
function(data) {
if ( data.getElementsByTagName("termlist") ) {
- var termList = { "activeclients": Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue ) };
+ var activeClients = Number( data.getElementsByTagName("activeclients")[0].childNodes[0].nodeValue );
+ __myself.activeClients = activeClients;
+ var termList = { "activeclients": activeClients };
var termLists = data.getElementsByTagName("list");
//for each termlist
for (i = 0; i < termLists.length; i++) {
//for each term in the list
for (j = 0; j < terms.length; j++) {
var term = {
- "name": terms[j].getElementsByTagName("name")[0].childNodes[0].nodeValue,
- "freq": terms[j].getElementsByTagName("frequency")[0].childNodes[0].nodeValue
+ "name": (terms[j].getElementsByTagName("name")[0].childNodes.length
+ ? terms[j].getElementsByTagName("name")[0].childNodes[0].nodeValue
+ : 'ERROR'),
+ "freq": terms[j].getElementsByTagName("frequency")[0].childNodes[0].nodeValue || 'ERROR'
};
var termIdNode = terms[j].getElementsByTagName("id");
}
}
- __myself.termlistCallback(termList);
__myself.termCounter++;
- if (termList["activeclients"] > 0)
- __myself.termTimer = setTimeout("__myself.termlist()", (__myself.termTime + __myself.termCounter*__myself.dumpFactor));
+ var delay = __myself.termTime + __myself.termCounter * __myself.dumpFactor;
+ if ( activeClients > 0 )
+ __myself.termTimer = setTimeout("__myself.termlist()", delay);
+
+ __myself.termlistCallback(termList);
}
else
// if it gets here the http return code was 200 (pz2 errors are 417)
}
}
}
- __myself.bytargetCallback(bytarget);
+
+ __myself.bytargetCounter++;
+ var delay = __myself.bytargetTime + __myself.bytargetCounter * __myself.dumpFactor;
if ( __myself.activeClients > 0 )
- __myself.bytargetTimer = setTimeout("__myself.bytarget()", __myself.bytargetTime);
+ __myself.bytargetTimer = setTimeout("__myself.bytarget()", delay);
+
+ __myself.bytargetCallback(bytarget);
}
else
// if it gets here the http return code was 200 (pz2 errors are 417)
this.request = null;
this.url = url;
this.errorHandler = errorHandler || null;
+ this.async = true;
if ( window.XMLHttpRequest ) {
this.request = new XMLHttpRequest();
{
get: function ( params, callback )
{
- this.callback = callback;
-
- var paramArr = new Array();
- for ( var key in params ) {
- paramArr.push(key + '=' + escape(params[key]));
- }
+ this._send( 'GET', params, '', callback );
+ },
+ post: function ( params, data, callback )
+ {
+ this._send( 'POST', params, data, callback );
+ },
+
+ load: function ()
+ {
+ this.async = false;
+ this.request.open( 'GET', this.url, this.async );
+ this.request.send('');
+ if ( this.request.status == 200 )
+ return this.request.responseXML;
+ },
+
+ _send: function ( type, params, data, callback )
+ {
+ this.callback = callback;
var context = this;
- this.request.open( 'GET', this.url+'?'+paramArr.join('&'), true );
+ this.async = true;
+ this.request.open( type, this._urlAppendParams(params), this.async );
this.request.onreadystatechange = function () {
context._handleResponse();
}
- this.request.send();
+ this.request.send(data);
+ },
+
+ _urlAppendParams: function (params)
+ {
+ var getUrl = this.url;
+
+ var sep = '?';
+ var el = params;
+ for (var key in el) {
+ if (el[key] != null) {
+ getUrl += sep + key + '=' + encodeURI(el[key]);
+ sep = '&';
+ }
+ }
+ return getUrl;
},
_handleResponse: function ()
this.simpleFilter = null;
this.numTerms = 0;
},
+ clearSimpleQuery: function()
+ {
+ this.simpleQuery = '';
+ },
addTerm: function(field, value)
{
var term = {"field": field, "value": value};
{
var ccl = '';
if( this.simpleQuery != '')
- ccl = '"'+this.simpleQuery+'"';
+ ccl = this.simpleQuery;
for(var i = 0; i < this.advTerms.length; i++)
{
if (ccl != '') ccl = ccl + ' and ';