var occCount = 0;
var curOccure = 0;
var lengthDelta = 0;
var phraseDelta = 0;
var cuePointCalls = 0;

function searchNext() {
    if (!searchCheckLoad()) {
        return;
    }

    searchPostMessage("");
    var index = findNearestToCurrent();

    if (index < 0 || index >= searchIndexes.length) {
        searchStateControll = searchStateSegment;
    }

    switch (searchStateControll) {
        case searchStateSegment:
            if (switchIndexes(index + 1)) {
                searchPositionControll = searchPositionFirst;
            }
            searchStateControll = searchStateChapter;
            break;

        case searchStateChapter:
            searchNextChapter(index);
            searchStateControll = searchStatePhrase;
            break;

        case searchStatePhrase:
            switchNextPhrase();
            break;
    }

}

function searchPrev() {
    if (!searchCheckLoad()) {
        return;
    }

    searchPostMessage("");

    var index = findNearestToCurrent();

    if (index < 0 || index >= searchIndexes.length) {
        searchStateControll = searchStateSegment;
    }

    switch (searchStateControll) {
        case searchStateSegment:
            if (switchIndexes(index - 1)) {
                searchPositionControll = searchPositionLast;
            }
            searchStateControll = searchStateChapter;
            break;

        case searchStateChapter:
            searchPrevChapter(index);
            searchStateControll = searchStatePhrase;
            break;

        case searchStatePhrase:
            switchPrevPhrase();
            break;
    }
}
//-------------------------------------------------------
function switchNextPhrase() {
    var res = switchPhrase(curOccure + 1);
    if (res == -1) {
        searchStateControll = searchStateChapter;
        searchPositionControll = searchPositionFirst;
        searchNext();
    } else {
        curOccure = res;
    }
    return;
    return;
}

function switchPrevPhrase() {
    var res = switchPhrase(curOccure - 1);
    if (res == -1) {
        searchStateControll = searchStateChapter;
        searchPositionControll = searchPositionLast;
        searchPrev();
    } else {
        curOccure = res;
    }
    return;
}

function switchPhrase(newIndex) {
    removeCurrentHighLight();
    if (newIndex < phraseDelta || newIndex >= lengthDelta + phraseDelta) {
        return -1;
    }

    element = document.getElementById("highlight" + newIndex);
    if (element)  // if something goes wrong
        setHighLight(element);

    return newIndex;
}
//-------------------------------------------------------
 function setCurrentHightLight() {
    if (curOccure == -1) curOccure = 0;
    element = document.getElementById("highlight" + curOccure);
    if (element) {  // if ok
        setHighLight(element);
        pause();
    }
}

function removeCurrentHighLight() {
    element = document.getElementById("highlight" + curOccure);
    if (element)  // if something goes wrong
        removeHighLight(element);
}
//-------------------------------------------------------
function switchIndexes(index) {
    if ((index >= searchIndexes.length) || (index < 0)) {
        searchPostMessage("End is reached");
        setCurrentHightLight();
        return false;
    }
    try{
        switchToSegment(searchIndexes[index].segment)
    } catch(e){
        return false;
    }

    searchFlow = true;

    return true;
}
//-------------------------------------------------------
function searchNextChapter(index) {
    searchChapter = findNearestToCurrentChapter(index, "second");
    var res = searchSwitchChapters(searchChapter + 1, index);
    if (res == -1) {
        searchStateControll = searchStateSegment;
        searchNext();
        return;
    } else {
        searchChapter = res;
    }
}

function searchPrevChapter(index) {
    var searchChapter = findNearestToCurrentChapter(index, "second");

    if (index == searchIndexes.length - 1 && searchChapter == searchIndexes[index].chapters.length - 1) {
        searchChapter = findNearestToCurrentChapter(index, "down");
    }

    var res = searchSwitchChapters(searchChapter - 1, index);
    if (res == -1) {
        searchStateControll = searchStateSegment;
        searchPrev();
        return;
    } else {
        searchChapter = res;
    }
}

function searchSwitchChapters(anchorIndex, index) {
    var searchAnchors = searchIndexes[index].chapters;

    if (searchAnchors.length <= anchorIndex || anchorIndex < 0) {
        return -1;
    }

    var ind = "w" + searchAnchors[anchorIndex].chapter;

    ind = document.getElementById(ind).getAttribute("index");
    ind = parseInt(ind);
    time = anchors[ind].time;
    seekToAndPlay(time);
    return anchor;
}
//-------------------------------------------------------
function findCurrentSegment() {
    var temp = parseInt(curIndex);

    var retIndex = -1;

    for (i = 0; i < searchIndexes.length; i++) {
        if (searchIndexes[i].segment == temp)
            retIndex = i;
    }
    return retIndex;
}

