var isIE, isMozilla, isSafari, isOpera = false;
var np = 0;
var search_status = 'idle';
var re = '';

function BrowserDetection() {
    if (navigator.userAgent.indexOf('MSIE') != -1)
        isIE = true;
    else if (navigator.userAgent.indexOf('Safari') != -1)
        isSafari = true;
    else if (navigator.userAgent.indexOf('Opera') != -1)
        isOpera = true;
    else
        isMozilla = true;
};

function getXMLHTTPObject(){
    //instantiate new XMLHTTP object
    var objhttp=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
    if(!objhttp){return};
    // assign event handler
    
    if (navigator.userAgent.indexOf('MSIE') != -1)
        isIE = true;
    else if (navigator.userAgent.indexOf('Safari') != -1)
        isSafari = true;
    else if (navigator.userAgent.indexOf('Opera') != -1)
        isOpera = true;
    else
        isMozilla = true;

    return objhttp;
};

// function sendRequest
function sendRequest(url,data,method,header,calltype){
    // get XMLHTTP object
    objhttp=getXMLHTTPObject();
    
    if ( !isIE ) {
       objhttp.onreadystatechange = processReqChange(objhttp,calltype);
    }
    
    // set default values
    if(!url){url='/cgi-bin/search.cgi?m=any&ul='+document.domain};
    if(!data){data=''};
    if(!method){method='get'};
    if(!header){header='Content-Type:text/html; charset=iso-8859-1'};
    // open socket connection in asyncronous mode
    objhttp.open(method,url,false);
    // send header
    objhttp.setRequestHeader(header.split(':')[0],header.split(':')[1]);
    // send data
    objhttp.send(null);
    // return xmlhttp object
    return objhttp;
};

function processReqChange(req,calltype) {
    // only if req shows "loaded"
    if (req.readyState == 4) {

    }
};

function setStatus(status) {
   if ( status == 'active' && document.getElementById('q').value) {
      search_status = status;
      document.getElementById('searchButton').enabled=false;
      document.getElementById('activeSearch').style.display='block';
      document.getElementById('searchResultsContainer').style.display='none';
      document.getElementById('searchResultsNavBarBot').style.display = "none";
      document.getElementById('startSearch').style.display='none';
      document.getElementById('searchNoResultsFound').style.display='none';
      np = 0;
   }
   else {
     search_status = status;
     document.getElementById('searchButton').value='Search';
     document.getElementById('searchButton').enabled=true;
     document.getElementById('activeSearch').style.display='none';
   }
   return true;

}

