/* A very simple client that shows a basic usage of the pz2.js
** $Id: example_client.js,v 1.4 2007/05/21 08:21:33 jakub Exp $
*/

// http://www.sitepoint.com/article/server-side-xml-javascript
// http://www.sitepoint.com/article/xml-javascript-mozilla

// create a parameters array and pass it to the pz2's constructor
// then register the form submit event with the pz2.search function
// autoInit is set to true on default

my_paz = new pz2({ 
        "onshow": my_onshow,
        "showtime": 1000,
            //"stylesheet": "http://flurry/marc/lot-www/xsl/pazpar2lot.xsl",
        "detailstylesheet": "xsl/pazpar2lot.xsl",
        "onstat": my_onstat,
        "onterm": my_onterm,
        "termlist": "subject,author,xtargets",
        "onbytarget": my_onbytarget,
        "onrecord": my_onrecord_xslt, 
        "errorhandler": my_onerror,
        //"pazpar2path": "/pazpar2/search.pz2",
        "pazpar2path": "pztest/pztest.php",
        "usesessions" : false 
            });

// some state vars
var curPage = 1;
var recPerPage = 25;
var termPerFacet = 10;
var totalRec = 0;
var curQuery = null;
var glbFulltext = "";


// when search button pressed
function submitPazpar2Search(ccl_query, targetid,fulltext) 
{
    glbFulltext = fulltext;
    curPage = 1;
    totalRec = 0;
    //my_paz.bytarget();
    curQuery = ccl_query;

    if (targetid)
        my_paz.search(ccl_query, recPerPage, 'relevance', "pz:id=" + targetid);
    else
        my_paz.search(ccl_query, recPerPage, 'relevance');
}

// when search button pressed
function submitPazpar2Item(recid) 
{
    curPage = 1;
    totalRec = 0;
    my_paz.record(recid);
}

// when debug page showed
function submitPazpar2Debug(ccl_query, targetid) 
{
    curPage = 1;
    totalRec = 0;
    var recPerPage = 1;
    my_paz.stat();
    my_paz.bytarget();
    curQuery = ccl_query;

    if (targetid)
        my_paz.search(ccl_query, recPerPage, 'relevance', "pz:id=" + targetid);
    else
        my_paz.search(ccl_query, recPerPage, 'relevance');
}

// Also performed in xsl:template name="media_icon" in pazpar2lot.xsl
function medium_to_gif(medium) {
    var res = '';
    switch (medium) {
    case "electronic resource":  res="mouse"; break;
    case "computer file":  res="mouse"; break;
    case "sound recording":  res="cd"; break;
    case "microform":  res="microfilm"; break;
    case "videorecording": res="video"; break;
    case "audiocassette": res="video"; break;
    case "person":  res="person"; break;
    case "article": res="txt"; break;
    case "ebook":  res="e_book"; break;
    default: res="book";
    }
    return "icon_" + res + '.gif';
}


//
// pz2.js event handlers:
//