function findCurrentChapter() {
    var temp = leaveDigits(curAnchor);

    var seg = findCurrentSegment();

    var retIndex = {
        segment:  seg,
        chapter:  -1
    }

    if (seg == -1) return retIndex;

    var array = searchIndexes[seg].chapters;

    for (i = 0; i < array.length; i++) {
        if (array[i].chapter == temp)
            retIndex.chapter = i;
    }
    return retIndex;
}

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 findNearestToCurrentChapter(index, dir) {
    var retIndex = 0;

    if (dir == "down") {
        retIndex = searchIndexes.length - 1;
    } else if (dir == "second") {
        retIndex = -1;
    }

    var array = searchIndexes[index].chapters;
    var curChapter = leaveDigits(curAnchor);
    curChapter = parseInt(curChapter)
    for (i = 0; i < array.length; i++) {
        if (dir != "down") {
            if (array[i].chapter <= curChapter) {
                retIndex = i;
            }
        } else {
            if (array[i].chapter >= curChapter) {
                retIndex = i;
            }
        }
    }
    return retIndex;
}
//-------------------------------------------------------

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;
    }

    ctrl = document.getElementById("searchControll");

    ctrl.style.visibility = "visible";

    var index = 0;
    if ((searchIndexes[index].segment != curIndex) || fromContextMode)
        switchIndexes(index);
}

function searchCheckLoad() {
    return (tocDone && transcriptDone && notesDone);
}

function createPhraseList(type) {
    resArray = new Array();

    var searchIndex = findNearestToCurrent();

    if (searchIndex >= searchIndexes.length || searchIndex < 0) {
        return  resArray;
    }

    var array = searchIndexes[searchIndex].chapters;

    if (type == "normal") {
        var k = 0;
        for (i = 0; i < array.length; i++) {
            for (j = 0; j < array[i].phrases.length; j++) {
                resArray[k] = array[i].phrases[j];
                k++;
            }
        }
    } else {
        for (i = 0; i < array.length; i++) {
            for (j = 0; j < array[i].phrases.length; j++) {
                resArray[array[i].phrases[j]] = 1;
            }
        }
    }


    return resArray;
}
//-------------------------------------------------------
function searchSelectFirstPhrase() {
    //alert("1")
    if (searchIndexes.length == 0)  return;

    if (!searchCheckLoad()) {
        setTimeout("searchSelectFirstPhrase()", 1000);
        return;
    }

    switch (searchPositionControll) {

        case searchPositionLast:
            curOccure = phraseDelta + lengthDelta - 1;
            break;

        case searchPositionFirst:
        default:
            curOccure = phraseDelta;
            break;
    }
    setCurrentHightLight();
}

function synchronizeSelection() {
    if (searchPositionControll == searchPositionDoNotSynchronize) return false;
    if (!searchCheckLoad() || cuePointCalls < 2) {
        setTimeout("synchronizeSelection()", 1000);
        return;
    }

    //    if (intCallTimes == 0) {
    //        intCallTimes++;
    //       return false;
    //   }
    //   intCallTimes=0;

    var index = findCurrentSegment();

    if (index == -1) return false;

    var phraseIndex;
    var chapterIndex;

    switch (searchPositionControll) {
        case searchPositionFirst:
            phraseIndex = 0;
            chapterIndex = 0;
            break;

        case searchPositionLast:
            chapterIndex = searchIndexes[index].chapters.length - 1;
            break;
    }

    var temp = searchIndexes[index].chapters[chapterIndex].chapter;

    //searchPositionControll = searchPositionDoNotSynchronize;

    if (curAnchor != temp) {
        searchSwitchChapters(chapterIndex, index);
        return true;
    } else {
        return false;
    }
}

function searchCalcDelta(anchorElementId) {
    curOccure = 0;
    lengthDelta = 0;
    phraseDelta = -1;
    //phraseDelta = 0;

    var id = leaveDigits(anchorElementId);
    id = parseInt(id) + 1;

    var index = findCurrentChapter();

    if (index.chapter == -1) return;

    var array = searchIndexes[index.segment].chapters[index.chapter].phrases;

    lengthDelta = array.length;

    array = createPhraseList("normal");

    for (i = 0; i < array.length; i++) {
        var chNum = leaveDigits(array[i]);
        chNum = parseInt(chNum);

        if (chNum == id && phraseDelta == -1) {
            phraseDelta = i;
            break;
        }
    }

    return;
}


function parceContextSearch(xmlDoc){
    searchString = xmlDoc.getElementsByTagName("searchstring")[0].firstChild.data;
    var segments = xmlDoc.getElementsByTagName("segment");
    searchIndexes = new Array();
    var id;
    for (var i = 0; i < segments.length; i++){
        var anchs = segments[i].getElementsByTagName("chapter");

        searchAnchors = new Array();

        for (var j = 0; j < anchs.length; j++){
            var phrs = anchs[j].getElementsByTagName("phrase");

            searchPhrases = new Array();

            for (var k = 0; k < phrs.length; k++){
                id = phrs[k].getAttribute("id");
                searchPhrases[k]  = id;
            }
            id = anchs[j].getAttribute("id");
            searchAnchors[j] = {
                                chapter: leaveDigits(id),
                                phrases: searchPhrases
                             }
        }
        id = segments[i].getAttribute("id");
        searchIndexes[i] = {
                     segment: leaveDigits(id) - 1,
                     chapters: searchAnchors
                    }
    }

    searchInit();
}