//******************************************************* 
//
//   Easy Search Builder - www.easy-search-builder.com
//   author: Srdjan Arsic (srdjanarsic@yahoo.com)
//   Copyright Â© Srdjan ArsiÄ‡, 2003.
//
//   file: esb_engine.js
//   
//*******************************************************

var searchName="pretraga.html";
var CharacterPerRecords = 150;
var RowPerRecords=2;
var ResultPerPage = 10;
var AddDots = true;
var AutoJoker = true;
var LanguageChar = true;
var sirinaOpsega = CharacterPerRecords;
var groupId=0;
var ShowKoeficijent=0.5;
var ShowCase=0; // 0 Za prikaz samo poruke; 1 Za prikaz i poruke i rezultata; 2 Za pikaz rezultata samo
var ToPrint="";
var AllTextToSearch="";

function engineVars(){
	this.wordPerPage=0;
	this.position = new Array();
	return this;
}

function parametri(i){
	this.pageId=0;
	this.unique=0;
	this.uniqueInOpseg=0;
	this.wordPerPage=0;
	this.ever=new Array(i);
	return this;
}

function Opseg(){
	this.uniqueWords=0;
	this.allWords=0;
	this.wordsPosition=new Array();
	this.uniqueWordsArray=new Array();
	this.leftIndex=0;
	this.rightIndex=0;
	this.sirina=0;
	return this;
}

