// *************************************************************
//  CLIENT_SIDE SNIFFER CODE
// *************************************************************
// convert all characters to lowercase to simplify testing 
var agt=navigator.userAgent.toLowerCase(); 

// *** BROWSER VERSION *** 
// Note: On IE5, these return 4, so use is_ie5up to detect IE5. 
var is_major = parseInt(navigator.appVersion); 
var is_minor = parseFloat(navigator.appVersion); 

// *** BROWSER TYPE *** 
var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1) 
            && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1) 
            && (agt.indexOf('webtv')==-1));
var is_nav4up = (is_nav && (is_major >= 4));  
var is_ie   = (agt.indexOf("msie") != -1); 
var is_ie3  = (is_ie && (is_major < 4)); 
var is_ie4  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")==-1) );
var is_ie5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );  
var is_ie5up  = (is_ie  && !is_ie3 && !is_ie4);  

// FUNCTIE BROWSER_NAME  Return: afkorting van de browsernaam
function browser_name()
{
  var name;
  if      (is_nav) name = "NS";
  else if (is_ie)  name = "IE";
  else name = window.navigator.appName;
  return  (name);
}

// FUNCTIE BROWSER_VERSION  Return: versienummer
function browser_version()
{
  var name  = browser_name();
  var ver   = window.navigator.userAgent;
  var index = ver.lastIndexOf (".") - 1;       // positie van cijfer voor laatste dec.nr in userAgent
  ver       = ver.substring(index,index+3);    // isoleer substring met het versienummer
  return (ver);
}

// FUNCTIE BROWSER
function browser()
{
  return (window.navigator.appName + "  " + browser_version());
}

// FUNCTIE BROWSER_OK
function browser_ok()
{
  var name    = browser_name();
  var version = browser_version();
  if (name == "NS" && version >= 4.7) return true;
  if (name == "IE" && version >= 5.0) return true;
  return false;
}

var whitespace = " \t\n\r";

function isEmpty(s)
{
  if (s==null)                 return true;
  if (s.length == 0)           return true;
  if (s=="undefined")          return true;
  return false;
}


function isDigit (c) {return ((c >= "0") && (c <= "9"))}

function isInteger (s)
{
  if (s.length == 0) return false;
  for (var i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (!isDigit(c)) return false;
  }
  return true;
}

function isWhitespace (s)
{
  var i;
  if (isEmpty(s)) return true;
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (whitespace.indexOf(c) == -1) return false;
  }
  return true;
}

function longString(n, c)
{
  var i, s="";
  for (i=0; i<n; i++) s += c;
  return s;
}

// Removes all characters which appear in string bag from string s.
function stripCharsInBag (s, bag)
{
  var i;
  var returnString = "";
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (bag.indexOf(c) == -1) returnString += c;
  }
  return returnString;
}

// Vervangt spaces, newline, etc. door 1 space
function spaceForCharsInBag (s, bag)
{
  var i, inbag = true;
  var returnString = "";
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (bag.indexOf(c) == -1) {
      returnString += c;
      inbag = false;
    }
    else {
      if (!inbag) returnString += " ";
      inbag = true; 
    }
  }
  return returnString;
}

// FUNCTIE STRIPWHITESPACE
function stripWhitespace (s) {return stripCharsInBag (s, whitespace)}

// FUNCTIE TRIM
// Haalt spaces, punten en comma's aan begin en eind weg
function Trim(s)
{
  var i = 0, str = "", start, end, bag = " .,";
  var c;
  while (i < s.length) {
    c = s.charAt(i);
    if (bag.indexOf(c) == -1) {start = i; break;}
    i++;
  }
  i = s.length - 1;
  while (i >= 0) {
    c = s.charAt(i);
    if (bag.indexOf(c) == -1) {end = i; break;}
    i--;
  }
  for (i = start; i <= end; i++) str += s.charAt(i);
  return str;
}      

/*
  ZOEK-FUNCTIES:
  - splits_zoekveld()                  Zet zoekwoorden in een array
  - findWords()                        Zoekt de woorden in str. en markeert waar ze staan
  - putStyles()                        Insert <SPAN...> en </SPAN> met style-info
  - markString()                       Combineert de voorgaande functies
*/

// FUNCTION SPLITS_ZOEKVELD
// Splitst het zoekveld in een array van zoekwoorden.
// Scheidings-tekens: alles ongelijk A-Z, a-z, 0-9, _ (underscore)
function splits_zoekveld(zoekveld)
{
  var s = zoekveld.split(/\s/);
  return s;
}

// FUNCTION FINDWORDS
// Zet < en > tekens in een array met dezelfde lengte als
// de string waarin de zoekwoorden worden gezocht.
// Return true als een zoekwoord is gevonden.
function findWords (str, word, markArr)
{
  var wordfound = false, i=0;
  var s_len = str.length;
  var w_len = word.length;
  str  = str.toLowerCase();
  word = word.toLowerCase();
  while (i < s_len) {
    var pos = str.indexOf(word, i);      // zoek het woord
    if (pos != -1) {                     // woord gevonden
      wordfound = true;
      markArr[pos] ++;                   // plaats < mark
      markArr[pos + w_len] --;           // plaats > mark
      i = pos + w_len;                   // naar de volgende
    }
    else break;                          // break
  }
  return wordfound;
}

// FUNCTION PUTSTYLES
// Om <SPAN styles....> en </SPAN> in te lassen.
// Houdt rekening met evt. overlappende woorden (bijv. "iets" en "ets")
// returnString is daarna geschikt voor HTML-weergave
function putStyles (str, markArr)
{
  var i, j=0;
  var returnString = "";
  var spanOpen = "<SPAN ID='bgblue'>";
  var spanClose = "</SPAN>";
  var opened = 0;
  for (i = 0; i < markArr.length; i++) {
    if (markArr[i] > 0) {                      // begin zoekwoord
      if (!opened) returnString += spanOpen;   // <SPAN...> toevoegen
      opened += markArr[i];
    }
    else if (markArr[i] < 0) {                 // einde zoekwoord
      opened += markArr[i];
      if (!opened) returnString += spanClose;  // </SPAN> toevoegen
    }
    returnString += str.charAt(j++);           // de rest gewoon copiëren
  }    
  return returnString;
}

// FUNCTION MARKSTRING: Zoekt woorden in een string en markeert ze met font en background.
function markString(str, words)
{
  var i=0, found=true;
  var markArr = Array (str.length);
  for (i = 0; i < markArr.length; i++) markArr[i] = 0;  // initialiseren
  for (i = 0; i < words.length; i++) {
    if (!findWord (str, words[i], markArr)) {           // zoekwoord niet gevonden
     found = false;                                     // return lege string
    }
  }
  return (found) ? putStyles(str, markArr) : "";        // als zoekwoord gevonden, return met styles
}