function call_search(navOption) {
    var thisDomain = document.domain;
    /*thisDomain = 'www.conscious.co.uk';*/
    if ( !navOption ) {
      navOption = '';
    }
    if ( navOption ) {
       if ( navOption == 'next' ) {
          np++;
       }
       else if ( navOption == 'prev' ) {
          np--;
          if ( np < 0 ) { np= 0};
       }
       else {
          np = parseFloat(navOption);
       }
       navOption = '&np='+np;
    } 

    /*uri_encode query string */
    var theSearchQueryString = document.getElementById('q').value;
    theSearchQueryString = escape(theSearchQueryString);
    var searchRequestURL = '/cgi-bin/search.cgi?q='+theSearchQueryString+'&m=any'+'&ul='+thisDomain+navOption;
    /* alert(searchRequestURL); */
    myRequest = sendRequest(searchRequestURL,'','get','');
    var searchXML = '';
    if ( myRequest.responseXML && !myRequest.responseText) {
       searchXML = myRequest.responseXML;
    }
    else { 
       if ( myRequest.responseText) {
       try
         {// code for IE
          var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async="false";
          xmlDoc.loadXML(myRequest.responseText);
          searchXML = xmlDoc;
        }
        catch(e)
          {// code for Mozilla, Firefox, Opera, etc.
          try
             {
              var parser=new DOMParser();
              var xmlDoc=parser.parseFromString(myRequest.responseText,"text/xml");
              searchXML = xmlDoc; 
             }
          catch(e)
           {
             alert(e.message);
             document.getElementById('searchButton').style.display = "block";
             return;
            }
        }
     }
    } 

    var urls = searchXML.getElementsByTagName("result");

    document.getElementById('searchResultsContainer').style.display = "none";
    document.getElementById('searchResultsNavBarBot').innerHTML = "";
    document.getElementById('searchResultsNavBarBot').style.display = "none";
    document.getElementById('searchResultsNavBarTop').innerHTML = "";
    document.getElementById('searchResultsNavBarTop').style.display = "none";

    if ( urls.length > 0 ) {
       document.getElementById('searchNoResultsFound').style.display = 'none';
       document.getElementById('searchResultsContainer').innerHTML = '<div id="searchStats">Displaying results <b>'+searchXML.getElementsByTagName('first')[0].childNodes[0].nodeValue+' - '+searchXML.getElementsByTagName('last')[0].childNodes[0].nodeValue+'</b> from a total of <b>'+searchXML.getElementsByTagName('num_found')[0].childNodes[0].nodeValue+'</b> found (search took <b>'+searchXML.getElementsByTagName('search_time')[0].childNodes[0].nodeValue+'</b> seconds)</div>';
       var tmpStr='<div id="searchResultsOuter">';
       for ( i=0; i<urls.length; i++ ) {
           var myTitle = urls[i].getElementsByTagName('r_ttl')[0].firstChild.nodeValue;
           
           var myURL = urls[i].getElementsByTagName('r_url')[0].firstChild.nodeValue;

           if ( !myTitle ) {
              myTitle = myTitle.substring(0,40);
           }  
           myTitle= embolden(myTitle);
 
           var displayURL = myURL; 
           // Remove domain etc and output summary url
           displayURL = displayURL.replace('http://','');
           displayURL = displayURL.replace(thisDomain,'');
           displayURL = displayURL.replace('/cms/catsection/','');
           displayURL = displayURL.replace('/cms/section/','');
           displayURL = displayURL.replace('/cms/page/','');
           displayURL = embolden(displayURL);

           var searchSize = urls[i].getElementsByTagName('r_lenk')[0].firstChild.nodeValue;
           var searchSizeDisplay = parseFloat(Math.round(searchSize)); 
  
           var modDate = urls[i].getElementsByTagName('r_mod')[0].firstChild.nodeValue;
           modDate = modDate.substring(0,16);

           var docBody = urls[i].getElementsByTagName('r_bod')[0].firstChild.nodeValue;
           var docMetaDesc = '';
           if ( urls[i].getElementsByTagName('r_mtd')[0] && 
                urls[i].getElementsByTagName('r_mtd')[0].firstChild &&
                urls[i].getElementsByTagName('r_mtd')[0].firstChild.nodeValue ) {
               docMetaDesc = urls[i].getElementsByTagName('r_mtd')[0].firstChild.nodeValue ;
           } 
           if ( !docBody.length || docBody.length < docMetaDesc.length ) {
               docBody = docMetaDesc;
           }
           docBody = docBody.replace('skip navigation','');
           var bodClean = /\?/g;
           docBody = docBody.replace(bodClean,"'");
           docBody = embolden(docBody);
          
           if (myTitle.indexOf('- ') >=0) { 
              var myTitleBits = myTitle.split('- '+site_name);
              myTitle = myTitleBits[0];
           }

           tmpStr += '<div class="searchResultRow"><a class="searchResultURL" href="'+myURL+'">'+myTitle+'</a><br/><div class="searchResultBody">'+docBody+' ...</div><div class="searchResultInfoRow"><div class="searchDisplayURL">'+displayURL+' - <span class="searchResultSize">'+searchSizeDisplay+'k</span><span id="searchResultDate"> - Last Modified on '+modDate+'</span></div></div></div>';

       }
       tmpStr += '</div><div class="searchResultsClear">&#xA0;</div>';

       var navOptions = searchXML.getElementsByTagName("navbar1");
       var nextOption = searchXML.getElementsByTagName("navright_nh");
       var prevOption = searchXML.getElementsByTagName("navleft_nh");
      

       if ( navOptions.length && navOptions.length > 0 ) {
           var navStr = '<div class="pagination">';
           if ( prevOption.length>0 && np > 0 ) {
              navStr += '<a  class="navPrev" href="#" onclick="do_search('+"'"+'prev'+"'"+')">Previous</a>';
           }; 
 
           var thisPageNav = 0; 
           for (i=0; i<navOptions.length; i++ ) {
               var nav_np = navOptions[i].getElementsByTagName("navbar1_np")[0].firstChild.nodeValue;
               if ( nav_np >= (np+1) && !thisPageNav ) {
                  var activePageNum = parseFloat(np)+parseFloat(1);
                  navStr += '<a class="navNumberOn" href="#">'+activePageNum.toFixed(0)+'</a>';
                  thisPageNav++;
               }
               navStr += '<a  class="navNumber" href="#" onclick="do_search('+"'"+parseFloat(nav_np-1)+"'"+')">'+nav_np+'</a>';
           }

           /* Last page */ 
           var num_found = searchXML.getElementsByTagName('num_found')[0].childNodes[0].nodeValue;
           var last_row = searchXML.getElementsByTagName('last')[0].childNodes[0].nodeValue;
           if ( num_found == last_row ) {
                  var activePageNum = parseFloat(np)+parseFloat(1);
                  navStr += '<a class="navNumberOn" href="#">'+activePageNum.toFixed(0)+'</a>';
                  thisPageNav++;
               }
 
           if ( nextOption.length > 0  ) {
              navStr += '<a  class="navNext" href="#" onclick="do_search('+"'"+'next'+"'"+')">Next</a>';
           };
           navStr += '</div>';
           if ( document.getElementById('searchResultsNavBar') ) {
              document.getElementById('searchResultsNavBar').innerHTML = navStr;
              document.getElementById('searchResultsNavBar').style.display='block';
           }
           if ( document.getElementById('searchResultsNavBarTop') ) {
              document.getElementById('searchResultsNavBarTop').innerHTML = navStr;
              document.getElementById('searchResultsNavBarTop').style.display='block';
           }
           if ( document.getElementById('searchResultsNavBarBot') ) {
              document.getElementById('searchResultsNavBarBot').innerHTML = navStr;
              document.getElementById('searchResultsNavBarBot').style.display='block';
           }
       } 

       document.getElementById('searchResultsContainer').innerHTML += tmpStr;
       document.getElementById('searchResultsContainer').style.display = "block";
       document.getElementById('startSearch').style.display = "none";
       document.getElementById('searchResultsNavBarBot').style.display = "block";
    }
    else {
       document.getElementById('searchNoResultsFound').style.display = 'block';
       document.getElementById('searchResultsContainer').style.display = "none";
       document.getElementById('startSearch').style.display = "none";
       document.getElementById('searchResultsNavBarTop').style.display = "none";
       document.getElementById('searchResultsNavBarBot').style.display = "none";
    }
    setStatus('idle');
    urls= ''; 
}