function search(SrchTxt,PageNo) {

	// grupa
	if(SrchTxt==""){return void(0);}

	if(Groups.length>1){document.form.grupa[groupId].checked=true;}; // Vracanje grupe
	document.form.keywords.value=SrchTxt; // Vracanje texta
	document.form.pageId.value=PageNo; // Pracenje na kojoj je strani 

	var enginWordPerPageLimit=20; // Promena ove promenljive moze izazvati pad performansi pretrage
	var Engine=new Array();
	var SrchTxtArray = new Array();
	var SrchTxtClean = "";
	var SrchTxtCleanArray = new Array();
	var SrchTxtCleanNoLangArray = new Array();
	var words="";

	SrchTxtArray = SrchTxt.split(" ");
	while(SrchTxtArray.length>10){
		SrchTxtArray.pop();
	}

	words=statusWords(SrchTxtArray); // za status linuju

	count=0;
	for(i=0;i<SrchTxtArray.length;i++){
		SrchTxtArray[i]=removeRegExpChar(SrchTxtArray[i]);
		if(SrchTxtArray[i].length>2){
			SrchTxtCleanNoLangArray[count] = SrchTxtArray[i];
			SrchTxtClean = SrchTxtClean + SrchTxtCleanNoLangArray[count] +" ";
			count++;
		}
	}

	SrchTxtClean = SrchTxtClean.substr(0,SrchTxtClean.length-1);
	// Sada imamo SrchTxtClean i SrchTxtCleanArray koje sadrze recivece od tri slova.

	// Za osisane karaktere
	if(LanguageChar){SrchTxtCleanArray=LangCharAdd(SrchTxtCleanNoLangArray);}
	else{SrchTxtCleanArray=SrchTxtCleanNoLangArray;}

	// Smanjenje enginWordPerPageLimit promenljive 
	enginWordPerPageLimit-=Math.round(Data.length/10); // na osnovu broja strana
	enginWordPerPageLimit-=SrchTxtCleanArray.length; // na osnovu reci za pretragu

	// GLAVNA PETLJA ZA formiranje indexa
	pagesCount=0;
	var regText="";
	for(i=0;i<Data.length;i++){
		if(Data[i]!=undefined){
			AllTextToSearch=Data[i][0]+Data[i][1]; //+Data[i][2];
			if(Groups[groupId].pages[i]==1){ // Provera dali je u grupi
				var postojiBilokoja = false;
				for(k=0;k<SrchTxtCleanArray.length;k++){
						regText=SrchTxtCleanArray[k];
						if(AutoJoker==false){regText=" "+regText+" ";}
						regexp = new RegExp(regText,"ig")
						//regexp=eval("/"+regText+"/ig");
						postojiUnique=false;
						while(true){
								result = regexp.exec(AllTextToSearch);
								if(result == null){break;}
								if(Engine[pagesCount] != "[object Object]" ) Engine[pagesCount] = new parametri(SrchTxtCleanArray.length);	
								if(Engine[pagesCount].ever[k] != "[object Object]" )	Engine[pagesCount].ever[k] = new engineVars();
								Engine[pagesCount].ever[k].wordPerPage++;
								Engine[pagesCount].wordPerPage++;
								Engine[pagesCount].ever[k].position[Engine[pagesCount].ever[k].position.length]=result.index;
								postojiUnique=true;
								postojiBilokoja=true;
						}	
						if(postojiUnique==true) {
							Engine[pagesCount].unique++;
							Engine[pagesCount].pageID=i;
						}
				}
				if(postojiBilokoja){pagesCount++;}
			}
		}
	}

	// Pronalazenje svih opsega i sortiranje po redosledu >unukati>rastojanje>svereci
	var opseg=new Array();
	for (n=0; n<Engine.length; n++) { // Sa sve strane
		//TMP_OPS+=Engine[n].pageID+"\n";
		opseg[n]=new Array();
		var o=0;
		for (i=SrchTxtCleanArray.length-1; i>=0; i--) { // Za sve reci
			if(Engine[n].ever[i]=="[object Object]"){
					maxPonavljanja=Engine[n].ever[i].position.length;
					if(maxPonavljanja>enginWordPerPageLimit){maxPonavljanja = enginWordPerPageLimit;}
				for(j=maxPonavljanja-1; j>=0; j--){	// Za svako ponavljanje ***

					for (k=i; k>=0; k--)	{		// Za sve reci
						if(true){ //if (i!=k){
							if(Engine[n].ever[k]=="[object Object]"){
								for(m=j; m>=0; m--){	// Za svako ponavljanje ***
									if(opseg[n][o]!="[object Object]"){
										opseg[n][o]=new Opseg();
										opseg[n][o].wordsPosition[opseg[n][o].wordsPosition.length] = Engine[n].ever[i].position[j];
										opseg[n][o].uniqueWords++;
										opseg[n][o].allWords++;
										opseg[n][o].uniqueWordsArray[i]=true;
										opseg[n][o].leftIndex=Engine[n].ever[i].position[j]-sirinaOpsega;
										opseg[n][o].rightIndex=Engine[n].ever[i].position[j]+sirinaOpsega;
										opseg[n][o].sirina=opseg[n][o].rightIndex-opseg[n][o].leftIndex;
									}
									wordDist=Engine[n].ever[i].position[j]-Engine[n].ever[k].position[m]; //RASTOJANJ IZMEDJU RECI
									if(wordDist!=0){
										if(Engine[n].ever[k].position[m] > opseg[n][o].leftIndex && Engine[n].ever[k].position[m]<opseg[n][o].rightIndex){
											//Ako je u opsegu!
											p=opseg[n][o].wordsPosition.length
											opseg[n][o].wordsPosition[p] = Engine[n].ever[k].position[m]
											opseg[n][o].wordsPosition=aSort(opseg[n][o].wordsPosition);
											if(opseg[n][o].uniqueWordsArray[k]!=true){opseg[n][o].uniqueWords++;}
											opseg[n][o].allWords++;
											opseg[n][o].uniqueWordsArray[k]=true;
											opseg[n][o].leftIndex=opseg[n][o].wordsPosition[0]-sirinaOpsega
											opseg[n][o].rightIndex=opseg[n][o].wordsPosition[p]+sirinaOpsega
											opseg[n][o].sirina=opseg[n][o].rightIndex-opseg[n][o].leftIndex;
											//kraj u opsegu
										}
									}
								}
							}
						}
					}
					o++;
				}
			}
		}
		//Sortiranje opsega prema >unukati>rastojanje>svereci
		for (var z=0;z<opseg[n].length; z++) {
			for (var a=0; a<=z; a++) {
				if (opseg[n][z].uniqueWords > opseg[n][a].uniqueWords) {
						zameniOpseg(n,z,a,opseg)
				}
				else if (opseg[n][z].uniqueWords == opseg[n][a].uniqueWords){
					if(opseg[n][z].sirina > opseg[n][a].sirina){		
						zameniOpseg(n,z,a,opseg)
					}
					else if(opseg[n][z].sirina == opseg[n][z].sirina){
						if(opseg[n][z].allWord > opseg[n][z].allWord){
							zameniOpseg(n,z,a,opseg)
						}
					}
				}
			}	
		}
		//kraj sortiranja
	}

	// Glavno sortiranje >> unukati u opsegu >> rastojanje >> svereciopseg >> sverecistrana
	for (var i=0; i<Engine.length; i++) {
		for (var j=0; j<=i; j++) {
			if (opseg[i][0].uniqueWords > opseg[j][0].uniqueWords) {
				zameni(i,j,Engine,opseg)
			}
			else if (opseg[i][0].uniqueWords == opseg[j][0].uniqueWords){
				if(opseg[i][0].sirina > opseg[j][0].sirina){		
					zameni(i,j,Engine,opseg)
				}
				else if(opseg[i][0].sirina == opseg[j][0].sirina){
					if(opseg[i][0].allWord > opseg[j][0].allWord){
						zameni(i,j,Engine,opseg)
					}
					else if(opseg[i][0].allWord == opseg[j][0].allWord){
						if(	Engine[i].wordPerPage > Engine[j].wordPerPage){
							zameni(i,j,Engine,opseg)
						}
					}
				}
			}
		}	
	}
	

	// Ako ima pogodaka
	if(Engine.length>0){

		// Za reci koje se ponavljaju na svim stranama
		var TEST="";
		var maxWords=0;
		//samo odredjivanje max vrednosti
		for (var i=0; i<Engine.length; i++) {
			if(Engine[i].unique > maxWords){
				var countResultPages=0;
				maxWords=Engine[i].unique;
			}
			if(maxWords==Engine[i].unique){
				countResultPages++;
			}
		}
		// akcija
		if((countResultPages/Data.length)>ShowKoeficijent){
			if(!(ShowCase==2))
				ToPrint+=showManyResult(words);
				if(ShowCase==1){
					scroll(0,0)
					writetolayer("list",ToPrint);
					ToPrint="";
					return void(0);				
				}
		}

		start=(PageNo-1)*ResultPerPage
		end=start+ResultPerPage;
		if(Engine.length<end){end=Engine.length}

		htmlStatusRow=statusRow(words,start+1,end,Engine.length, Math.ceil(Engine.length/ResultPerPage))
		htmlLinks=linksRow(Math.ceil(Engine.length/ResultPerPage),PageNo,SrchTxt);

		ToPrint+=htmlStatusRow
		ToPrint+=htmlLinks

		for(i=start;i<end;i++){
			AddRecord(Engine[i].pageID,opseg[i][0].leftIndex,opseg[i][0].rightIndex,SrchTxtClean,SrchTxtCleanArray,Engine[i].ever)
		}

		ToPrint+=htmlLinks
		ToPrint+=htmlStatusRow
		
		//Ne dirati ovaj deo ( Procitati: http://www.easy-search-builder.com/pravila.php )
		ToPrint+="<!--ne dirati odavde--><p align=\"right\" class=\"esb_p\"><font color=\"#444444\">Powered by </font><a href=\"http://www.easy-search-builder.com\"><font color=\"#444444\"><font color=\"#FF9933\">E</font>asy <font color=\"#FF9933\">S</font>earch <font color=\"#FF9933\">B</font>uilder</font></a></p><!--ne dirati-->";
	}
	// Ako nista nije pronadjeno
	else{
		ToPrint=showNoMatch(words);
	}
	scroll(0,0)
	writetolayer("list",ToPrint);
	ToPrint="";
	 void(0);
}

