var GlossaryResponse = "";
var wordList = [];
var definitionList = [];
var midWindow = 0;  
var tipContainer = "";
var IE = false;

String.prototype.splitCSV = function(sep) {
  for (var foo = this.split(sep = sep || ","), x = foo.length - 1, tl; x >= 0; x--) {
    if (foo[x].replace(/"\s+$/, '"').charAt(foo[x].length - 1) == '"') {
               if ((tl = foo[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
      foo[x] = foo[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
    } else if (x) {
      foo.splice(x - 1, 2, [foo[x - 1], foo[x]].join(sep));
    } else foo = foo.shift().split(sep).concat(foo);
    } else foo[x].replace(/""/g, '"');
} return foo;
};

if (navigator.userAgent.indexOf("MSIE") != -1) {
  var IE = true;
}

function dfocusmouse(mouse){  
  var currX = 0;
  var currY = 0;
  var iL = 0;
  var iV = 0;
  
  if (IE) {
    currX = event.clientX;
    currY = event.clientY;
  } else {
    currX = mouse.pageX;
    currY = mouse.pageY;
  }
  if (document.documentElement && document.documentElement.scrollLeft || document.documentElement && document.documentElement.scrollTop) {
    iL = document.documentElement.scrollLeft;  
    iV = document.documentElement.scrollTop;
  } else {
    iL = document.body.scrollLeft;  
    iV = document.body.scrollTop;  
  }
  if (currX > midWindow-30) {
    var msgWidth = tipContainer.clientWidth;
    if (IE){tipContainer.style.left = (currX-msgWidth-10+iL)+'px'}
    else {tipContainer.style.left = (currX-msgWidth-10)+'px'}
  } else {
    if (IE){tipContainer.style.left = (currX+25+iL)+'px'}
    else {tipContainer.style.left = (currX+25)+'px'}
  }
  if (IE) {tipContainer.style.top = (currY+iV)+'px'}
  else {tipContainer.style.top = currY+'px'}
}

function dhidedef(){
  
  tipContainer.style.display = 'none';
  while (tipContainer.lastChild)
  {tipContainer.removeChild(tipContainer.lastChild)}
}

function dgetdef(currWord){
  
  var nDefinition = "";
  for (i=0; i<wordList.length; i++)
  {
    if (wordList[i] == currWord)
    {
      nDefinition = definitionList[i];
    }
  }
  return nDefinition; 
}

function dshowdef(word){
  
  var toolTip = dgetdef(word);  
  var tipTxt = toolTip.split("|");
  tipContainer.style.display = '';
  for (i=0; i<tipTxt.length; i++)
  {
    tipContainer.appendChild(document.createTextNode(tipTxt[i]))
    tipContainer.appendChild(document.createElement('br'))
  }
}

function dgetMidWindow(){
  
  if (document.documentElement && document.documentElement.scrollLeft || document.documentElement && document.documentElement.scrollTop)
  {
    midWindow = document.documentElement.clientWidth/2;
  }
  else   {
    midWindow = document.body.clientWidth/2;
  }
}

document.getElementsByClassName = function(cl) {
  var retnode = [];
  var myclass = new RegExp('\\b'+cl+'\\b');
  var elem = this.getElementsByTagName('*');
  for (var i = 0; i < elem.length; i++) {
    var classes = elem[i].className;
    if (myclass.test(classes)) retnode.push(elem[i]);
  }
  return retnode;
};

function dinitContext(){
  var divids = ['cms_pagecontent', 'waterreport', 'entry'];
  
  for(var x=0; x<divids.length;x++) {
    var rawText = document.getElementById(divids[x]);
    if(rawText) {

      var workText = rawText.innerHTML;  

      workText = workText.replace(/(\<)/gi," $1").replace(/(\>)/gi,"$1 ");
      for (i=0; i<wordList.length; i++)
      {
        var currWord = new RegExp("([\\s\\r\\n\(]{1})("+wordList[i]+")([\\s,;.:?!\)]{1})",'gi');
        workText = workText.replace(currWord,"$1<span class='word'>$2<\/span>$3");
      }
      rawText.innerHTML = workText;
    }
  }
}

function dinitTip(){
  
  tipContainer = document.getElementById('nFloat')
  tipContainer.style.display = 'none';
  //if (!IE){document.captureEvents(Event.mousemove)}
  document.onmousemove=dfocusmouse;
  dgetMidWindow();
}

function dinit(){
  
  dinitContext();
  var nBody = document.getElementsByTagName('body')[0];
  var tipBox = document.createElement('div');
  tipBox.className = "definition";
  tipBox.id = "nFloat";
  nBody.appendChild(tipBox);
    dinitTip();  
//  var nWords = document.getElementById('content').getElementsByTagName('span').;
  var nWords = document.getElementById('content').getElementsByClassName('word');
  for (i=0; i<nWords.length; i++)
  {
    nWords[i].onmouseover = function()
    {
      dshowdef(this.firstChild.data.toLowerCase().replace(/^\s+|\s+$/,"").replace(/[^a-zA-Z-\s]/g,"").replace(/^\s+|\s+$/,""));
    }
    nWords[i].onmouseout = function()
    {
      dhidedef();
    }
  }
}

function dparseGlossary(GlossaryResponse){
  var reg = new RegExp("[\\n\\r]+", "gi");
  var lines = GlossaryResponse.split(reg);

  for(i=0; i<lines.length; i++) {
    if(lines[i].match(/,/)) {
      entry = lines[i].splitCSV(",");
      wordList[i] = entry[0].replace(/^\"|\"$/g,"");// ";
      definitionList[i] = entry[1].replace(/^\"|\"$/g,"");// ";
    }
  }
  dinit();
}

function dcreateGlossary(){
  var http_request = false;
  
  if(window.XMLHttpRequest) {
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
      // set type accordingly to anticipated content type
      //http_request.overrideMimeType('text/xml');
      http_request.overrideMimeType('text/csv');
    }
  } else if (window.ActiveXObject) { // IE
    try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
    }
  }
  if (!http_request) {
    //alert('Cannot create XMLHTTP instance');
    return false;
  }
  
  http_request.onreadystatechange = function() {
    if (http_request.readyState == 4)
    {
      if (http_request.status == 200)
      {
        GlossaryResponse = http_request.responseText;
        dparseGlossary(http_request.responseText);
      }
      else   {
        alert('Error definitions.xml File '+ http_request.statusText);
      }
    }
  }

  http_request.open("GET", "/definitions.csv?n="+ parseInt(Math.random()*999999999), true);
  http_request.send(null); 
}