function do_search(navOption) {
   if ( document.getElementById('q') && document.getElementById('q').value.length ) {
      call_search(navOption);
   } 
   else {
     document.getElementById('startSearch').style.display = "block";
   }
}

function check_search() {
   if ( search_status == 'active' ) {
      do_search();
   }
}

function checkKeyDown(e) {
   if (search_status == 'active')  { return};
   var KeyID = (window.event) ? event.keyCode : e.keyCode;
  
   switch(KeyID) {
      case 13: setStatus("active");break; 
   }
}

function checkKeyUp(e) {
   var KeyID = (window.event) ? event.keyCode : e.keyCode;
   switch(KeyID) {
      case 13: do_search();break;
   }
}

function initSearch() {
        BrowserDetection();
        if (isMozilla){
           window.addEventListener("keydown", checkKeyDown, true)
           window.addEventListener("keyup", checkKeyUp, true)

        }
        else if (isIE){
           document.cmssearchForm.attachEvent("onkeydown", checkKeyDown);
           document.cmssearchForm.attachEvent("onkeyup",checkKeyUp);
        }

	/* Called with a search string? In which case we run it straight away */ 
        var thisLocation = new String(document.location);
        if ( thisLocation.indexOf('?q=') >0 ) {
           do_search();
        }

}

function embolden(theStr,useSpan,className) {
     var theQueryStr = document.getElementById('q').value;

     if ( theQueryStr.indexOf('+')>=0 ) {
        var reClean = /\+/g;        
        theQueryStr = theQueryStr.replace(reClean,' ');
     }
     if ( theQueryStr.indexOf('"')<0 ) {
        if ( theQueryStr.indexOf(' ')>=0 ) {
           var queryStrs = theQueryStr.split(' ');
         
           for (x=0;x<queryStrs.length;x++) { 
             var theText = queryStrs[x];
             if (theText.length && theText !=' ') {
               re = new RegExp("\\b"+'('+theText+")\\b", "ig"); 
               theStr = theStr.replace(re,'<span class="hilite">$1</span>'); 
             }
           }
        } 
        else {
             re = new RegExp("\\b"+'('+theQueryStr+')\\b', "ig"); 
             theStr = theStr.replace(re,'<span class="hilite">$1</span>'); 
        }
        return theStr; 
     }
     if (theQueryStr.indexOf('"')>=0) {
        var reClean = /"/g;
        theQueryStr = theQueryStr.replace(reClean,'');
        re = new RegExp('('+theQueryStr+')', "ig"); 
        theStr = theStr.replace(re,'<span class="hilite">$1</span>'); 
        return theStr;
     }
}

