/* A very simple client that shows a basic usage of the pz2.js
** $Id: pazpar2_client.js,v 1.31 2008-09-29 10:22:19 heikki Exp $
*/

// 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": 500,            //each timer (show, stat, term, bytarget) can be specified this way
                    "pazpar2path": "/pazpar2/search.pz2",
                    "autoInit": false,
                    "oninit": my_oninit,
                    "onterm": my_onterm,
                    "termlist": "subject,material_type,author,xtargets",
	 	    "usesessions" : true,
                    "onrecord": my_onrecord } );
// some state vars
var curPage = 1;
var recPerPage = 20;
var totalRec = 0;
var curDetRecId = '';
var curDetRecData = null;
var curFilters = null;
var query = '';
var combine_str = ' og ';

// wait until the DOM is ready
function domReady ()
{
    if (document.search_form) {
        my_paz.init();
   }
}

// when search button pressed
function onFormSubmitEventHandler()
{
    constructAdvQuery();
    curPage = 1;
    curDetRecId = '';
    totalRec = 0;
    my_paz.search(query, recPerPage, 'relevance', curFilters);
    return false;
}

function constructAdvQuery () {
	var j = "";
    var temp_query = '';
	for (var i =0; i<document.search_form.elements.length; i++) {
        if ((document.search_form.elements[i].name.indexOf('cclterm') > -1)) {
        	j = document.search_form.elements[i].name.substring('cclterm'.length);
			//alert("cclterm"+j+": "+document.search_form['cclterm'+j].name+", "+document.search_form['cclterm'+j].value+", "+document.search_form['cclfield'+j].value);
			if (document.search_form['cclterm'+j].value == "") {
					continue;
			}
			if(document.search_form['cclterm'+j].type=="checkbox") {
				if (document.search_form['cclterm'+j].checked != 1) {
						continue;
				}
			}
			if (document.search_form['cclfield'+j] != null && document.search_form['cclfield'+j] != undefined) {
					//alert("cclfield"+j+": "+document.search_form['cclfield'+j].name+", "+document.search_form['cclfield'+j].value);
			} else {
					continue;
			}
			if (temp_query == "") {
                  if (document.search_form['cclterm'+j].value.indexOf('=') > 0) { // We check if there is CCL in the temp_query
                      temp_query += document.search_form['cclterm'+j].value;
                  } else if (document.search_form['cclfield'+j].value == "") {
                    temp_query += document.search_form['cclterm'+j].value;
                  } else {
                      temp_query += document.search_form['cclfield'+j].value+"="+document.search_form['cclterm'+j].value;
                  }
			} else {
                  if (document.search_form['cclterm'+j].value.indexOf('=') > 0) { // We check if there is CCL in the temp_query
                      temp_query += " "+document.search_form['cclterm'+j].value;
                  } else {
                      if (document.search_form['cclop'+j] != null &&document.search_form['cclop'+j] != undefined && document.search_form['cclop'+j].value != "") {
                  		//alert("cclop"+j+": "+document.search_form['cclop'+j].name+", "+document.search_form['cclop'+j].value);
                  		temp_query += " "+document.search_form['cclop'+j].value+" "+document.search_form['cclfield'+j].value+"="+document.search_form['cclterm'+j].value;
                      } else if (document.search_form['cclfield'+j].value == "") {
                           temp_query += combine_str + document.search_form['cclterm'+j].value;
                      } else {
                          temp_query += combine_str + document.search_form['cclfield'+j].value+"="+document.search_form['cclterm'+j].value;
                      }
                  }
			}
		}
	}

	query = temp_query;
}

//
// pz2.js event handlers:
//
function my_oninit() {
        document.search_form.onsubmit = onFormSubmitEventHandler;

	if (document.search_form.filters.value !== '')
	    curFilters = 'pz:id=' + document.search_form.filters.value;

        if (document.search_form.cclterm1.value != '' )
    	   onFormSubmitEventHandler();
}

