/*
* Thesaurus
*
* @package thesaurus
* @author $Author: sheiko $  
* @since v.2.0.3 
* @copyright (c) Dmitry Sheiko http://www.cmsdevelopment.com 
*/
document.write("<script type='text/javascript' src='http://yui.yahooapis.com/2.8.1/build/yahoo/yahoo-min.js'></script>");
document.write("<script type='text/javascript' src='http://yui.yahooapis.com/2.8.1/build/event/event-min.js'></script>");
document.write("<script type='text/javascript' src='http://yui.yahooapis.com/2.8.1/build/json/json-min.js'></script>");
document.write("<script type='text/javascript' src='http://yui.yahooapis.com/2.8.1/build/connection/connection-min.js'></script>");

var THConfig = { 
		CaseSensitive: "off", 
		Charset: "UTF-8",
		Copyrights: '<div class="header">Information - Provided by Supercoder.com</div>',
		CtrlURL: "http://supercoder.com/thesaurus/db_controller.php",	
		divName: 'InstantMessage',
		MemoryCache: 'on',
		parseElements: []
};

var request;
var pageparshed=false;
var onreadycallme=false;
var Timer = null;
var Cache = [];
var AcceptMessage=true;

var SubstitutionTable = new Array();
var content_arr = new Array();

if(document.implementation && document.implementation.createDocument) var isMozilla=true;
	else var isMozilla=false;

	
document.write('<div id="'+THConfig.divName+'" onmouseover="clearTimer()" onmouseout=\"setTimer();\" class="instant_message">&nbsp;</div>');

// Short name of function
function $(divName) {
	return document.getElementById(divName);
}

function hideMessage(){
	var MessageObj=$(THConfig.divName);
	MessageObj.style.visibility="hidden";
}

function clearTimer() {
 if (Timer) {
   clearTimeout(Timer);
   Timer = null;
 }
}

function setTimer() {
 	Timer = window.setTimeout('hideMessage()', 250);
}

window.size = function()
{
	var w = 0;
	var h = 0;
	//IE
	if(!window.innerWidth)
	{
		//strict mode
		if(!(document.documentElement.clientWidth == 0)) {
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		}
		//quirks mode
		else {
			if(document.body.clientWidth) {
				w = document.body.clientWidth;
				h = document.body.clientHeight;
			} else {
				w = window.document.body.offsetWidth;
				h = window.document.body.offsetHeight;
			}
		}
	}
	//w3c
	else {
		w = window.innerWidth;
		h = window.innerHeight;
	}
	return {width:w,height:h};
}

function adjustMessage(evt) {
	var left;
	var top;
	clearTimer();
	MessageObj = $(THConfig.divName);
	if (isMozilla) event=evt;

	wsize = window.size();
	var rightedge = wsize.width-event.clientX;
	var bottomedge = wsize.height-event.clientY;
	
	// Compliance with HTML 4/XHTML
	if(document.documentElement && document.documentElement.scrollTop)
		scrollTop = document.documentElement.scrollTop;
	else
		scrollTop = document.body.scrollTop;
		
	// Compliance with HTML 4/XHTML
	if(document.documentElement && document.documentElement.scrollLeft)
		scrollLeft = document.documentElement.scrollLeft;
	else
		scrollLeft = document.body.scrollLeft;
		
	
	if (rightedge < MessageObj.offsetWidth)
		left = scrollLeft + event.clientX - MessageObj.offsetWidth;
	else
		left = scrollLeft + event.clientX;
		
	if (bottomedge < MessageObj.offsetHeight)
		top = scrollTop + event.clientY - MessageObj.offsetHeight;
	else
		top = scrollTop + event.clientY;

		MessageObj.style.top = (top+10)+"px";
		MessageObj.style.left = (left+10)+"px";
		//
		MessageObj.innerHTML = THConfig.Copyrights + '<div class="body">Loading...</div><div class="footer"><div class="footer_logo"><a href="http://www.supercoder.com/"><img src="http://www.supercoder.com/thesaurus/images/pp3_ftr_logo.gif" alt="" border="0" /></a></div><div class="footer_btn"><a href="#"><img src="http://www.supercoder.com/thesaurus/images/pp3_ftr_xbtn.gif" alt="" border="0" /></a></div></div>';	
		MessageObj.style.visibility = "visible";
}

