var currOccurence = 0;
var occCount = 0;

var oldColor = "";
var oldbgColor = "";

function searchNext(){
  searchPostMessage("");

  synchronizeTabs();

  index = findNearestToCurrent("up");

  switch(searchStateControll){
    case searchStateSegment:
      if (switchIndexes(index+1)){
          searchPositionControll = searchPositionFirst;
      }
      searchStateControll = searchStatePhrase;
    break;

    case searchStatePhrase:
      switchNextOccuerence();
    break;
  }
}

function searchPrev(){
  searchPostMessage("");

  synchronizeTabs();

  index = findNearestToCurrent("up");

  switch(searchStateControll){
    case searchStateSegment:
      if (switchIndexes(index-1)){
          searchPositionControll = searchPositionLast;
      }
      searchStateControll = searchStatePhrase;
    break;

    case searchStatePhrase:
      switchPrevOccuerence();
    break;
  }
}

function switchNextOccuerence(){
    var res =  switchOccurence(currOccurence+1);
    if (res==-1){
        searchStateControll  =  searchStateSegment;
        searchNext();
    } else {
        currOccurence = res;
    }
}

function switchPrevOccuerence(){
    var res = switchOccurence(currOccurence-1);
    if (res==-1){
        searchStateControll  =  searchStateSegment;
        searchPrev();
    } else {
        currOccurence = res;
    }
}

function switchOccurence(newIndex){
    if (newIndex < 0 || newIndex >= occCount){
        return -1;
    }

    removeCurrentHighLight();

    element = document.getElementById("highlight"+newIndex);
    if (element)  // if something goes wrong
       setHighLight(element);

    return newIndex;
}

function removeCurrentHighLight(){
   element = document.getElementById("highlight"+currOccurence);
    if (element)  // if something goes wrong
        removeHighLight(element);
}

function switchIndexes(index){
    if ((index >= searchIndexes.length) || (index < 0)){
        searchPostMessage("End is reached");
        return false;
    }
    try{
        switchToSegment(searchIndexes[index].segment)
    } catch (e){
        return false;
    }
    return true;
}

function findNearestToCurrent(dir){

    var retIndex = dir != "down" ? -1 : searchIndexes.length;

    for (i = 0 ; i < searchIndexes.length; i++){
       if (dir!="down"){
        if (searchIndexes[i].segment <= curIndex){
            retIndex = i;
        }
       } else {
         if (searchIndexes[i].segment >= curIndex){
            retIndex = i;
        }
       }
    }



    return retIndex;
}

function findCurrent(){

    searchIndex  = findNearestToCurrent();

    if (searchIndex >=  searchIndexes.length || searchIndex < 0) {
        return  -1;
    }

    return searchIndex
}

function searchInit(){
   	if (displaySearchBox) {
        document.getElementById("searchBox").style.visibility = "visible";
    } else {
        return;
    }

   /* if (fromContextMode){
        if (searchIndexes.length == 0){
            alert("Nothing found for input string \""+searchString+ "\"")
        }
    }*/
    if (searchIndexes.length == 0)  return;

    if (!searchCheckLoad()){
        setTimeout("searchInit()",1000);
        return;
    }

    searchPositionControll = searchPositionFirst;

    ctrl = document.getElementById("searchControll");

    ctrl.style.visibility = "visible";

    synchronizeTabs();

    index = 0;
    if ((searchIndexes[index].segment != curIndex) || fromContextMode)
        switchIndexes(index);
}

function synchronizeTabs(){
    tabNeeded = document.getElementById("tabShowTransNoteBox");
    toggleBoxView(tabNeeded);
}

function searchHighLightFirst(){
    if (searchIndexes.length == 0)  return;

/*    if (!searchCheckLoad()){
        setTimeout("searchHighLightFirst()",1000);
        return;
    }
 */

    switch (searchPositionControll){
        case searchPositionFirst:
          currOccurence = 0;
        break;

        case searchPositionLast:
          currOccurence = occCount-1;
        break;
    }

    element = document.getElementById("highlight"+currOccurence);
    if (element)  // if something goes wrong
       setHighLight(element);
}

function searchCheckLoad(){
    return (tocDone && transcriptDone && notesDone);
}

function createPhraseList(){
    resArray = new Array();

    searchIndex  = findNearestToCurrent();

    if (searchIndex >=  searchIndexes.length || searchIndex < 0) {
        return  resArray;
    }

    var array = searchIndexes[searchIndex].chapters;
    for (i = 0; i < array.length; i++){
            resArray[array[i]] = 1;
    }

    return resArray;
}

function parceContextSearch(xmlDoc) {
    searchString = xmlDoc.getElementsByTagName("searchstring")[0].firstChild.data;

    var pages = xmlDoc.getElementsByTagName("page");
    searchIndexes = new Array();
    var id;

    searchIndexes = new Array();

    for (var i = 0; i < pages.length; i++) {
        var phrases = pages[i].getElementsByTagName("phrase");
        searchPhrases = new Array();
        for (var j = 0; j < phrases.length; j++) {
           id = phrases[j].getAttribute("id");
           searchPhrases[j] = id;
        }
        id = pages[i].getAttribute("id");
        id = leaveDigits(id) - 1;

        searchIndexes[i] = {
            segment: id,
            chapters: searchPhrases
        }
    }

    searchInit();
    searchHighLightFirst();
}