function my_onshow(data) {
    totalRec = data.merged;

    var body = document.getElementById("body");
    body.innerHTML = "";

    if ( data.hits.length ) {
        var previous_style = '';

    	body.innerHTML += '<hr/><div style="float: right">Viser: '
                    + (data.start + 1) + ' til ' + (data.start + data.num ) +
                     ' af ' + data.merged + '</div>';

        if ( data.start > 0 ) {
            previous_style = 'jslink';
        } else {
            previous_style = 'jslink_inactive';
        }

    	body.innerHTML += '<div style="float: clear">'
                +'Søgeresultater<br />'
		+'<span class="' + previous_style
                + '" id="prev" onclick="pagerPrev();">'
		+'&#60;&#60; Forrige</span> <b>|</b> '
		+'<span class="jslink" id="next" onclick="pagerNext()">'
		+'Næste &#62;&#62;</span></div><hr/>';
    } else {
    	body.innerHTML += '<hr/><div style="float: right">Ingen resultater'
		+ '</div><div style="float: clear">&nbsp;</div><hr/>';
    }


    for (var i = 0; i < data.hits.length; i++) {
        var hit = data.hits[i];

	var html = '<div class="record" id="rec_' + hit.recid + '" onclick="showDetails(this.id)">';

	if (hit["md-db_icon"] !== undefined) {
	    html += '<span>&nbsp;</span><img src="' + hit["md-db_icon"] +
	            '"></img><span>&nbsp;</span>';
	}

        html += '<span class="jslink"><b>' + cut_down(hit['md-title'], 100) +
                    ' </b></span>';
	
	if (hit["md-title-remainder"] !== undefined) {
	    html += '<span>' + cut_down(hit["md-title-remainder"], 50) + '</span>';
	}
	
	if (hit["md-title-responsibility"] !== undefined) {
	    html += '<span><i>' + cut_down(hit["md-title-responsibility"], 50) + '</i></span>';
	}
	
	html += '</div>';
	body.innerHTML += html;
        if ( hit.recid == curDetRecId ) {
            drawCurDetails();
        }
    }
}

function cut_down(string, value) {
	if ( !string )
		return 'Ingen titel';

	if (string.length > value)
		return string.substring(0, value) + '...';
	else return string;

}

function facet_line (entry, onclck) {
    return '<span class="jslink" onclick="' + onclck + '" alt="' + entry.freq + '" title="' +
           entry.freq + '">' + entry.name + '</span><br/>';
}

function my_onterm(data) {
    var termlist = document.getElementById("termlist");
    termlist.innerHTML = "<hr/><b>Søgeord:</b><br />";
    termlist.innerHTML += "Afgræns søgning - klik på søgeord i listen<hr/>";
    termlist.innerHTML += '<div class="termtitle">.::Database</div>';

    for (var i = 0; i < data.xtargets.length; i++ ) {
        termlist.innerHTML += facet_line(data.xtargets[i],
       'limitTarget(this.firstChild.nodeValue, \'' + data.xtargets[i].id +
        '\')');
    }
    termlist.innerHTML += "<hr/>";
    termlist.innerHTML += '<div class="termtitle">.::Emneord</div>';
    for (var i = 0; i < data.subject.length; i++ ) {
        termlist.innerHTML += facet_line(data.subject[i],
                'limitQuery(\'emne\', this.firstChild.nodeValue)'); 
    }

    termlist.innerHTML += "<hr/>";
    termlist.innerHTML += '<div class="termtitle">.::Materialekategorier</div>';

    for (var i = 0; i < data.material_type.length; i++ ) {
        termlist.innerHTML += facet_line(data.material_type[i],
                'limitQuery(\'kat\', this.firstChild.nodeValue)'); 
    }

    termlist.innerHTML += "<hr/>";
    termlist.innerHTML += '<div class="termtitle">.::Forfattere</div>';

    for (var i = 0; i < data.author.length; i++ ) {
        termlist.innerHTML += facet_line(data.author[i],
                'limitQuery(\'forfatter\', this.firstChild.nodeValue)'); 
    }

}

function my_onrecord(data) {
    // in case on_show was faster to redraw element
    var detRecordDiv = document.getElementById('det_'+data.recid);
    if ( detRecordDiv )
        return;

    curDetRecData = data;
    drawCurDetails();
}


