/* $Id: client.js,v 1.9 2008-03-17 16:17:10 jakub 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,
                    "pazpar2path": "/pazpar2/search.pz2",
                    "oninit": my_oninit,
                    "onstat": my_onstat,
                    "onterm": my_onterm,
                    "termlist": "xtargets,subject",
                    "onbytarget": my_onbytarget,
	 	   			"usesessions" : true,
                    "onrecord": my_onrecord } );
// some state vars
var curPage = 1;
var curSort = 'relevance';
var recPerPage = 20;
var totalRec = 0;
var curFilter = null;
var curFilters = null;
var submitted = false;

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

function my_oninit() {
    my_paz.stat();
    my_paz.bytarget();
}

function my_onshow(data) {
    totalRec = data.merged;
        
    //Build the two pagination lines
    var pager = document.getElementById("pager");
    var pager2 = document.getElementById("pager2");
    pager.innerHTML = "";
    pager2.innerHTML = "";

    pager.innerHTML +='<hr/><div style="float: right">Displaying: ' 
                    + (data.start +1) + ' to ' + (data.start + data.num) +
                     ' of ' + data.merged + ' (found: ' 
                     + data.total + ')</div>';
    drawPager(pager);
    
    pager2.innerHTML = pager.innerHTML;
    

    //Build the subject removal buttons
    var chunks = document.getElementById("query").value.split("and su=(");
	var sub_remove = document.getElementById("sub_remove");

	sub_remove.innerHTML = "";
	
	//If we've found some subjects
    if(chunks.length > 1){
	    //Get the div that will be holding our info
	    sub_remove.innerHTML = "Remove Subject Filters: ";
	    
	    //Iterate through the query, and subjects
    	for(var i in chunks){
    		//If we're on the first array element, which isn't a subject, but is the query itself
    		if(i == 0){
    			
    		}else{//Current element is a subject
				//Start our button to remove the subject
    			var temp_link = "<a class=buttonlink href=\"#\" onClick=\"javascript:newSearch('";
				//Loop through our subjects
    			for(var j in chunks){
    				if(j == 0){//Output the query itself
    					temp_link += chunks[j];
    				}else{//Append all the subject, except for the one we're currently generating a button for
    					if(i != j){
    						temp_link += " and su=(" + chunks[j];
    					}else{
	    					temp_name = chunks[j].replace(")","");
	    				}
    				}
    			}
    			temp_link += "')\">" + temp_name + "</a>";
    			sub_remove.innerHTML += temp_link + "&nbsp;";
    			//alert(temp_link);
    		}
    	}
    }

    
    
    
    
    

    // Build the results list
    var results = document.getElementById("results");
    results.innerHTML = "";

    for (var i = 0; i < data.hits.length; i++) {
        var hit = data.hits[i];
		var href = 'href="#"';
		var url;
	
	
	
		var tempeurl = String(hit["md-electronic-url"]);
	
		//If it has OPLIN proxy info in it, escape the ampersands 
		if(tempeurl.indexOf("oplin.org/databases")!= -1){
			tempeurl = tempeurl.replace(/&/g,"%26");		
		}
	
	
	
	
		if (url = do_url_recipe(hit)) {
			href = 'href="'  + url + '" target="_blank"';
		} else if (hit["md-electronic-url"] !== undefined) {
			href = 'href="' + tempeurl + '" target="_blank"';
		} else if (hit["md-open-url"] !== undefined) {
		   href = 'href="'  + hit["md-open-url"] + '" target="_blank"';
		}
	

		var html = '<div class="record" id="rec_' + hit.recid + '">'
		        +'<span>' + (i + 1 + recPerPage * ( curPage - 1)) + '. </span>'
		        +'<a class="extern" ' + href + '><b>' + hit["md-title"] + '</b></a>'; 
		if (hit["md-title-remainder"] !== undefined) {
			html += '<span>' + hit["md-title-remainder"] + '</span>';
		}
	
		if (hit["md-title-responsibility"] !== undefined) {
			html += '<span><i>' + hit["md-title-responsibility"] + '</i></span>';
		}
		    
		var loc_html = '<div>Source: <i>';
		for (var j = 0; j < hit["location"].length; j++) {
			html += loc_html + hit["location"][j]["@name"];
			loc_html = ', '
		}
		if (loc_html == ', ') html += '</i></div>';
	

		if (hit["md-date"] !== undefined) {
			html += '<div>Date: <i>' + hit["md-date"] + '</i></div>';
		}

		if (hit["md-description"] !== undefined) {
			html += '<div>About: <i>' + hit["md-description"] + '</i></div>';
		}

		html += '</div>';
		results.innerHTML += html;
    }
    
}

function my_onstat(data) {
    var stat = document.getElementById('stat');
    
    if(stat != null){
		if(data.activeclients != 0){
			stat.innerHTML   = '<div style="text-align:left;">Searching...</div>';
			stat.innerHTML  += '<div id="progress_empty"   style="position:relative;height:20px;width:150px;background-color:#cccccc;border:1px solid black;padding:0px;">';
			stat.innerHTML  += '<div id="progress_filler"  style="height:20px;width:'+(((data.clients - data.activeclients) / data.clients)*150)+'px;left:1px;background-color:#607D8B;padding-top:5px;padding:0px;position:relative;margin-right:200px;margin-top:-21px;"/>';
			stat.innerHTML  += '</div></div><br />';
			
				 
					 
	//    	stat.innerHTML = '<span>Searching targets: '+ (data.clients - data.activeclients)
	//                        + '/' + data.clients + '</span>';
	//                        //+ '<span>Retrieved records: ' + data.records
	//                        //+ '/' + data.hits + '</span>';
		                    
		}else{
				stat.innerHTML = '';  
				debug("Search Complete");  	
		}
    }
}

function my_onterm(data) {
    var termlist = document.getElementById("termlist");
    /*termlist.innerHTML = "<hr/><b>TERMLISTS:</b><hr/>";*/
	//termlist.innerHTML = "<hr/><div id=stat></div><hr/>";

    
    termlist.innerHTML = '<br /><b>Refine your search by:</b><br/>';

    termlist.innerHTML += '<div class="termtitle">.::Subjects</div>';
    for (var i = 0; i < data.subject.length; i++ ) {	    
	    if(data.subject[i].name.replace(/[^\w\s\(\)\=\.\,]/g,'').length > 0){
		    data.subject[i].name = data.subject[i].name.replace(/[^\w\s\=\.\,\-]/g,'');
		    data.subject[i].name = data.subject[i].name.replace(/[\-]/g,' ');
		    
	        termlist.innerHTML += '<a href="#" onclick="limitQuery(\'su\', this.firstChild.nodeValue)">' 
	                            + data.subject[i].name
	                            + '</a><span>  (' 
	                            + data.subject[i].freq 
	                            + ')</span><br/>';
        }
    }

    termlist.innerHTML += "<hr/>";
    
    termlist.innerHTML += '<div class="termtitle">.::Sources</div>';
    for (var i = 0; i < data.xtargets.length; i++ ) {
        termlist.innerHTML += '<a href="#" target_id='
            + data.xtargets[i].id
            + ' onclick="limitTarget(this.getAttribute(\'target_id\'), this.firstChild.nodeValue)">' 
                            + data.xtargets[i].name 
                            + ' </a><span> (' 
                            + data.xtargets[i].freq 
                            + ')</span><br/>';
    }
    
    
    

}

