
/*
Referwence of useful variables found in script.

d  : value searched for
co : Number of pages found
r  : Array of results
m  : Search for word or sentence. m=0 -> word
*/

function initSearch() {
	searchpanel = document.createElement('div');
	searchpanel.className = 'popup';
	searchpanel.id = 'resultPanel';
	
	div = document.createElement('div');
	div.className = 'popup-top';
	searchpanel.appendChild(div);
	
	div = document.createElement('div');
	div.className = 'popup-left';
	searchpanel.appendChild(div);
	
	div = document.createElement('div');
	div.className = 'popup-body';
	
	strhtml = '<div class="popup-header">' +
		'<h1>' + translate('Search results') + '</h1>' +
		'<a href="#" onclick="hidePopup(this); return false;"><img alt="Close" id="p610_15" src="../../images/popup/close.png" /></a>' +
		'</div>' +
		'<div id="searchfilter">' +
		'<span id="filterbutton1" class="button" onmouseover="filterButton(this, 1, \'hover\');" onmouseout="filterButton(this, 1, \'out\');">.<input type="button" id="btnfilterOff" value="' + translate('Search the entire report') + '" onclick="search_form(1);" /></span>' +
		'<span id="filterbutton2" class="button inactivebutton" onmouseover="filterButton(this, 2, \'hover\');" onmouseout="filterButton(this, 2, \'out\');">.<input type="button" id="btnfilterSection" value="' + translate('Search this section') + '" onclick="search_form(2);" /></span>' +
		'<span id="filterbutton3" class="button inactivebutton" onmouseover="filterButton(this, 3, \'hover\');" onmouseout="filterButton(this, 3, \'out\');">.<input type="button" id="btnfilterPage" value="' + translate('Search this page') + '" onclick="search_form(3);" /></span>' +
		'</div>' +
		'<div class="popup-content">' +
		'	<div id="noOfResults"></div>' +
		'	<br />' +
		'	<div id="resultList"></div>' +
		'</div>';
		
	div.innerHTML = strhtml;
	searchpanel.appendChild(div);
	
	div = document.createElement('div');
	div.className = 'popup-right';
	searchpanel.appendChild(div);
	
	div = document.createElement('div');
	div.className = 'popup-bottom';
	searchpanel.appendChild(div);
	
	document.getElementById('wrap').appendChild(searchpanel);
}


function search_start() {
	popupanim.time = 0;
	popupanim.top = 15;
	popupanim.left = 610;
	popupanim.height = 10;
	popupanim.width = 10;
	popupanim.changeTop = 45;
	
	popupanim.changeWidth = popupwidth - 10;
	popupanim.changeHeight = popupheight - 10;
	popupanim.changeLeft = (columnWidth + 30) - popupanim.left;
	
	popupanim.duration = 25;
	popupanim.element = document.getElementById('popanim');
	
	currentpopup = document.getElementById('resultPanel');
	
	popupanim.element.style.left = popupanim.left + 'px';
	popupanim.element.style.top = popupanim.top + 'px';
	popupanim.element.style.width = '10px';
	popupanim.element.style.height = '10px';
	popupanim.element.style.display = 'block';
	
	popupanim.timer = setInterval("popupDoAnim();", 15);
	
	search_form(1);
}

