/* BUSCADOR
This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Robin Winslow | http://www.robinwinslow.me.uk */

function performMultiSearch(elem,searchElem) {
    var searchString; 
    var theSelection; 
    var textNodes; 
    
   
    if(!searchElem || typeof(searchElem) == 'undefined') searchElem = document.body;
    
    
    if(elem && elem.value) searchString = elem.value;
    else if(this && this.value) searchString = this.value;
    
    
    textNodes = findTypeNodes(searchElem,3);
    
    
    if(window.getSelection) theSelection = window.getSelection(); // firefox
    else { // some other browser - doesn't support multiple selections at once
        alert("sorry this searching method isn't supported by your browser");
        return;
    }
    
    
    theSelection.removeAllRanges(); 
    
    if(searchString.length > 0) { 
        for(var i = 0; i < textNodes.length; i++) {
            var reSearch = new RegExp(searchString,'gmi'); 
            var stringToSearch = textNodes[i].textContent;
            while(reSearch(stringToSearch)) { 
                
                var thisRange = document.createRange();
                thisRange.setStart(textNodes[i],reSearch.lastIndex - searchString.length); 
                thisRange.setEnd(textNodes[i],reSearch.lastIndex); 
                theSelection.addRange(thisRange); 
            }
        }
    }
    
    return;
}