function my_onrecord(data) {
    return false;
}

function my_onbytarget(data) {
//     var targetDiv = document.getElementById("bytarget");
//     var table = '<table><thead><tr><td>Target ID</td><td>Hits</td><td>Diags</td>'
//                          +'<td>Records</td><td>State</td></tr></thead><tbody>';
//     
//     for (var i = 0; i < data.length; i++ ) {
//         table += "<tr><td>" + data[i].id +
//                     "</td><td>" + data[i].hits +
//                     "</td><td>" + data[i].diagnostic +
//                     "</td><td>" + data[i].records +
//                     "</td><td>" + data[i].state + "</td></tr>";
//     }

//     table += '</tbody></table>';
//     targetDiv.innerHTML = table;

}

////////////////////////////////////////////////////////////////////////////////

// wait until the DOM is ready
function domReady () 
{ 
    document.search.onsubmit = onFormSubmitEventHandler;
    document.search.query.value = '';
    document.select.contents.onchange = onContentsDdChange;
    document.select.sort.onchange = onSelectDdChange;
    document.select.perpage.onchange = onSelectDdChange;
}

// when search button pressed
function onFormSubmitEventHandler() 
{
	//document.getElementById("query").value = document.getElementById("query").value.replace(/[^\w\s\(\)\=\.\,\-]/g,'');
	//document.getElementById("query").value = document.getElementById("query").value.replace(/[\-]/g,' ');
	requestSpelling(document.getElementById("query").value);
	
    resetPage();
    loadSelect();
    triggerSearch();
    submitted = true;
    debug("Form Submit Fired");
    return false;
}