function showManyResult(words){
		tmp="<p class=\"esb_p\"><b>Tražene reèi \''"+words+"'\' se nalaze u skoro svim stranama sajta</b></p><blockquote class=\"esb_p\" style=\"margin-left:25\"><p class=\"esb_p\">Pokušajte sa dodatnim reèima<br>Koristiti preciznije reèi</p></blockquote>";
	return tmp;
}

function showNoMatch(words){
	tmp="<p class=\"esb_p\"> <b>Za tražene reèi \''"+words+"'\' nije pronaðena ni jedna strana</b></p><blockquote class=\"esb_p\" style=\"margin-left:25\"><p class=\"esb_p\">Proverite slovnu ispravnost<br>Pokušajte sa sliènim reèima<br>Reèi koje su manje od tri karaktera se ignorišu</p></blockquote>";
	return tmp;
}

function statusRow(words,first,last,ukupno,strana){
	tmp="<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td align=\"left\"  class=\"esb_statusTD\"> <p class=\"esb_p\">Rezultat pretrage: "+words+"</p></td><td align=\"right\"  class=\"esb_statusTD\"><p class=\"esb_p\"><nobr> Rezultati  <strong>"+first+"-"+last+"</strong> od <strong>"+ukupno+"</strong>.  Ukupno strana : <strong>"+strana+"</strong></p></td></tr></table>";
	return tmp;
}