function my_onshow(data) {
    totalRec = data.merged;
    
    var reclist = document.getElementById("recordlist");

    if (reclist == null)
        return;

    var rtable = '';
    rtable += '<table class="recordlist">';

    rtable += '<tr>';
    rtable += '<th>';
    rtable += '</th>';
    rtable += '<th>';
    if (data.start > 1) {
         rtable += '<a class="jslink" id="prev" href="#" onclick="pagerPrev(); return false;">'
        +'&#60;&#60; Prev</a>';
    } else {
         rtable += '<span>&#60;&#60; Prev</span>';
    }
    rtable += ' <b>|</b> ';
    if (data.start + data.num < data.merged) {
        rtable += '<a class="jslink" id="next" href="#" onclick="pagerNext(); return false;">'
               +'Next &#62;&#62;</a>';
    } else {
        rtable += '<span>Next &#62;&#62;</span>';
    }
    rtable += '<span class="rubber">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>'
        rtable += '<span class="counter">Displaying: ' 
        + (data.start+1) + ' to ' + (data.start + data.num) +
        ' of ' + data.merged;
    rtable += '</span>';
    rtable += '</th>';
    rtable += '</tr>';

    // now displaying records
    for (var i = 0; i < data.hits.length; i++) {
        var hit = data.hits[i];
        rtable += '<tr>';

        var med = hit['md-medium'][0];
        var icon = medium_to_gif(med);
        rtable +='<td><img width="16" height="16" src="gfx/' + icon + '" alt="' + med + '"/>' + '</td>';
        rtable += '<td><a href="?page=item&recid=' + hit.recid + '">';
        
        var title = hit["md-title"];
        if (hit["md-title-remainder"])
            title += ' - ' + hit["md-title-remainder"];
        //if (hit["md-title-responsibility"])
        //    title += ' : ' + hit["md-title-responsibility"];
        if (hit["md-author"])
            title += ' : ' + hit["md-author"];
        if (hit["md-date"])
            title += ' , ' + hit["md-date"];
        rtable += '<span class="jslink">' + title + '</span>';
        rtable += '</a></td>';
        rtable += '</tr>';
    }

    // in case there are no records to be displayed
    if (data.merged == 0) {
        rtable += '<tr>';
        rtable += '<td></td>';
        rtable += '<td>';
        rtable += 'No records were found.';
        rtable += '</td></tr>';
    }
    rtable += '</table>';

    reclist.innerHTML = rtable;
}

function my_onerror(error) {
    var reclist = document.getElementById("recordlist");

    if (reclist == null)
        return;

    var rtable = '';
    rtable += '<table class="recordlist">';

    rtable += '<tr>';
    rtable += '<th>';
    rtable += '</th>';
    rtable += '<th>';
    msg = error.message;
    if (error.message == "Malformed parameter value: query")
        msg = "Syntax error in query";

    rtable += '<h3><span>' + msg + '</span></h3>';
    rtable += '</th></tr></table>';

    reclist.innerHTML = rtable;

} 

function my_onstat(data) {
    var stat = document.getElementById("stat");

    if (stat == null)
        return;
    var stable = '';

    stable += '<table class="stat">'; 
    stable += '<tr class="stat">';
    stable += '<th>Targets</th>';
    //stable += '<th>(disconnected)</th>';
    stable += '<th>(active)</th>';
    //stable += '<th>(connecting)</th>';
    stable += '<th>(initializing)</th>';
    stable += '<th>(searching)</th>';
    stable += '<th>(presenting)</th>';
    stable += '<th>(idle)</th>';
    stable += '<th>(failed)</th>';
    stable += '<th>(error)</th>';
    stable += '</tr>';
    stable += '<tr class="stat">';
    stable += '<td>' + data.clients + '</td>';
    //stable += '<td>' + data.unconnected + '</td>';
    stable += '<td>' + data.activeclients + '</td>';
    //stable += '<td>' + data.connecting + '</td>';
    stable += '<td>' + data.initializing + '</td>';
    stable += '<td>' + data.searching + '</td>';
    stable += '<td>' + data.presenting + '</td>';
    stable += '<td>' + data.idle + '</td>';
    stable += '<td>' + data.failed + '</td>';
    stable += '<td>' + data.error + '</td>';
    stable += '</tr>';
    stable += '<tr class="stat">';
    stable += '<th>Records</th>';
    stable += '<th>(retrieved)</th>';
    stable += '</tr>';
    stable += '<tr class="stat">';
    stable += '<td>' + data.hits + '</td>';
    stable += '<td>' + data.records + '</td>';
    stable += '</tr>';

 stat.innerHTML = stable;
 
}