function onContentsDdChange()
{
    if (!submitted) return false;
    resetPage();
    loadSelect();
    triggerSearch();
    debug("Category changed");
    return false;
}

function onSelectDdChange()
{
    if (!submitted) return false;
    resetPage();
    loadSelect();
    my_paz.show(0, recPerPage, curSort);
    return false;
}

function resetPage()
{
    curPage = 1;
    totalRec = 0;
}

function triggerSearch ()
{
    var filter = curFilter ? curFilter : curFilters;
    my_paz.search(document.search.query.value, recPerPage, curSort, filter);
}

function loadSelect ()
{
    curFilters = document.select.contents.value;
    curSort = document.select.sort.value;
    recPerPage = document.select.perpage.value;
}

// limit the query after clicking the facet
function limitQuery (field, value)
{
    document.search.query.value += ' and ' + field + '=(' + value + ')';
    resetPage();
    loadSelect();
    triggerSearch();
    return false;
}


function newSearch (value)
{
    document.search.query.value = value;
    resetPage();
    loadSelect();
    triggerSearch();
    return false;
}

// limit by target functions
function limitTarget (id, name)
{
    var navi = document.getElementById('navi');
    navi.innerHTML = 
        'Source: <a class="crossout" href="#" onclick="delimitTarget()">'
        + name + '</a>&nbsp;&nbsp;&nbsp;&nbsp;<input type=button value="Show All Sources" onclick="delimitTarget()">';
    navi.innerHTML += '<hr/>';
    curFilter = 'pz:id=' + id;
    resetPage();
    loadSelect();
    triggerSearch();
    return false;
}

function delimitTarget ()
{
    var navi = document.getElementById('navi');
    navi.innerHTML = '';
    curFilter = null; 
    resetPage();
    loadSelect();
    triggerSearch();
    return false;
}

function drawPager (pagerDiv)
{
    //client indexes pages from 1 but pz2 from 0
    var onsides = 3;
    var pages = Math.ceil(totalRec / recPerPage);
    
    var firstClkbl = ( curPage - onsides > 0 ) 
        ? curPage - onsides
        : 1;

    var lastClkbl = firstClkbl + 2*onsides < pages
        ? firstClkbl + 2*onsides
        : pages;

    var prev = '<span id="prev">&#60;&#60; Prev</span><b> | </b>';
    if (curPage > 1)
        var prev = '<a href="#" id="prev" onclick="pagerPrev();">'
        +'&#60;&#60; Prev</a><b> | </b>';

    var middle = '';
    for(var i = firstClkbl; i <= lastClkbl; i++) {
        var numLabel = i;
        if(i == curPage)
            numLabel = '<b>' + i + '</b>';

        middle += '<a href="#" onclick="showPage(' + i + ')"> '
            + numLabel + ' </a>';
    }
    
    var next = '<b> | </b><span id="next">Next &#62;&#62;</span>';
    if (pages - curPage > 0)
    var next = '<b> | </b><a href="#" id="next" onclick="pagerNext()">'
        +'Next &#62;&#62;</a>';

    predots = '';
    if (firstClkbl > 1)
        predots = '...';

    postdots = '';
    if (lastClkbl < pages)
        postdots = '...';

    pagerDiv.innerHTML += '<div style="float: clear">' 
        + prev + predots + middle + postdots + next + '</div><hr/>';
}

function showPage (pageNum)
{
    curPage = pageNum;
    my_paz.showPage( curPage - 1 );
}


// 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.');
    }
}

function do_url_recipe(hit) {
    return "";
}