function linksRow(ukupnoStrana,trenutnaStrana,SrchTxt){
	tmp="<p style=\"text-align:center;\" class=\"esb_p\">";
	if(trenutnaStrana==1){
		tmp+="<font class=\"esb_nolink\">&lt;&lt; Prethodna strana</font>&nbsp;&nbsp; ";
	}
	else{
		prethodna=trenutnaStrana-1;
		tmp+="<a href=\"javascript:search('"+SrchTxt+"',"+prethodna+");\" class=\"esb_link\">&lt;&lt; Prethodna strana</a>&nbsp;&nbsp;";
	}
	tmp+=	"<strong>"
	for(i=1;i<=ukupnoStrana;i++){
		if(i==trenutnaStrana){
			tmp+=" "+ i +" ";
		}
		else{
			tmp+=" <a href=\"javascript:search('"+SrchTxt+"',"+i+")\" class=\"esb_link\">"+i+"</a> ";
		}
	}
	tmp+=	"</strong>"
	if(trenutnaStrana==ukupnoStrana){
		tmp+=" &nbsp;&nbsp;<font class=\"esb_nolink\">Sledeca strana &gt;&gt;</font>";
	}
	else{
		sledeca=(trenutnaStrana-1)+2;
		tmp+=" &nbsp;&nbsp;<a href=\"javascript:search('"+SrchTxt+"',"+sledeca+")\" class=\"esb_link\">Sledeca strana &gt;&gt;</a>";
	}
	tmp+="</p>"
	return tmp;
}

function statusWords(arr){
	tmp="<strong>"
	for(i=0;i<arr.length;i++){
		if(arr[i].length<3){
			tmp+="<font class=\"esb_ignoreword\">"+arr[i]+"</font> ";
		}
		else{
			tmp+=arr[i]+" ";
		}
	}
	tmp+="</strong>"
	return tmp;
}

function zameni(i,j,Engine,opseg){
	s=Engine[i]
	Engine[i]=Engine[j]
	Engine[j]=s
	s=opseg[i]
	opseg[i]=opseg[j]
	opseg[j]=s
}
function zameniOpseg(n,i,j,opseg){
	s=opseg[n][i]
	opseg[n][i]=opseg[n][j]
	opseg[n][j]=s
}