// detailed record drawing
function showDetails ( prefixRecId ) {
    var recId = prefixRecId.replace('rec_', '');

    // remove current detailed view if any
    var detRecordDiv = document.getElementById('det_'+curDetRecId);
    // lovin DOM!
    if ( detRecordDiv )
            detRecordDiv.parentNode.removeChild(detRecordDiv);

    // if the same clicked do not redraw
    if ( recId == curDetRecId ) {
        curDetRecId = '';
        return;
    }

    curDetRecId = recId;

    // request the record
    my_paz.record(recId);
}

function drawCurDetails ()
{
    var data = curDetRecData;
    var res_html = '';
    var subject_html = '';
	//debugger;
    var recordDiv = document.getElementById('rec_'+data.recid);
    var url_recipe = data["location"][0]["md-url_recipe"];
    if ( url_recipe ) {
	   var url = url_from_recipe( url_recipe, data["location"][0]);
	if (url)
		res_html = '<tr><td><b>Link</b></td><td><b>:</b> <a href="'+url+'">Gå til post</a></td></tr>';
    }
    if (data["location"][0]["md-subject"] && data["location"][0]["md-subject"].length > 0) {
        subject_html = "<tr><td><b>Emneord</b></td><td><b>:</b> ";
        for (i = 0; i < data["location"][0]["md-subject"].length; i++) {
        	if (subject_html.length > 42) {
        		subject_html += ', ';
        	}
          subject_html += '<a href="#" onclick="limitQuery(\'su\', this.firstChild.nodeValue)">'+data["location"][0]["md-subject"][i]+'</a>';
        }
        subject_html += "</td></tr>";
    }
    tmp = '';
    tmp += '<div class="details" id="det_'+data.recid+'"><table>';
    tmp += '<tr><td valign="top"><b>Titel</b></td><td><b>:</b> '+data["md-title"] + '</td></tr>';
    if (data["md-date"] != undefined) {
        tmp += '<tr><td><b>Dato</b></td><td><b>:</b> ' + data["md-date"] + '</td></tr>';
    }
    if (data["md-author"] != undefined) {
        tmp += '<tr><td><b>Forfatter</b></td><td><b>:</b> ' + data["md-author"] + '</td></tr>';
    }
    tmp += subject_html;
    if (data["location"][0].name != undefined) {
        tmp += '<tr><td><b>Institution</b></td><td><b>:</b> ' + data["location"][0].name + '</td></tr>';
    }
    tmp += res_html;
    tmp += '</table></div>';
    recordDiv.innerHTML += tmp;
}

function url_from_recipe ( recipe_ar, data )
{
    var url = '';
    var recipe = recipe_ar[0];
    var items = recipe.match(/\{[a-z,\-]+\}/);
    if (items) {
	    for(var i=0; i <items.length; i++) {
		var md_name = items[i].slice(1,-1);
		if (data[md_name])
		    url = recipe.replace(items[i], data[md_name])
		else
		    url = '';
	    }
    }
    return url;
}

function limitTarget (name, id)
{
        //Display name
        var breadcrumbDiv = document.getElementById('breadcrumb');
        breadcrumbDiv.innerHTML = 'Database: <a href="#" onClick="delimitTarget()">'+name+'</a>';
        my_paz.search(query, recPerPage, 'relevance', 'pz:id='+ id );
        return false;
}

function delimitTarget ()
{
        //Remove name
        var breadcrumbDiv = document.getElementById('breadcrumb');
        breadcrumbDiv.innerHTML = '';
        my_paz.search(query, recPerPage, 'relevance', curFilters);
        return false;
}


// limit the query after clicking the facet
function limitQuery (field, value)
{ 
    if (document.search_form.cclterm1.value != "")
        document.search_form.cclterm1.value += combine_str;
        
    document.search_form.cclterm1.value += field + '="' + value + '"';

    onFormSubmitEventHandler();
}

// simple paging functions

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

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

// swithing view between targets and records

function switchView(view) {

    var targets = document.getElementById('targetview');
    var records = document.getElementById('recordview');

    switch(view) {
        case 'targetview':
            targets.style.display = "block";
            records.style.display = "none";
            break;
        case 'recordview':
            targets.style.display = "none";
            records.style.display = "block";
            break;
        default:
            alert('Unknown view.');
    }
}

