var wikiURL = basePath + "wiki/WikiViewer.aspx?Title=";
 
function parseWikiSubject(elmID, callback) {
    function onAJAXComplete(request) {
        if (callback) {
            callback(request.responseText.evalJSON());
        }            
    }
    
    var body = document.getElementById(elmID).innerHTML;
    new Ajax.Request(basePath + "WikiService.axd?cmd=FindWikiSubject", {
        method: 'post',
        contentType: 'application/json',
        encoding: 'utf-8',
        postBody: body,
        onComplete: onAJAXComplete }
    )
}

function getParent(oElm) {
  var p = null;
  try
  {
    p = oElm.parentNode;
  } catch (e) {
    p = null;
  }
  
  return p;
}

//var hashData = new Object();
var elmData = new Array();
var elmHtml = new Array();
function setWikiLink(elmID, tagList, linkTarget) {
    var regex = "";
    for (var i=0, iC=tagList.length; i<iC; i++) {
        var tag = tagList[i];
        if (tag == "")
          continue;
        regex = regex + tag.Term + "|";
    }
    
    if (regex.length > 1) {
        regex = "(" + regex.substring(0, regex.length-1) + ")";
        replaceWiki(document.getElementById(elmID), new RegExp(regex), linkTarget);
        for (var i=0, iC=elmData.length; i<iC; i++){
          var elm = elmData[i];
          var p = getParent(elm);
          if (p != null){
            var span =document.createElement("SPAN");
            span.innerHTML = elmHtml[i];
            p.replaceChild(span, elm);
          }
        }
    }    
}

function replaceWiki(oElm, regex, linkTarget) {
  if (oElm.nodeType === 3) { //Text
    var p = getParent(oElm);
    if (p == null)
      return;

    var tagName = p.tagName.toUpperCase();
    if ('P' === tagName || 'SPAN' === tagName || 'DIV' === tagName || 'FONT' === tagName || 'LI' === tagName || 'STRONG' === tagName) {
      var text = oElm.nodeValue;      
      var bMatch = false;
      text = text.gsub(regex, function(match) {
        var term = match[0].toUpperCase();
        //if (hashData[term] == true)
        //  return match[0];
        
        var c = term.charAt(0);
        if (c >= 'A' && c<='Z') {
          var ind = match.index;
          var data = match.input;
          if (ind > 0) {
            c = data.charAt(ind-1);
            if ((c >='a' && c<='z') || (c >='A' && c<='Z'))
              return match[0];
          }
          
          ind = ind + term.length;
          if (ind < data.length) {
            var c = data.charAt(ind);
            if ((c >= 'a' && c<='z') || (c >= 'A' && c<='Z'))
              return match[0];
          }
        }
        
        bMatch = true;
        //hashData[term] = true;
        var sTarget = "";
        if(linkTarget != null && linkTarget != "") sTarget = ' target="'+ linkTarget +'" ';                
        var a = '<a href="' + wikiURL + escape(term) + '" '+ sTarget +'>' + match[0] + '</a>';
        return a;
      });
      if (bMatch)
      {
        elmData.push(oElm);
        elmHtml.push(text);
      }
    }
  }
  else {
      var pArray = $A(oElm.childNodes);
      for (var i=0, iC=pArray.length; i<iC; i++) {
          var ch = pArray[i];
          replaceWiki(ch, regex, linkTarget);
      }
  }
}

function highlineWiki(elmID, linkTarget, callback) {
    if (linkTarget) {
        if (typeof (linkTarget) == "function") {
            callback = linkTarget;
            linkTarget = "";
        }
    }
    linkTarget = linkTarget || "";
    
    function onAJAXComplete(obj) {
        setWikiLink(elmID, obj.TagList, linkTarget);
        if (callback && typeof (callback) == "function") {
            callback(obj);
        }
    }
    parseWikiSubject(elmID, onAJAXComplete);
}