| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886 | /*---------------------------------------------------------------------------- * JavaScript for webhelp search *---------------------------------------------------------------------------- This file is part of the webhelpsearch plugin for DocBook WebHelp Copyright (c) 2007-2008 NexWave Solutions All Rights Reserved. www.nexwave.biz Nadege Quaine http://kasunbg.blogspot.com/ Kasun Gajasinghe *///string initializationvar htmlfileList = "htmlFileInfoList.js";var htmlfileinfoList = "htmlFileInfoList.js";var useCJKTokenizing = false;var w = new Object();var scoring = new Object();var searchTextField = '';var no = 0;var noWords = 0;var partialSearch = "<font class=\"highlightText\">There is no page containing all the search terms.<br>Partial results:</font>";var warningMsg = '<div style="padding: 5px;margin-right:5px;;background-color:#FFFF00;">';warningMsg+='<b>Please note that due to security settings, Google Chrome does not highlight';warningMsg+=' the search results in the right frame.</b><br>';warningMsg+='This happens only when the WebHelp files are loaded from the local file system.<br>';warningMsg+='Workarounds:';warningMsg+='<ul>';warningMsg+='<li>Try using another web browser.</li>';warningMsg+='<li>Deploy the WebHelp files on a web server.</li>';warningMsg+='</div>';txt_filesfound = 'Results';txt_enter_at_least_1_char = "You must enter at least one character.";txt_enter_more_than_10_words = "Only first 10 words will be processed.";txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";txt_please_wait = "Please wait. Search in progress...";txt_results_for = "Results for: ";/* This function verify the validity of search input by the user  Cette fonction verifie la validite de la recherche entrre par l utilisateur */function Verifie(searchForm) {    // Check browser compatibility    if (navigator.userAgent.indexOf("Konquerer") > -1) {        alert(txt_browser_not_supported);        return;    }    searchTextField = trim(document.searchForm.textToSearch.value);    searchTextField = searchTextField.replace(/['"]/g,'');	var expressionInput = searchTextField;    $.cookie('textToSearch', expressionInput);    if (expressionInput.length < 1) {        // expression is invalid        alert(txt_enter_at_least_1_char);        // reactive la fenetre de search (utile car cadres)        document.searchForm.textToSearch.focus();    }    else {    var splitSpace = searchTextField.split(" ");       var splitWords = [];        for (var i = 0 ; i < splitSpace.length ; i++) {               var splitDot = splitSpace[i].split(".");                    if(!(splitDot.length == 1)){            splitWords.push(splitSpace[i]);          }                    for (var i1 = 0; i1 < splitDot.length; i1++) {               var splitColon = splitDot[i1].split(":");            for (var i2 = 0; i2 < splitColon.length; i2++) {                var splitDash = splitColon[i2].split("-");                 for (var i3 = 0; i3 < splitDash.length; i3++) {                     if (splitDash[i3].split("").length > 0) {                           splitWords.push(splitDash[i3]);                       }                 }            }          }       }       noWords = splitWords;    	if (noWords.length > 9){          // Allow to search maximum 10 words    		alert(txt_enter_more_than_10_words);    		expressionInput = '';    		for (var x = 0 ; x < 10 ; x++){    			expressionInput = expressionInput + " " + noWords[x];     		}    		    		Effectuer_recherche(expressionInput);    		document.searchForm.textToSearch.focus();    	} else {	        // Effectuer la recherche             expressionInput = '';          for (var x = 0 ; x < noWords.length ; x++) {                 expressionInput = expressionInput + " " + noWords[x];              }	        Effectuer_recherche(expressionInput);	        // reactive la fenetre de search (utile car cadres)	        document.searchForm.textToSearch.focus();            	}    }}var stemQueryMap = new Array();  // A hashtable which maps stems to query words/* This function parses the search expression, loads the indices and displays the results*/function Effectuer_recherche(expressionInput) {    /* Display a waiting message */    //DisplayWaitingMessage();    /*data initialisation*/    var searchFor = "";       // expression en lowercase et sans les caracte    res speciaux    //w = new Object();  // hashtable, key=word, value = list of the index of the html files    scriptLetterTab = new Scriptfirstchar(); // Array containing the first letter of each word to look for    var wordsList = new Array(); // Array with the words to look for    var finalWordsList = new Array(); // Array with the words to look for after removing spaces    var linkTab = new Array();    var fileAndWordList = new Array();    var txt_wordsnotfound = "";    // --------------------------------------    // Begin Thu's patch     /*nqu: expressionInput, la recherche est lower cased, plus remplacement des char speciaux*/    //The original replacement expression is:     //searchFor = expressionInput.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/\.|%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_");    //The above expression was error prone because it did not deal with words that have a . as part of the word correctly, for example, document.txt        //Do not automatically replace a . with a space    searchFor = expressionInput.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_");        //If it ends with a period, replace it with a space    searchFor = searchFor.replace(/[.]$/,"");    // End Thu's Patch    // ------------------------------------------    searchFor = searchFor.replace(/  +/g, " ");    searchFor = searchFor.replace(/ $/, "").replace(/^ /, "");    wordsList = searchFor.split(" ");    wordsList.sort();    //set the tokenizing method    useCJKTokenizing = typeof indexerLanguage != "undefined" && (indexerLanguage == "zh" || indexerLanguage == "ja" || indexerLanguage == "ko");    //If Lucene CJKTokenizer was used as the indexer, then useCJKTokenizing will be true. Else, do normal tokenizing.    // 2-gram tokenizinghappens in CJKTokenizing,     //If doStem then make tokenize with Stemmer    var finalArray;    if (doStem){	    if(useCJKTokenizing){	        finalWordsList = cjkTokenize(wordsList);          finalArray = finalWordsList;	    } else { 	        finalWordsList = tokenize(wordsList);          finalArray = finalWordsList;	    }    } else if(useCJKTokenizing){          finalWordsList = cjkTokenize(wordsList);          finalArray = finalWordsList;         } else{    //load the scripts with the indices: the following lines do not work on the server. To be corrected    /*if (IEBrowser) {     scriptsarray = loadTheIndexScripts (scriptLetterTab);     } */    /**     * Compare with the indexed words (in the w[] array), and push words that are in it to tempTab.     */    var tempTab = new Array();	    // ---------------------------------------    // Thu's patch    //Do not use associative array in for loop, for example:    //for(var t in finalWordsList)    //it causes errors when finalWordList contains     //stemmed words such as: kei from the stemmed word: key    for(var t=0;t<finalWordsList.length;++t){        var aWord=finalWordsList[t];        //w is a Map like Object, use the current word in finalWordList as the key        if(w[aWord] == undefined){            txt_wordsnotfound += aWord + " ";	        }        else{            tempTab.push(aWord);    		}    	}    	finalWordsList = tempTab;		    //Check all the inputs to see if the root words are in the finalWordsList, if not add them there    var inputs = expressionInput.split(' ');    // Thu's Patch     // -------------------------------------------        txt_wordsnotfound = expressionInput;	finalWordsList = removeDuplicate(finalWordsList);       }    if (finalWordsList.length) {      //search 'and' and 'or' one time      fileAndWordList = SortResults(finalWordsList);            if (fileAndWordList == undefined){        	var cpt = 0;      } else {      	  var cpt = fileAndWordList.length;		  var maxNumberOfWords = fileAndWordList[0][0].motsnb;      }	  if (cpt > 0){		var searchedWords = noWords.length;		var foundedWords  = fileAndWordList[0][0].motslisteDisplay.split(",").length;		//console.info("search : " + noWords.length + "   found : " + fileAndWordList[0][0].motslisteDisplay.split(",").length);		if (searchedWords != foundedWords){			linkTab.push(partialSearch);		}	  }	              for (var i = 0; i < cpt; i++) {						var hundredProcent = fileAndWordList[i][0].scoring + 100 * fileAndWordList[i][0].motsnb;			var ttScore_first = fileAndWordList[i][0].scoring;			var numberOfWords = fileAndWordList[i][0].motsnb;			            if (fileAndWordList[i] != undefined) {                linkTab.push("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + fileAndWordList[i][0].motslisteDisplay + "</span>" + "</p>");                linkTab.push("<ul class='searchresult'>");                for (t in fileAndWordList[i]) {                    //linkTab.push("<li><a href=\"../"+fl[fileAndWordList[i][t].filenb]+"\">"+fl[fileAndWordList[i][t].filenb]+"</a></li>");				                                            var ttInfo = fileAndWordList[i][t].filenb;                    // Get scoring                    var ttScore = fileAndWordList[i][t].scoring;                    var tempInfo = fil[ttInfo];				                        var pos1 = tempInfo.indexOf("@@@");                    var pos2 = tempInfo.lastIndexOf("@@@");                    var tempPath = tempInfo.substring(0, pos1);                    var tempTitle = tempInfo.substring(pos1 + 3, pos2);                    var tempShortdesc = tempInfo.substring(pos2 + 3, tempInfo.length);                                        // toc.html will not be displayed on search result                    if (tempPath == 'toc.html'){                        continue;                    }                    /*                    //file:///home/kasun/docbook/WEBHELP/webhelp-draft-output-format-idea/src/main/resources/web/webhelp/installation.html                    var linkString = "<li><a href=" + tempPath + ">" + tempTitle + "</a>";                    // var linkString = "<li><a href=\"installation.html\">" + tempTitle + "</a>";                    */                    var split = fileAndWordList[i][t].motsliste.split(",");                    // var splitedValues = expressionInput.split(" ");					// var finalArray = split.concat(splitedValues);										                    arrayString = 'Array(';                    for(var x in finalArray){                      if (finalArray[x].length > 2 || useCJKTokenizing){                    		arrayString+= "'" + finalArray[x] + "',";                    	}                     }                    arrayString = arrayString.substring(0,arrayString.length - 1) + ")";                    var idLink = 'foundLink' + no;                    var linkString = '<li><a id="' + idLink + '" href="' + tempPath + '" class="foundResult">' + tempTitle + '</a>';                    var starWidth = (ttScore * 100/ hundredProcent)/(ttScore_first/hundredProcent) * (numberOfWords/maxNumberOfWords);                    starWidth = starWidth < 10 ? (starWidth + 5) : starWidth;                    // Keep the 5 stars format                    if (starWidth > 85){						starWidth = 85;					}					/*					var noFullStars = Math.ceil(starWidth/17);					var fullStar  = "curr";					var emptyStar = "";					if (starWidth % 17 == 0){						// am stea plina											} else {											}					console.info(noFullStars);					*/                    // Also check if we have a valid description                    if ((tempShortdesc != "null" && tempShortdesc != '...')) {                                            linkString += "\n<div class=\"shortdesclink\">" + tempShortdesc + "</div>";                    }                    linkString += "</li>";                                        // Add rating values for scoring at the list of matches						linkString += "<div id=\"rightDiv\">";					linkString += "<div id=\"star\">";					//linkString += "<div style=\"color: rgb(136, 136, 136);\" id=\"starUser0\" class=\"user\">" 					//				+ ((ttScore * 100/ hundredProcent)/(ttScore_first/hundredProcent)) * 1 + "</div>";	                linkString += "<ul id=\"star0\" class=\"star\">";					linkString += "<li id=\"starCur0\" class=\"curr\" style=\"width: " + starWidth + "px;\"></li>";	                linkString += "</ul>";	                	                linkString += "<br style=\"clear: both;\">";	                linkString += "</div>";					linkString += "</div>";                    //linkString += '<b>Rating: ' + ttScore + '</b>';                                                               linkTab.push(linkString);                    no++;                }                linkTab.push("</ul>");            }        }    }    var results = "";    if (linkTab.length > 0) {         /*writeln ("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">"  + cleanwordsList + "</span>" + "<br/>"+"</p>");*/        results = "<p>";        //write("<ul class='searchresult'>");        for (t in linkTab) {            results += linkTab[t].toString();        }        results += "</p>";    } else {        results = "<p>" + localeresource.search_no_results + " <span class=\"searchExpression\">" + txt_wordsnotfound + "</span>" + "</p>";    }            // Verify if the browser is Google Chrome and the WebHelp is used on a local machine    // If browser is Google Chrome and WebHelp is used on a local machine a warning message will appear    // Highlighting will not work in this conditions. There is 2 workarounds    if (verifyBrowser()){        document.getElementById('searchResults').innerHTML = results;    } else {        document.getElementById('searchResults').innerHTML = warningMsg + results;    }    }// Verify if the stemmed word is aproximately the same as the searched wordfunction verifyWord(word, arr){	for (var i = 0 ; i < arr.length ; i++){		if (word[0] == arr[i][0] 			&& word[1] == arr[i][1] 			//&& word[2] == arr[i][2]			){			return true;		}	}	return false;}// Look for elements that start with searchedValue.function wordsStartsWith(searchedValue){	var toReturn = '';	for (var sv in w){		if (searchedValue.length < 3){			continue;		} else {			if (sv.toLowerCase().indexOf(searchedValue.toLowerCase()) == 0){				toReturn+=sv + ","; 			}		}	}	return toReturn.length > 0 ? toReturn : undefined;}function tokenize(wordsList){    var stemmedWordsList = new Array(); // Array with the words to look for after removing spaces    var cleanwordsList = new Array(); // Array with the words to look for    // -------------------------------------------------    // Thu's patch    for(var j=0;j<wordsList.length;++j){        var word = wordsList[j];        var originalWord=word;        if(typeof stemmer != "undefined" ){            var stemmedWord=stemmer(word);            if(w[stemmedWord]!=undefined){            stemQueryMap[stemmer(word)] = word;            }            else{                stemQueryMap[originalWord]=originalWord;            }        } else {            if(w[word]!=undefined){            stemQueryMap[word] = word;        }            else{                stemQueryMap[originalWord]=originalWord;            }        }    }      //stemmedWordsList is the stemmed list of words separated by spaces.    for (var t=0;t<wordsList.length;++t) {        wordsList[t] = wordsList[t].replace(/(%22)|^-/g, "");        if (wordsList[t] != "%20") {            scriptLetterTab.add(wordsList[t].charAt(0));            cleanwordsList.push(wordsList[t]);        }    }    if(typeof stemmer != "undefined" ){        //Do the stemming using Porter's stemming algorithm        for (var i = 0; i < cleanwordsList.length; i++) {			            var stemWord = stemmer(cleanwordsList[i]);			            if(w[stemWord]!=undefined){            stemmedWordsList.push(stemWord);        }            else{                stemmedWordsList.push(cleanwordsList[i]);                           }        }    // End Thu's patch    // -------------------------------------------    } else {        stemmedWordsList = cleanwordsList;    }    return stemmedWordsList;}//Invoker of CJKTokenizer class methods.function cjkTokenize(wordsList){    var allTokens= new Array();    var notCJKTokens= new Array();    var j=0;    for(j=0;j<wordsList.length;j++){        var word = wordsList[j];        if(getAvgAsciiValue(word) < 127){            notCJKTokens.push(word);        } else {             var tokenizer = new CJKTokenizer(word);            var tokensTmp = tokenizer.getAllTokens();            allTokens = allTokens.concat(tokensTmp);        }    }    allTokens = allTokens.concat(tokenize(notCJKTokens));    return allTokens;}//A simple way to determine whether the query is in english or not.function getAvgAsciiValue(word){    var tmp = 0;    var num = word.length < 5 ? word.length:5;    for(var i=0;i<num;i++){        if(i==5) break;        tmp += word.charCodeAt(i);    }    return tmp/num;}//CJKTokenizerfunction CJKTokenizer(input){    this.input = input;    this.offset=-1;    this.tokens = new Array();     this.incrementToken = incrementToken;    this.tokenize = tokenize;    this.getAllTokens = getAllTokens;    this.unique = unique;    function incrementToken(){		if(this.input.length - 2 <= this.offset){		//	console.log("false "+offset);			return false;		}		else {			this.offset+=1;			return true;		}	}	function tokenize(){		//document.getElementById("content").innerHTML += x.substring(offset,offset+2)+"<br>";		return this.input.substring(this.offset,this.offset+2);	}	function getAllTokens(){		while(this.incrementToken()){			var tmp = this.tokenize();			this.tokens.push(tmp);		}        return this.unique(this.tokens);//		document.getElementById("content").innerHTML += tokens+" ";//		document.getElementById("content").innerHTML += "<br>dada"+sortedTokens+" ";//		console.log(tokens.length+"dsdsds");		/*for(i=0;i<tokens.length;i++){			console.log(tokens[i]);			var ss = tokens[i] == sortedTokens[i];//			document.getElementById("content").innerHTML += "<br>dada"+un[i]+"- "+stems[i]+"   "+ ss;			document.getElementById("content").innerHTML += "<br>"+sortedTokens[i];		}*/	}	function unique(a)	{	   var r = new Array();	   o:for(var i = 0, n = a.length; i < n; i++)	   {	      for(var x = 0, y = r.length; x < y; x++)	      {		 if(r[x]==a[i]) continue o;	      }	      r[r.length] = a[i];	   }	   return r;	} }/* Scriptfirstchar: to gather the first letter of index js files to upload */function Scriptfirstchar() {    this.strLetters = "";    this.add = addLettre;}function addLettre(caract) {    if (this.strLetters == 'undefined') {        this.strLetters = caract;    } else if (this.strLetters.indexOf(caract) < 0) {        this.strLetters += caract;    }    return 0;}/* end of scriptfirstchar *//*main loader function*//*tab contains the first letters of each word looked for*/function loadTheIndexScripts(tab) {    //alert (tab.strLetters);    var scriptsarray = new Array();    for (var i = 0; i < tab.strLetters.length; i++) {        scriptsarray[i] = "..\/search" + "\/" + tab.strLetters.charAt(i) + ".js";    }    // add the list of html files    i++;    scriptsarray[i] = "..\/search" + "\/" + htmlfileList;    //debug    for (var t in scriptsarray) {        //alert (scriptsarray[t]);    }    tab = new ScriptLoader();    for (t in scriptsarray) {        tab.add(scriptsarray[t]);    }    tab.load();    //alert ("scripts loaded");    return (scriptsarray);}/* ScriptLoader: to load the scripts and wait that it's finished */function ScriptLoader() {    this.cpt = 0;    this.scriptTab = new Array();    this.add = addAScriptInTheList;    this.load = loadTheScripts;    this.onScriptLoaded = onScriptLoadedFunc;}function addAScriptInTheList(scriptPath) {    this.scriptTab.push(scriptPath);}function loadTheScripts() {    var script;    var head;    head = document.getElementsByTagName('head').item(0);    //script = document.createElement('script');    for (var el in this.scriptTab) {        //alert (el+this.scriptTab[el]);        script = document.createElement('script');        script.src = this.scriptTab[el];        script.type = 'text/javascript';        script.defer = false;        head.appendChild(script);    }}function onScriptLoadedFunc(e) {    e = e || window.event;    var target = e.target || e.srcElement;    var isComplete = true;    if (typeof target.readyState != undefined) {        isComplete = (target.readyState == "complete" || target.readyState == "loaded");    }    if (isComplete) {        ScriptLoader.cpt++;        if (ScriptLoader.cpt == ScriptLoader.scripts.length) {            ScriptLoader.onLoadComplete();        }    }}/*function onLoadComplete() {    alert("loaded !!");} *//* End of scriptloader functions */ // Array.unique( strict ) - Remove duplicate valuesfunction unique(tab) {    var a = new Array();    var i;    var l = tab.length;    if (tab[0] != undefined) {        a[0] = tab[0];    }    else {        return -1;    }    for (i = 1; i < l; i++) {        if (indexof(a, tab[i], 0) < 0) {            a.push(tab[i]);        }    }    return a;}function indexof(tab, element, begin) {    for (var i = begin; i < tab.length; i++) {        if (tab[i] == element) {            return i;        }    }    return -1;}/* end of Array functions *//* Param: mots= list of words to look for. This function creates an hashtable: - The key is the index of a html file which contains a word to look for. - The value is the list of all words contained in the html file. Return value: the hashtable fileAndWordList */function SortResults(mots) {    var fileAndWordList = new Object();    if (mots.length == 0 || mots[0].length == 0) {        return null;    }            // In generated js file we add scoring at the end of the word    // Example word1*scoringForWord1,word2*scoringForWord2 and so on    // Split after * to obtain the right values    var scoringArr = Array();    for (var t in mots) {        // get the list of the indices of the files.        var listNumerosDesFicStr = w[mots[t].toString()];        if (listNumerosDesFicStr != undefined) {            //alert ("listNumerosDesFicStr "+listNumerosDesFicStr);            var tab = listNumerosDesFicStr.split(",");            //for each file (file's index):            for (var t2 in tab) {                var tmp = '';                var idx = '';                var temp = tab[t2].toString();                if (temp.indexOf('*') != -1) {                    idx = temp.indexOf('*');                    tmp = temp.substring(idx + 3, temp.length);                    temp = temp.substring(0, idx);                }                scoringArr.push(tmp);                if (fileAndWordList[temp] == undefined) {                    fileAndWordList[temp] = "" + mots[t];                } else {                    fileAndWordList[temp] += "," + mots[t];                }                //console.info("fileAndWordList[" + temp + "]=" + fileAndWordList[temp] + " : " + tmp);            }        }    }    var fileAndWordListValuesOnly = new Array();    // sort results according to values    var temptab = new Array();    finalObj = new Array();    for (t in fileAndWordList) {    	    	finalObj.push(new newObj(t,fileAndWordList[t]));    }    if ( finalObj.length == 0 ) {   // None of the queried words are not in the index (stemmed or not)        return null;    }    finalObj = removeDerivates(finalObj);    for (t in finalObj) {        tab = finalObj[t].wordList.split(',');        var tempDisplay = new Array();        for (var x in tab) {        		            if(stemQueryMap[tab[x]] != undefined && doStem){                tempDisplay.push(stemQueryMap[tab[x]]); //get the original word from the stem word.                            } else {                tempDisplay.push(tab[x]); //no stem is available. (probably a CJK language)            }        }        var tempDispString = tempDisplay.join(", ");				var index;				for (x in fileAndWordList) {					if (x === finalObj[t].filesNo) {						index = x;						break;					}				}				var scoring = findRating(fileAndWordList[index], index);	        temptab.push(new resultPerFile(finalObj[t].filesNo, finalObj[t].wordList, tab.length, tempDispString, scoring));        fileAndWordListValuesOnly.push(finalObj[t].wordList);            }    fileAndWordListValuesOnly = unique(fileAndWordListValuesOnly);    fileAndWordListValuesOnly = fileAndWordListValuesOnly.sort(compare_nbMots);    var listToOutput = new Array();    for (var fawlvoIdx in fileAndWordListValuesOnly) {        for (t in temptab) {            if (temptab[t].motsliste == fileAndWordListValuesOnly[fawlvoIdx]) {                if (listToOutput[fawlvoIdx] == undefined) {                    listToOutput[fawlvoIdx] = new Array(temptab[t]);                } else {                    listToOutput[fawlvoIdx].push(temptab[t]);                }            }        }    }		  // Sort results by scoring, descending on the same group	for (var ltoIdx in listToOutput) {	    listToOutput[ltoIdx].sort(function(a, b){			return b.scoring - a.scoring;		});	}	// If we have groups with same number of words, 	// will sort groups by higher scoring of each group	for (var i = 0; i < listToOutput.length - 1; i++) {		for (var j = i + 1; j < listToOutput.length; j++) {			if (listToOutput[i][0].motsnb < listToOutput[j][0].motsnb 				|| (listToOutput[i][0].motsnb == listToOutput[j][0].motsnb				&& listToOutput[i][0].scoring < listToOutput[j][0].scoring)				) {				var x = listToOutput[i];				listToOutput[i] = listToOutput[j];				listToOutput[j] = x;			}		}	}    return listToOutput;}// Remove derivates words from the list of wordsfunction removeDerivates(obj){	var toResultObject = new Array();		for (i in obj){		var filesNo  = obj[i].filesNo;		var wordList = obj[i].wordList;		var wList = wordList.split(",");				var searchedWords = searchTextField.toLowerCase().split(" ");		for (var k = 0 ; k < searchedWords.length ; k++){			for (var j = 0 ; j < wList.length ; j++){								if (wList[j].startsWith(searchedWords[k])){					wList[j] = searchedWords[k];				}			}		}		wList = removeDuplicate(wList);		var recreateList = '';		for(var x in wList){			recreateList+=wList[x] + ",";		}		recreateList = recreateList.substr(0, recreateList.length - 1);		toResultObject.push(new newObj(filesNo, recreateList));	}	return toResultObject;}function newObj(filesNo, wordList){	this.filesNo = filesNo;	this.wordList = wordList;}// Add a new parameter. Scoring.function resultPerFile(filenb, motsliste, motsnb, motslisteDisplay, scoring, group) {	//10 - spring,time - 2 - spring, time - 55 - 3    this.filenb = filenb;    this.motsliste = motsliste;    this.motsnb = motsnb;    this.motslisteDisplay= motslisteDisplay;        this.scoring = scoring;    }function findRating(words, nr){    var sum = 0;    var xx = words.split(',');    for (jj = 0 ; jj < xx.length ; jj++){        var wrd = w[xx[jj]].split(',');        for (var ii = 0 ; ii < wrd.length ; ii++){            var wrdno = wrd[ii].split('*');            if (wrdno[0] == nr){                sum+=parseInt(wrdno[1]);            }        }    }    return sum;}function compare_nbMots(s1, s2) {    var t1 = s1.split(',');    var t2 = s2.split(',');    //alert ("s1:"+t1.length + " " +t2.length)    if (t1.length == t2.length) {        return 0;    } else if (t1.length > t2.length) {        return 1;    } else {        return -1;    }    //return t1.length - t2.length);}// return false if browser is Google Chrome and WebHelp is used on a local machine, not a web server function verifyBrowser(){    var returnedValue = true;        var browser = BrowserDetect.browser;    var addressBar = window.location.href;    if (browser == 'Chrome' && addressBar.indexOf('file://') === 0){        returnedValue = false;    }        return returnedValue;}// Remove duplicate values from an arrayfunction removeDuplicate(arr) {   var r = new Array();   o:for(var i = 0, n = arr.length; i < n; i++) {      for(var x = 0, y = r.length; x < y; x++) {         if(r[x]==arr[i]) continue o;      }      r[r.length] = arr[i];   }   return r;}// Create startsWith methodString.prototype.startsWith = function(str) {	return (this.match("^"+str)==str);}function trim(str, chars) {	return ltrim(rtrim(str, chars), chars);} function ltrim(str, chars) {	chars = chars || "\\s";	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");} function rtrim(str, chars) {	chars = chars || "\\s";	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");}
 |