function search_form(filterType) 
{
	if (currentFilter != filterType) {
		document.getElementById('filterbutton' + currentFilter).className = 'button inactivebutton';
		currentFilter = filterType;
	}
	
	//If the query isnt empty
    var tb = document.getElementById("tbSearchBox"); //namePrefix + 
	var d = unescape(tb.value);
	if(d.length == 0) return;
	
    var od = d; //od = value searched for

    var m = 0; //seach for a word or a full sentence
    if (d.charAt(0) == '"' && d.charAt(d.length - 1) == '"') {
	    m = 1;
    }

    var r = new Array(); //new array of results
    var pageScore = new Array();
    var co = 0;
    
    //search for word
    if (m == 0) {
	    var woin = new Array(); //array holding if a word should be included or excluded
	    var w = d.split(" ");
	    for (var a = 0; a < w.length; a++) {
		    woin[a] = 0;
		    if (w[a].charAt(0) == '-') { //exclude word if it has a '-' in front
			    woin[a] = 1;
		    }
	    }
    	
	    for (var a = 0; a < w.length; a++) { //remove odd caracters from search (remove - (minus sign) )
		    w[a] = w[a].replace(/^\-|^\+/gi, "");
	    }
    	
	    a = 0; //reset iterator to keep number of passed lines (results)
	    for (var c = 0; c < sData.length; c++) {
		    pa = 0; //number of patterns passed
		    nh = 0; //number of patterns processed
			var score = 0;
			
		    for (var i = 0; i < woin.length; i++) {
			    if (woin[i] == 0) {
					var line = sData[c]; //current line to search
				    
			        var subjRegexPat = "^(\\w| )*" + w[i];
			        var regSubj = new RegExp(subjRegexPat, "i");
			        var headingFound = line.search(regSubj);
			        
			        if(headingFound >= 0)
			        {
			            score += 10;
			        }
				    nh++;
				    
				    var pat = new RegExp(w[i], "i");
				    var rn = line.match(pat);
				    if (rn && rn.length > 0) {
					    pa++;
					    score += rn.length;
				    } else {
					    pa = 0;
					    break;
				    }
				    
			    }
			    if (woin[i] == 1) {
			        nh++;
				    var pat = new RegExp(w[i], "i");
				    var rn = sData[c].search(pat);
				    if (rn >= 0) {
					    pa = 0;
					    break;
				    }
				    else
				    {
				        pa++;
				        score++;
				    }
			    }
		    }
		    if (pa == nh && isInScope(sData[c],filterType)) { //if number of patterns is equal to number of patterns passed, add line to results
			    r[a] = sData[c];
			    pageScore[a] = score;
			    a++; //increment result count
		    }
	    }
	    co = a; //Set number of results
	    
	    //sort the search
	    r = sortSearchResult(r, pageScore);
    }

    //search for sentece
    if (m == 1) 
    {
	    d = d.replace(/"/gi, "");
	    var a = 0;
	    var pat = new RegExp(d, "i");
	    for (var c = 0; c < sData.length; c++) {
		    var rn = sData[c].search(pat);
		    if (rn >= 0 && isInScope(sData[c],filterType)) {
			    r[a] = sData[c]; //add line to result
			    a++;
		    }
	    }
	    co = a;
    }
    
    printResult(r,d,m);
    return false;
}

//checks if page is in the right section depending on filter criteria
function isInScope(row,type)
{
    //type: 1 = all, 2 = section, 3 = Page
    if(type == 1) return true; //if 1, always return true (filter off)
    
    var section = "";
    var page = "";
    
    var url = window.location.toString();
    var aUrl = url.split("/");
    section = aUrl[aUrl.length -2];
    
    //if type is filter on page, fill in the page, otherwise, leave it empty.
    if(type == 3)
    {
        page = aUrl[aUrl.length -1];
        page = page.substring(0,page.indexOf("."));
    }
    
    //split the row and compare values
    var aRow = row.split("^");
    if(section != aRow[4]) 
    {
        return false;
    }
    else
    {
        if(page == "" || page == aRow[5]) return true;
        else
        { 
            return false;
        }
    }  
}

function getSearchPattern(d,m)
{
    if(m == 0)
    {
        var criteria = d.split(" ")[0];
        return new RegExp(criteria, "i");
    }
    else
    {
        return new RegExp(d, "i");
    }
}

//output the list of pages matching the criteria searched for
function printResult(r,d,m) 
{ 
	var resultPanel = document.getElementById("resultPanel"); //namePrefix + 
    //resultPanel.style.display = "block";
    
    var resultHtml = "";
        
    if (r.length == 0) 
    {
	    resultHtml = '<p>' + translate('Your search did not match any documents. Make sure all keywords are spelt correctly. Try different or more general keywords.') + '</p>';
    }
    else
    {
        for (var a = 0; a < r.length; a++) 
        {
	        var os = r[a].split("^"); //os keeps an array of the searchline
    		var pattern = getSearchPattern(d,m);
    		var searchPos = os[3].search(pattern);
    		if(searchPos > -1)
    		{
    		    var stringLengtToTake = 250;
    		    var summaryText = os[3].substring(searchPos,searchPos + stringLengtToTake);   
    		}
    		else
    		{
    		    var summaryText = "";
    		}
	        
	        resultHtml += '<p><span class="small">' + os[2] + '</span><br /><strong>' + (a + 1) + '. <a href="' + os[1] + '&s=' + d + '">' + os[0] + '</a></strong><br />' + summaryText + '</p>';
        }
    }
    
    //set result to div.
    document.getElementById("noOfResults").innerHTML = r.length + ' ' + translate('page(s) found'); //namePrefix + 
    document.getElementById("resultList").innerHTML = resultHtml; //namePrefix + 
}

function highlightSearch(input) {
	input.parentNode.className = 'selected';
}
function restoreSearch(input) {
	input.parentNode.className = '';
}

currentFilter = 1;
function filterButton(span, no, type) {
	if (no != currentFilter) {
		if (type == 'hover') {
			span.className = 'button';
		}
		else {
			span.className = 'button inactivebutton';
		}
	}
}


function sortSearchResult(r, pageScore)
{
    var newResultArray = new Array();
    
    for(var pageIterator = 0; pageIterator < r.length; pageIterator++)
    {
        var maxScore = 0;
        var scorePos = 0;
        for(var scoreIterator = 0; scoreIterator < pageScore.length; scoreIterator++)
        {
            if(pageScore[scoreIterator] > maxScore)
            {
                maxScore = pageScore[scoreIterator];
                scorePos = scoreIterator;
            }
        }
        newResultArray[pageIterator] = r[scorePos];
        pageScore[scorePos] = -1;
    }
    return newResultArray;
}