function AddRecord(PageId,StartIndex,EndIndex,SrchTxtClean,SrchTxtCleanArray,wordsEver){

	//alert(StartIndex+" :: "+EndIndex)

	var TextRow="";
	var HtmlRow="";

	TextLength=Data[PageId][1].length;
	CapturedLength=EndIndex-StartIndex;

	IndexS=StartIndex-((CharacterPerRecords-CapturedLength)/2);
	IndexE=IndexS+CharacterPerRecords;

	pageTitle=Data[PageId][0];
	pageData=Data[PageId][1];

	// Pravimo glavni string
	if(IndexS>0 && IndexE<TextLength){
		TextRow=pageData.substr(IndexS,IndexE-IndexS);
		TextRow=TextRow.substr(TextRow.indexOf(" "),TextRow.lastIndexOf(" ")-TextRow.indexOf(" "))
		if(AddDots) TextRow="..."+TextRow+"...";
		//alert("1:= "+TextRow);
	}
	else if(IndexS<=0 && IndexE>=TextLength){
		TextRow=pageData
		//alert("2:= "+TextRow);
	}
	else if(IndexS>=0 && IndexE>TextLength)
	{
		TextRow=pageData.substr(TextLength-CharacterPerRecords,CharacterPerRecords);
		TextRow=TextRow.substr(TextRow.indexOf(" "),TextRow.length-TextRow.indexOf(" "))
		if(AddDots) TextRow="..."+TextRow;
		//alert("3:= "+TextRow);
	}
	else if(IndexS<0 && IndexE<=TextLength)
	{
		TextRow=pageData.substr(0,CharacterPerRecords);
		TextRow=TextRow.substr(0,TextRow.lastIndexOf(" "))
		if(AddDots) TextRow=TextRow+"...";
		//alert("4:= "+TextRow);
	}
	else if(IndexS==0 && IndexE<TextLength)
	{
		TextRow=pageData.substr(0,CharacterPerRecords);
		TextRow=TextRow.substr(0,TextRow.lastIndexOf(" "))
		if(AddDots) TextRow=TextRow+"...";
		//alert("5:= "+TextRow);
	}
	else if(IndexS>0 && IndexE==TextLength)
	{
		TextRow=pageData.substr(TextLength-CharacterPerRecords,CharacterPerRecords);
		TextRow=TextRow.substr(TextRow.indexOf(" "),TextRow.length-TextRow.indexOf(" "))
		if(AddDots) TextRow="..."+TextRow;
		//alert("6:= "+TextRow);
	}
	
	//Da rasparcamo na /RowPerRecords/ redova
	TextRowArray= new Array(RowPerRecords)
	perRow=Math.round(CharacterPerRecords/RowPerRecords);
	x=0;
	for(i=0;i<RowPerRecords-1;i++){
		TextRowArray[i]=TextRow.substr(x,perRow)
		y=TextRowArray[i].lastIndexOf(" ")
		TextRowArray[i]=TextRowArray[i].substr(0,y)
		x+=y;
	}
	TextRowArray[RowPerRecords-1]=TextRow.substr(x)
	TextRow=TextRowArray.join("<br>");

	//Pravimo kompletan red
	tmp=SrchTxtClean.split(" ");
	HtmlRow="<p class=\"esb_p\"><a href=\""+ Data[PageId][2] +"\"  class=\"esb_title\">"+markWord(pageTitle,SrchTxtCleanArray,SrchTxtClean)+"</a></p>"; //title
	if(TextRow.replace(/<br>/g , "")!=""){
		HtmlRow+="<p class=\"esb_p\">"+markWord(TextRow,SrchTxtCleanArray,SrchTxtClean)+"</p>"; //text
	}
	HtmlRow+="<p class=\"esb_p\"><font class=\"esb_url\">"+Data[PageId][2]+"</font></p>"; //url
	HtmlRow+="<p class=\"esb_p\"><font class=\"esb_words\">";

	for(i=0;i<tmp.length;i++){
		tmpnum=0;
		if(wordsEver[i]=="[object Object]"){
			tmpnum=wordsEver[i].wordPerPage
			}
			HtmlRow+=tmp[i]+"("+tmpnum+")&nbsp;&nbsp;";
		
	}
	HtmlRow+="</font></p>"

	//Kompletan red dodajemo u ToPrint
	ToPrint+=HtmlRow

}