function deliveryMessage(text,search_term) {
	if(text!=''){	
		var btmlink = '<div class="btmlink"><a target="_blank" href="http://www.supercoder.com/site-search-result-page/?searchtype=tabadvance&keyword='+search_term+'">View full results at supercoder.com</a></div>'; //<br /><a target="_blank" href="http://www.supercoder.com/sign-up/">Sign up for a free-trial.</a>
	} else {
		var btmlink = '<div class="btmlink"><div style="text-align:justify;">Due to our licensing agreement with the American Medical Association (AMA), you must first <a target="_blank" href="http://www.supercoder.com/members/login.php">login to supercoder.com</a> to view results for the CPT codes.</div><br/><a target="_blank" href="http://www.supercoder.com/advance-search-results/?term='+search_term+'">View full results at supercoder.com</a></div>'; //<br /><a target="_blank" href="http://www.supercoder.com/sign-up/">Sign up for a free-trial.</a>
	}
	var header = '<div class="header"><a target="_blank" href="http://www.supercoder.com/">Code Lookup for '+search_term+'</a></div>';
	MessageObj.innerHTML = header + '<div class="body">'+text+''+btmlink+'</div><div class="footer"><div class="footer_logo"><a target="_blank" href="http://www.supercoder.com/"><img src="http://www.supercoder.com/thesaurus/images/pp3_ftr_logo.gif" alt="" border="0" /></a></div><div class="footer_btn" onclick=\"hideMessage();\"><img src="http://www.supercoder.com/thesaurus/images/pp3_ftr_xbtn.gif" alt="" border="0" /></div></div>';
	}

function showMessage(json) {	
	var respondStructure = eval( '(' + json + ')' ); 
	deliveryMessage(respondStructure.content, respondStructure.term);
	if(THConfig.MemoryCache=="on") Cache[respondStructure.term] = respondStructure.content;
	return false;
}

var handleSuccess = function(o){
	if(o.responseText !== undefined){
		showMessage(o.responseText);
	}
};

var handleFailure = function(o){
	if(o.responseText !== undefined){
		showMessage("Connection Error");
	}
};

var callback =
{
  success:handleSuccess,
  failure:handleFailure,
  xdr: true
};

function getDefinition(term,evt){
		adjustMessage(evt);
		term1=term.toUpperCase();
		//alert(Cache[term]);
		if(Cache[term1]!=undefined) { return deliveryMessage(Cache[term1], term);  }
}


function stripSlashes(content) {
		// Strip Slashes
		re = /\\\"/gi;
		content = content.replace(re, '"');
		re = /\\\'/gi;
		content = content.replace(re, "'");
		return content;
}

var phandleSuccess = function(o){
	
	//alert(o.responseText);
	
	if(o.responseText !== undefined && pageparshed==false)
	{
		
		var respondStructure = eval( '(' + o.responseText + ')' );
		content_arr = respondStructure.alloutput.split('^');			
		//alert(content_arr);
		for(i=0;i<content_arr.length;i++)
		{		
			var cache_arr = new Array();
			cache_arr = content_arr[i].split(':');
			 Cache[cache_arr[0]] = cache_arr[1];
			 //alert(cache_arr);
		}	  
		//alert(Cache);
		SubstitutionTable = respondStructure.termlist;
		if(THConfig.parseElements.length>0) {		
			// Elements to parse are defined
			for(var Inx in THConfig.parseElements) {		
				parseChildNodes($(THConfig.parseElements[Inx]));
				re = /\{th\}(.*?)\{\/th\}/gi;
				text_str = $(THConfig.parseElements[Inx]).innerHTML + '';
				$(THConfig.parseElements[Inx]).innerHTML = text_str.replace(re, "<a class=\"thesaurus\" onmouseover=\"getDefinition('$1', event);\" onmouseout=\"setTimer();\">$1</a>");
			}
			pageparshed = true;
		} else {

			// Otherwise parse whole BODY content
			BodyObj = document.getElementsByTagName("BODY");
			parseChildNodes(BodyObj[0]);
			re = /\{th\}(.*?)\{\/th\}/gi;
			text_str = BodyObj[0].innerHTML + '';			
			BodyObj[0].innerHTML = text_str.replace(re, "<a class=\"thesaurus\" onmouseover=\"getDefinition('$1', event);\" onmouseout=\"setTimer();\">$1</a>");
			pageparshed = true;
		}
	}
	
};