function performSingleSearch(elem,searchElem) {
    
    var searchString; 
    var theSelection; 
    var textNodes; 
    
    
    if(!searchElem || typeof(searchElem) == 'undefined') searchElem = document.body;
    
    
    if(elem && elem.value) searchString = elem.value;
    else if(this && this.value) searchString = this.value;
    
    if(searchString && searchString.length > 0) { 
        if(window.getSelection) { 
            
            theSelection = window.getSelection();
    
            
            textNodes = findTypeNodes(searchElem,3);
            
            
            var searchMatch = new RegExp(searchString,'i');
            if(theSelection.rangeCount == 1 && searchMatch(theSelection.getRangeAt(0).toString())) {
                var currentRange = theSelection.getRangeAt(0);
                theSelection.removeAllRanges();
                
                var newRange = null;
                
                
                for(var i = 0; i < textNodes.length; i++) {
                    
                    if(currentRange.comparePoint(textNodes[i],0) == -1 && currentRange.startContainer != textNodes[i]) continue;
                    
                    else if((currentRange.comparePoint(textNodes[i],0) == -1 && currentRange.startContainer == textNodes[i]) || (currentRange.comparePoint(textNodes[i],0) == 0)) {
                        
                        var reSearch = new RegExp(searchString,'gmi'); 
                        var stringToSearch = textNodes[i].textContent;
                        while(reSearch(stringToSearch)) { 
                            
                            if(reSearch.lastIndex - searchString.length > currentRange.startOffset) {
                                
                                theSelection.removeAllRanges();
                                newRange = document.createRange();
                                newRange.setStart(textNodes[i],reSearch.lastIndex - searchString.length); 
                                newRange.setEnd(textNodes[i],reSearch.lastIndex); 
                                break; 
                            }
                        }
                        if(newRange) break; 
                        else continue; 
                    } 
                    
                    else if(currentRange.comparePoint(textNodes[i],0) == 1) {
                        
                        var reSearch = new RegExp(searchString,'gmi'); // Set it to 'g' - global (finds all instances), 'm' - multiline (searches more than one line), 'i' - case insensitive
                        var stringToSearch = textNodes[i].textContent;
                        if(reSearch(stringToSearch)) {
                            
                            theSelection.removeAllRanges();
                            newRange = document.createRange();
                            newRange.setStart(textNodes[i],reSearch.lastIndex - searchString.length); 
                            newRange.setEnd(textNodes[i],reSearch.lastIndex); 
                            break; 
                        } else continue;
                    }
                }
                
                if(newRange) {
                    theSelection.addRange(newRange); 
                    
                    newRange.startContainer.parentNode.scrollIntoView(false);
                    return;
                } else performSingleSearch(elem,searchElem);
            }
            
            
            else {
                
                for(var i = 0; i < textNodes.length; i++) {
                    
                    var reSearch = new RegExp(searchString,'gmi'); // Set it to 'g' - global (finds all instances), 'm' - multiline (searches more than one line), 'i' - case insensitive
                    var stringToSearch = textNodes[i].textContent;
                    if(reSearch(stringToSearch)) { 
                        
                        theSelection.removeAllRanges();
                        
                        var thisRange = document.createRange();
                        thisRange.setStart(textNodes[i],reSearch.lastIndex - searchString.length); 
                        thisRange.setEnd(textNodes[i],reSearch.lastIndex); 
                        theSelection.addRange(thisRange); 
                        thisRange.startContainer.parentNode.scrollIntoView(false);
                        break; 
                    }
                }
            }
        }
        else if(document.selection) { 
            theSelection = document.selection;
            var currentRange = theSelection.createRange();
            
            
            var searchRange = document.body.createTextRange();
            searchRange.moveToElementText(searchElem);
            
            
            theSelection.empty();
            
            if(currentRange && currentRange.text && currentRange.text.match(eval('/'+searchString+'/i'))) {
                
                currentRange.moveStart('character');
                
                currentRange.setEndPoint('EndToEnd',searchRange);
                
                if(currentRange.findText(searchString)) {
                    
                    currentRange.select();

                    var currentkeypress = document.body.onkeypress;
                    window.setTimeout(function() {
                        document.body.onkeypress = function(evt) {
                            if(!evt) evt = window.event; 
                            
                            
                            var nowRange = document.selection.createRange();
                            if(nowRange.htmlText == currentRange.htmlText) {
                                if(evt.keyCode == 13) { 
                                    
                                    document.body.onkeypress = currentkeypress;
                                    
                                    performSingleSearch(elem,searchElem);
                                }
                            } else {
                                
                                document.body.onkeypress = currentkeypress;
                            }
                            
                            if(currentkeypress) currentkeypress(evt);
                        }
                    },30);
                    return true;
                } else performSingleSearch(elem,searchElem);
            } else {
                
                if(searchRange.findText(searchString)) {
                    
                    searchRange.select();
                    
                    
                    var currentkeypress = document.body.onkeypress;
                    window.setTimeout(function() {
                        document.body.onkeypress = function(evt) {
                            if(!evt) evt = window.event; 
                            
                            
                            var nowRange = document.selection.createRange();
                            if(nowRange.htmlText == searchRange.htmlText) {
                                if(evt.keyCode == 13) { 
                                    
                                    document.body.onkeypress = currentkeypress;
                                    
                                    performSingleSearch(elem,searchElem);
                                }
                            } else {
                                
                                document.body.onkeypress = currentkeypress;
                            }
                            
                            if(currentkeypress) currentkeypress(evt);
                        }
                    },30);
                    
                    return true;
                } else {
                    return false;
                }
            }
        } else alert("Sorry your browser doesn't support a supported selection object"); 
    }
}


function findTypeNodes(elem,type) {
    
    elem.normalize();
    
    var typeNodes = new Array();
    
    for(var nodeI = 0; nodeI < elem.childNodes.length; nodeI++) {
        if(elem.childNodes[nodeI].nodeType == type) typeNodes.push(elem.childNodes[nodeI]); 
        else {
            
            typeNodes = typeNodes.concat(findTypeNodes(elem.childNodes[nodeI],type));
        }
    }
    return typeNodes; 
}



function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

addLoadEvent(function() {
  
  var theInput = document.getElementById('searchInput');
  var theButton = document.getElementById('performSearch');
  var elementToSearch = document.body; 
  theButton.onclick = function() { 
    performSingleSearch(theInput,elementToSearch);
  }
  
  theInput.onkeypress = function(evt) {
    if(!evt) evt = window.event; 
    if(evt.keyCode == 13) performSingleSearch(theInput,elementToSearch);
  }
});