// Boldovanje 
function markWord(str,SrchTxtCleanArray,SrchTxtClean){
	indexi=new Array();
	indexiLast=new Array();
	tmp=new Array();
	tmp =	SrchTxtClean.split(" ");
	for(i=0;i<SrchTxtCleanArray.length;i++){
			regexp = eval("/"+ SrchTxtCleanArray[i] +"/ig");
			while(true){
				result = regexp.exec(str);
				if(result == null){break;}
				indexi[indexi.length]=result.index
				indexiLast[indexiLast.length]=result.index + tmp[i].length
			}
	}

	indexi=dSort(indexi);
	indexiLast=dSort(indexiLast);

	for(t=0;t<indexi.length;t++){
		firstPart=str.substr(0,indexi[t]+(t*7));
		lastPart=str.substr(indexi[t]+(t*7));
		str=firstPart+"<b>"+lastPart;
		firstPart=str.substr(0,indexiLast[t]+3+(t*7));
		lastPart=str.substr(indexiLast[t]+3+(t*7));
		str=firstPart+"</b>"+lastPart;
	}
	return str;
}

function aSort(arr) {
	for (var i=arr.length-1; i>=0; i--) {
		for (var j=i; j>=0; j--) {
			if (arr[i]>arr[j]) {
				s=arr[i]
				arr[i]=arr[j]
				arr[j]=s
			}
		}	
	}
	return arr
}

function dSort(arr) {
	for (var i=arr.length-1; i>=0; i--) {
		for (var j=i; j>=0; j--) {
			if (arr[i]<arr[j]) {
				s=arr[i]
				arr[i]=arr[j]
				arr[j]=s
			}
		}	
	}
	return arr
}

function LangCharAdd(str){
	for (i=0;i<str.length;i++){
		str[i] = str[i].replace( /D/g , "[D|Ð]");
str[i] = str[i].replace( /Z/g , "[Z|Ž]");
str[i] = str[i].replace( /S/g , "[S|Š]");
str[i] = str[i].replace( /C/g , "[C|Æ|È]");
str[i] = str[i].replace( /d/g , "[d|ð]");
str[i] = str[i].replace( /z/g , "[z|ž]");
str[i] = str[i].replace( /s/g , "[s|š]");
str[i] = str[i].replace( /c/g , "[c|è|æ]");

	}
	return str;
}

function removeRegExpChar(str){
	chars = new Array("{","}","(",")","*","[","]");
	for(i=0;i<chars.length;i++){
		while(str.indexOf(chars[i])!=-1){
			str=str.substr(0,str.indexOf(chars[i]))+str.substr(str.indexOf(chars[i])+1)
		}
	}
	return str
}

function setGropuId(){
	groupId=0;
	if(Groups.length>1){
		for(i=0;i<document.form.grupa.length;i++){
			if(document.form.grupa[i].checked){
				groupId=document.form.grupa[i].value;
			}
		}
	}
	document.form.groupId.value=groupId; //Za back dugme
}

// browser
var ie4 = (document.all) ? true : false;
var ns4 = (document.layers) ? true : false;
var ns6 = (document.getElementById && !document.all) ? true : false;

function writetolayer(lay,txt)
{
if (ie4) {
    document.all[lay].innerHTML = txt;
    }
if (ns4) {
    document[lay].document.write(txt);
    document[lay].document.close();
    }
if (ns6) {
    over = document.getElementById([lay]);
    range = document.createRange();
    range.setStartBefore(over);
    domfrag = range.createContextualFragment(txt);
    while (over.hasChildNodes())
        {
        over.removeChild(over.lastChild);
        }
    over.appendChild(domfrag);
    }
}

// uskoro..
//function report_error(msg, url, line)
//{
//}
//window.onerror = report_error;