var phandleFailure = function(o){ alert("It seems as the script can not connect to the server. Please, check if controller exists by URL "+THConfig.CtrlURL); };
var pcallback =
{
  success:phandleSuccess,
  failure:phandleFailure,
  xdr: true
};



function addEvent(obj, evType, fn)
{ 
 if (obj.addEventListener){ 
   obj.addEventListener(evType, fn, false); 
   return true; 
 } else if (obj.attachEvent){ 
   var r = obj.attachEvent("on"+evType, fn); 
   return r; 
 } else { 
   return false; 
 } 
}

function whichBrs() {
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("opera") != -1) return 'Opera';
if (agt.indexOf("staroffice") != -1) return 'Star Office';
if (agt.indexOf("webtv") != -1) return 'WebTV';
if (agt.indexOf("beonex") != -1) return 'Beonex';
if (agt.indexOf("chimera") != -1) return 'Chimera';
if (agt.indexOf("netpositive") != -1) return 'NetPositive';
if (agt.indexOf("phoenix") != -1) return 'Phoenix';
if (agt.indexOf("firefox") != -1) return 'Firefox';
if (agt.indexOf("safari") != -1) return 'Safari';
if (agt.indexOf("skipstone") != -1) return 'SkipStone';
if (agt.indexOf("msie") != -1) return 'Internet Explorer';
if (agt.indexOf("netscape") != -1) return 'Netscape';
if (agt.indexOf("mozilla/5.0") != -1) return 'Mozilla';
if (agt.indexOf('\/') != -1) {
if (agt.substr(0,agt.indexOf('\/')) != 'mozilla') {
return navigator.userAgent.substr(0,agt.indexOf('\/'));}
else return 'Netscape';} else if (agt.indexOf(' ') != -1)
return navigator.userAgent.substr(0,agt.indexOf(' '));
else return navigator.userAgent;
}

function stripHTML(oldString) {

  re = /<\S[^><]*>/g;
  oldString = oldString.replace(re, " ");
  re = /\\n/g;
  oldString = oldString.replace(re, " ");
  re = /\\r/g;
  oldString = oldString.replace(re, " ");
  re = /\\t/g;
  oldString = oldString.replace(re, " ");
  re = /(\s+)/g;
  oldString = oldString.replace(re, " ");
  //alert(oldString);
  return oldString;
}

function onxdrready1(YCM) { 
	
	onreadycallme=true;
	var texttosend='';
	//alert("XDR Ready");
	//alert(THConfig.parseElements.length);
	if(THConfig.parseElements.length>0) {		
			for(var Inx in THConfig.parseElements) {		
				//alert(document.getElementById(THConfig.parseElements[Inx]));
				if(document.getElementById(THConfig.parseElements[Inx])!=null) texttosend += document.getElementById(THConfig.parseElements[Inx]).innerHTML+"";
			}
		} else {

			// Otherwise parse whole BODY content
			BodyObj = document.getElementsByTagName("BODY");
			texttosend = BodyObj[0].innerHTML + '';			
		}	
	
	//alert("before connection");
	request = YCM.asyncRequest('POST', THConfig.CtrlURL, pcallback, 'charset='+THConfig.Charset+'&casesensitive='+THConfig.CaseSensitive+'&call=getDataAndParsing&bodytext='+encodeURIComponent(stripHTML(texttosend)));
	//alert("after connection");
	return true;
	}