function my_onterm(data) {
    var termlist = document.getElementById("termlist");

    if (termlist == null)
        return;

    // opening table

    var ttable = '';

    //redering subjects
    ttable += '<table class="termlist">';
    ttable += '<tr class="termtitle">';
    ttable += '<th>Subjects</th>';
    //ttable += '<th>Hits</th>';
    ttable += '</tr>';

    for (var i = 0; i < data.subject.length && i < termPerFacet; i++ ) {
        ttable += '<tr><td>'
            //+ data.subject[i].name 
            + anchorQuery(curQuery, 'su', data.subject[i].name) 
            //+ ' </td><td>' 
            //+ data.subject[i].freq 
            + '</td></tr>';
    }
    ttable += '</table>';

    //redering authors
    ttable += '<table class="termlist">';
    ttable += '<tr class="termtitle">';
    ttable += '<th>Authors</th>';
    //ttable += '<th>Hits</th>';
    ttable += '</tr>';

    for (var i = 0; i < data.author.length && i < termPerFacet; i++ ) {
        ttable += '<tr><td>' 
            //+ data.author[i].name 
            + anchorQuery(curQuery, 'au', data.author[i].name) 
            //+ ' </td><td>' 
            //+ data.author[i].freq 
            + '</td></tr>';
    }
    ttable += '</table>';


    //redering targets
    ttable += '<table class="termlist">';
    ttable += '<tr class="termtitle">';
    ttable += '<th>Collections</th>';
    //ttable += '<th>Total Hits</th>';
    ttable += '</tr>';

    for (var i = 0; i < data.xtargets.length && i < termPerFacet; i++ ) {
        ttable += '<tr>';
        //ttable += '<td>' + data.xtargets[i].name + '</td>';
        ttable += '<td>' + anchorTarget(curQuery, 
                                        data.xtargets[i].id, 
                                        data.xtargets[i].name) + '</td>';
        //ttable += '<td>' + data.xtargets[i].freq + '</td>';
        ttable += '</tr>';
    }
    ttable += '</table>';

    //termlist.style.display = "none";
    termlist.innerHTML = ttable;
    //termlist.style.display = "block";

}

function my_onrecord_xslt(data) {
    var itemlist = document.getElementById("itemlist");
    if (itemlist == null){
        alert('id="itemlist" does not exist');
        return;
    }
    
    if (data["xmlDoc"] == null || data["xslDoc"] == null){
        // there's an timing problem, try again
        submitPazpar2Item(data["recid"]);
        return;
    }
    
    itemlist.innerHTML = '';

    Element_appendTransformResult(itemlist, 
                                  data["xmlDoc"],
                                  data["xslDoc"]);
}

function my_onbytarget(data) {
    var targets = document.getElementById("targetlist");

    if (targets == null)
        return;

    var ttable = '';

    // opening table
    ttable += '<table class="targetlist">';

    //redering targets
    ttable += '<tr class="targettitle">';
    ttable += '<th>Target</th>';
    ttable += '<th>Hits</th>';
    ttable += '<th>Received</th>';
    ttable += '<th>Diagnostic</th>';
    ttable += '<th>State</th>';
    ttable += '</tr>';
    
    for (var i = 0; i < data.length; i++ ) {
        ttable += '<tr>';
        ttable += '<td>' + data[i].id + '</td>';
        ttable += '<td>' + data[i].hits + '</td>';
        ttable += '<td>' + data[i].records + '</td>';
        ttable += '<td>' + data[i].diagnostic + '</td>';
        ttable += '<td>' + data[i].state + '</td>';
        ttable += '</tr>';
    }

    // closing table
    ttable += '</table>';

    //targets.style.display = "none";
    targets.innerHTML = ttable;
    //targets.style.display = "block";

}

// toggle view style

function toggle(id) {
    var cell = document.getElementById(id);
    if (!cell)
        return;

    if (cell.style.display == 'none')
        cell.style.display = 'block';
    else
        cell.style.display = 'none';
}


// simple paging functions

function pagerNext() {
    if ( totalRec - recPerPage*curPage > 0) {
        my_paz.showNext();
        curPage++;
    }
}

function pagerPrev() {
    if ( my_paz.showPrev() != false )
        curPage--;
}


function refineQuery(oldquery, field, value){
    var query = '';

    if (oldquery)
        query = oldquery + ' and ';
    
    query += field + '=(' + value + ')'; 

    return query;
}

function anchorQuery(oldquery, field, value){
    var anchor = "";
    var query = refineQuery(oldquery, field, value);

    if (query){
        anchor = '<a href="?page=result&query=' + escape(query) ;
        if ( glbFulltext ) {
          anchor += "&fulltext=" + glbFulltext;
        }
        anchor +=  '">';
        anchor += value;
        anchor += '</a>';
    } else
        anchor = value;
        
    return anchor;
}

