// JavaScript Document
var page_txt= "";
var charlist= new Array("\"","\'","\\",","," ","(",")",".",":",";","{","}","[","]","=","?","!","*","-","<",">");
var restrict_tags= new Array("a","span","script","style","form","!--","blockquote","address");

Array.prototype.in_array = function(obj){ 
	return new RegExp('(^|\,)\\'+obj+'(\,|$)','gi').test(this);
}

// Array support for the push method in IE 5
if(typeof Array.prototype.push != "function"){
	Array.prototype.push = ArrayPush;
	function ArrayPush(value){
		this[this.length] = value;
	}
}

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

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 wordmatch(term,def,index){
	var starti= page_txt.toLowerCase().indexOf(term.toLowerCase(),index);
	var endi= starti+term.length;
	var svalid= false; //character test before term
	var evalid= false; //character test after term
	var bvalid= false; //term is not inside an invalid tag or declaration
	var bsub= ""; //beginning of page text upto the term
	var tsub= ""; //new text to add to page text
	var esub= ""; //ending of page text after the term
	var includestring;
	var adv= 1;
	//alert(starti);
	if(starti != -1){
		//alert(page_txt.charAt(starti-1)+term+page_txt.charAt(endi));
		if(starti == 0){
			svalid= true;
		} else if(charlist.in_array(page_txt.charAt(starti-1))) {
			svalid= true;
		}
		
		if(endi >= page_txt.length){
			evalid= true;
		} else if(charlist.in_array(page_txt.charAt(endi)) || page_txt.charAt(endi) == "s"){
			evalid= true
		}
		
		if(svalid && evalid){
			var brackpos= page_txt.lastIndexOf("<",starti);
			if(!brackpos){
				bvalid= true;
			}else{
				if(page_txt.indexOf(">",brackpos) < starti){
					bvalid= checkRestrictedTags(starti);
				}
			}
		}
		
		if(bvalid){
			//alert(term+"- "+page_txt.charAt(starti-1)+"..."+page_txt.charAt(endi));
			//alert("found: "+term+" at "+starti);
			bsub= page_txt.substr(0,starti);
			tsub= page_txt.substr(starti,term.length);
			esub= page_txt.substr(endi);
			includestring= "<span class=\"gloson\" title=\""+term+" - "+def+"\" rel=\""+term+"\">"+tsub+"</span>";
			page_txt= bsub.concat(includestring+esub);
			
			adv= includestring.length; //span characters plus the length of the term and definition
		}
		wordmatch(term,def,starti+adv);
	}
}
function checkRestrictedTags(starti){
	for(var i=0;i<restrict_tags.length;i++){
		var brackpos= page_txt.lastIndexOf("<"+restrict_tags[i],starti);
		if(brackpos){
			if(restrict_tags[i] == "!--"){
				if(page_txt.indexOf("-->",brackpos) > starti){ return false; }
			}else if(page_txt.indexOf("</"+restrict_tags[i],brackpos) > starti){
				return false;
			}
		}
	}
	return true;
}
function setGlossaryCookie(toggle){
	var toggle= (toggle)? 1 : 0;
	document.cookie= "glossarytoggle="+toggle+";path=/";
	//alert(toggle+"...\n\n"+document.cookie);
}

function getGlossaryCookie(){
	var beginindex, result;
	beginindex= document.cookie.indexOf("glossarytoggle=");
	if(beginindex == -1){
		//sets the glossarytoggle cookie to true if it doesn't exist yet
		setGlossaryCookie(true);
		return true;
	}else{
		beginindex+= 15;
		if(document.cookie.substr(beginindex,1) == "1"){
			return true;
		}else{
			return false;
		}
	}
	
}
	
function loadGlossary(htmlstring){
	var testCookie= getGlossaryCookie();
	var htmldiv= htmlstring.split(",");
	for(var j=0;j<htmldiv.length;j++){
		page_txt= $('#'+htmldiv[j]).html();
		for(var i=0;i<glos_term.length;i++){
			wordmatch(glos_term[i],glos_def[i], 0);
		}
		document.getElementById(htmldiv[j]).innerHTML= page_txt;
	}
	$("span.gloson").tooltip({
		track: true, 
		delay: 0, 
		showURL: false, 
		opacity: 0.90, 
		fixPNG: true, 
		showBody: " - ", 
		extraClass: "glossary", 
		top: -15, 
		left: 5
	});
	$("span.gloson").click(function(){
		termLink($(this));
		//$(this).hide("slow");
	});
	/*$("#glostoggle").click(function(){
		$.tooltip.block();
	});*/
	if(!testCookie){
		//alert('turn everything off!');
		setGlossaryCookie(true);
		glostoggle();
		//$.tooltip.block();
	}
}
function termLink(term_obj){
	if(term_obj.attr("class") == "gloson"){
		var linktext= term_obj.attr("rel").toLowerCase();
		linktext= linktext.split(" ").join("");
		var betatext= (window.location.pathname.toString().match("ghostdevel/"))? "ghostdevel/" : "";
		linktext= "http://brainline.org/"+betatext+"function_pages/glossary.php#"+linktext;
		window.location.target= "_blank";
		//window.location= linktext;
		var popopen= window.open(linktext,'','menubar=yes,toolbar=yes,location=yes,directories=yes,titlebar=yes,status=yes,scrollbars=yes,resizable=yes');
		//alert('function to open page for term: "'+term_obj.attr("rel")+'"');
	}
}
function glostoggle(){
	var toggletext= document.getElementById('glostoggle');
	$.tooltip.block();
	//var glosterms;

	//if(toggletext.innerHTML == "off"){
	//alert(getGlossaryCookie());
	if(getGlossaryCookie()){
		$("span.gloson").removeClass().addClass("glosoff");
		toggletext.innerHTML= "<a class=\"utility\" href=\"javascript:glostoggle();\">on</a> / off";
		setGlossaryCookie(false);
	}else{
		$("span.glosoff").removeClass().addClass("gloson");
		toggletext.innerHTML= "on / <a class=\"utility\" href=\"javascript:glostoggle();\">off</a>";
		setGlossaryCookie(true);
	}
}