function parseContent(parse_e){
	  //alert("on calling parsecontent");
	  //if(whichBrs()=="Safari") return false;
	  //alert(parse_e);
	  var newdiv = document.createElement('div');
	  var divIdName = 'myDiv';
	  newdiv.setAttribute('id',divIdName);
	  newdiv.innerHTML = '<p align="center"><a title="popup links provided by supercoder.com" class="pop_msg"  href="javascript:void(0)" onclick="window.open(\'http://www.supercoder.com/\',\'welcome\',\'width=950,height=600,resizable=yes,menubar=yes,status=yes,location=yes,toolbar=yes,scrollbars=yes\')">Popup links provided by Supercoder.com</a></p>';
	  document.body.appendChild(newdiv); 
	//alert("before init parse_e");
	parse_e = typeof(parse_e) != 'undefined' ? parse_e : '';
	
	if(parse_e!='')
	{
		var element_array = parse_e.split(",");
		THConfig.parseElements = element_array;
	}
	//alert("before init YUI");
	YCM = YAHOO.util.Connect;
	//alert("after init YUI");
	var siteurl = window.location.hostname;

	// Initialize the Flash transport for XDR
	//alert("before init transport");
	YCM.transport('http://'+siteurl+'/connection.swf');
	//alert("after init transport");
	// Subscribe to xdrReadyEvent, which is fired when connection.swf's finishes loading, and call function request(). 
	//Enable the request button when the Flash transport is initialized.
	
	YCM.xdrReadyEvent.subscribe(onxdrready1);
	if(onreadycallme == false) setTimeout("onxdrready1(YCM)",1000);
	
}

function calcClick(){
	if(THConfig.MemoryCache!="on") return true;
	for(var term in Cache) {}
	var request = YAHOO.util.Connect.asyncRequest('POST', THConfig.CtrlURL, pcallback, 'call=calcClick&casesensitive='+THConfig.CaseSensitive+'&term='+term);
	return true;
}

function parseText(obj) {
	var text_str = obj.nodeValue + '';	
	if(text_str.length<2 || text_str=="null") return false;
	for(var i=0;i<SubstitutionTable.length;i++) {
		re = new RegExp(SubstitutionTable[i],(THConfig.CaseSensitive=="on"?"g":"gi")); 
		if(re.test(text_str)) {
			
			obj.nodeValue = applyTerm(SubstitutionTable[i], text_str);
			text_str = obj.nodeValue;
		}
	}
}

function applyTerm(term, text_str) {
	if(!text_str) return text_str;
	if(!term) return text_str;

	if(term+''==text_str+'') return "{th}"+text_str+"{/th}";
	re = new RegExp("^("+term+")([ \r\n!;,%\"'\.])",(THConfig.CaseSensitive=="on"?"g":"gi")); 
	text_str = text_str.replace(re, "{th}$1{/th}$2");
	re = new RegExp("([ \r\n!;,%\"'])("+term+")$",(THConfig.CaseSensitive=="on"?"g":"gi")); 
	text_str = text_str.replace(re, "$1{th}$2{/th}");
	re = new RegExp("([ \r\n\.!;,%\"'\(\-])("+term+")([ \r\n!;,%\"'\?\)\-\.])",(THConfig.CaseSensitive=="on"?"g":"gi")); 
	text_str = text_str.replace(re, "$1{th}$2{/th}$3");
	return text_str;
}

function parseChildNodes(obj) {
	for (var i=0; i<obj.childNodes.length; i++) {
		if(	obj.childNodes[i].childNodes.length>0 && 
			obj.childNodes[i].nodeName!="SCRIPT" && 
			obj.childNodes[i].nodeName!="A" && 
			obj.childNodes[i].nodeName!="H1" && 
			obj.childNodes[i].nodeName!="H2" && 
			obj.childNodes[i].nodeName!="H3")
				parseChildNodes( obj.childNodes[i] );
		else { parseText( obj.childNodes[i] ) ; }
	}
}