function anchorTarget(query, targetid, value){
    var anchor = "";
 
    if (query){
        anchor = '<a href="?page=result&query=' + escape(query)
                  + '&filter=' + targetid ;
        if ( glbFulltext ) {
          anchor += "&fulltext=" + glbFulltext;
        }
        anchor += '">';
        anchor += value;
        anchor += '</a>';
    } else 
        anchor = value;
        
    return anchor;
}



function submitILL()
{
    xml_form = new XmlForm(document.forms.illrequest, null);
    xml_form.post('ill.php', {});
    return true;
}


function set_inner(elem, content) 
{
    if (elem == null)
        return;

    if (elem.nodeType == 3)
        elem.data = content;
    else if (elem.nodeType == 1)
        elem.innerHTML = content;
}


function set_inner_by_id(id, content) 
{
    set_inner(document.getElementById(id), content);
}


var XmlForm = function (form, rootname)
 {
     this._form = form;
 
     if (!rootname){
       rootname = 'form';
     }
     
     this._xmldoc = document.newXmlDoc(rootname);
     this._rootelem = this._xmldoc.documentElement;

     this.convertForm();
 } 


XmlForm.prototype = 
  {
    convertForm: function ()
    {

      if (this._form.id)
         this._rootelem.setAttribute("id", this._form.id);     

      if (this._form.name)
         this._rootelem.setAttribute("name", this._form.name);     

      for (var i = 0; i < this._form.length; i++)
      {
        var field = this._form.elements[i];
        if (field.name){
            Element_appendTextNode(this._rootelem, field.name, field.value);
            //this._rootelem.setAttribute(field.name, field.value);
        }
      }
    },
    
    xml: function ()
    {
      return this._xmldoc;
    },

    post: function(url, params)
    {
      var request = new pzHttpRequest(url);

      request.post(params, this._xmldoc,
                   function(response) { process_ill(response);} );
    }
    
  }



function process_ill(response)
{
 
    var status = 'ok';
    var ills = response.getElementsByTagName('ill');

    // if I have recieved an ILL response in XML ...
    if (!ills.length || !ills[0]){
        set_inner_by_id("ill",
                      '<tr><td class="error">'
                      +'The ILL Request failed due to technical reasons'
                      + '</td></tr>');
        return;
    }

    var ill = ills[0];

    // and it does not contain fatal errors or errors
    if (ill.attributes && ill.attributes.length){

        var fatal = ill.getAttribute("fatal");
        if (fatal){
            set_inner_by_id("ill",
                          '<tr><td class="error">'
                          +'The ILL Request failed: '
                          + fatal
                          + '</td></tr>');
            return;
        }

        var error = ill.getAttribute("error");
        if (error){
            status = 'error';
            set_inner_by_id("illmessage",
                          '<span class="error">'
                          + error + '</span>');
        }        
    }
    
    // and it does not miss fields
    if (!ill.childNodes || !ill.childNodes.length){
        set_inner_by_id("ill",
                      '<tr><td class="error">'
                      +'The ILL Request failed due to technical reasons'
                      + '</td></tr>');
        return;
    }

    // error reporting, possibility to correct by user        
    var fields = ill.childNodes;

    for (var i = 0; i < fields.length; i++){
        var field = fields[i];
        var error = field.getAttribute("error");
        var err_id = 'err_' + field.nodeName;
        
        if (error){
            status = 'error';
            set_inner_by_id(err_id, error);
        } else {
            set_inner_by_id(err_id, '');
        }

    }

    // overall OK status reporting

    if (status == 'ok')
        set_inner_by_id("ill",
                      '<tr><td class="error">'
                      +'Your ILL Request has been sent'
                      + '</td></tr>');
    
}



function toggle_checkboxes(fo)
{
    for (var i = 0; i < fo.length; i++){
        var el = fo.elements[i];
        if (el.type == "checkbox")
            el.checked = el.checked?false:true;
    }
}


function clear_checkboxes(fo)
{
    for (var i = 0; i < fo.length; i++){
        var el = fo.elements[i];
        if (el.type == "checkbox")
            el.checked = false;
    }
}

/*
 * Local variables:
 * mode: c
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * End:
 * vim: shiftwidth=4 tabstop=8 expandtab
 */
