var ToolTipEvents = {
    offsetLeft : (-25),
    offsetTop : (10),
    posRef : function(){
	return (
		(document.documentElement.scrollTop)?
		document.documentElement : document.body
		);
    },
    showTooltip : function(e){
	ToolTipEvents._cleanup();
	BubbleTips.bubbleNode.appendChild(this.tooltip);
	//	Effects.fadeIn(this.tooltip,BubbleTips.opacity);
	ToolTipEvents.followMouse(e);
    },
    hideTooltip : function(e){
	Effects.fadeOut(this.tooltip, ToolTipEvents._cleanup);
    },
    followMouse : function(e){
	if(e == null){ e = window.event };
	var posx = ToolTipEvents.offsetLeft;
	var posy = ToolTipEvents.offsetTop;
	if(e.pageX || e.pageY){
	    posx += e.pageX;
	    posy += e.pageY;
	} else if(e.clientX || e.clientY) {
	    posx += e.clientX + ToolTipEvents.posRef().scrollLeft;
	    posy += e.clientY + ToolTipEvents.posRef().scrollTop;
	}

    var docwidth=700;
    var docheight=700;

    var img_width=410;
    var img_height=410;

    if (docwidth < (e.pageX + img_width)){
	    posx = posx - img_width; 

	} 
    if (docheight < (e.pageY + (1.1 * img_height) - document.body.scrollTop)){

	    posy = e.pageY - Math.max(0,img_height);
	} 

	BubbleTips.bubbleNode.style.top  = (posy) + "px";
	BubbleTips.bubbleNode.style.left = (posx) + "px";
    },
    _cleanup : function(){
	var bubble = BubbleTips.bubbleNode;
	if( bubble.childNodes.length > 0 ){
	    bubble.removeChild(bubble.firstChild);
	}
    }
};

var Effects = {
    fadeIn : function (elem,maxOpac){
	elem.fadeIn = Effects._fadeIn;
	elem.maxOpac = maxOpac;
	elem.curOpac = 0;
	this.cancelCurrent();
	elem.fadeIn();
    },
    fadeOut : function (elem,fadeDoneF){
	elem.fadeOut = Effects._fadeOut;
	elem.fadeOutDone = fadeDoneF;
	this.cancelCurrent();
	elem.fadeOut();
    },
    cancelCurrent : function() {
	clearTimeout(window.evtId);
    },
    _fadeIn : function() {
	if( (+this.curOpac) < (+this.maxOpac) ){
	    this.curOpac = (+this.curOpac)+(0.05);
	    Effects.setOpacity(this,this.curOpac);
	    window.fadeInElem = this;
	    window.evtId = setTimeout(function(){this.fadeInElem.fadeIn()},30);
	} else {
	    Effects.setOpacity(this,this.maxOpac);
	    window.fadeInElem = null;
	}
    },
    _fadeOut : function() {
	if( (+this.curOpac) > 0 ){
	    this.curOpac = Math.max(0,(+this.curOpac)-(0.05));
	    Effects.setOpacity(this,this.curOpac);
	    window.fadeOutElem = this;
	    window.evtId = setTimeout(function(){this.fadeOutElem.fadeOut()},30);
	} else if(this.fadeOutDone) {
	    this.fadeOutDone();
	    window.fadeOutElem = null;
	}
    },
    setOpacity : function (elem,opac){
	elem.style.filter = "alpha(opacity:"+ ((+opac)*100) +")";
	elem.style.KHTMLOpacity  = opac;
	elem.style.WebkitOpacity = opac;
	elem.style.MozOpacity    = opac;
	elem.style.opacity       = opac;
    }
};

var BubbleTips = {
    opacity : "1",
    bubbleNode : null,
    activateTipOn : function(type){
	var bubble = document.createElement("div");
	bubble.style.position = "absolute";
	bubble.style.zIndex = "9";
	this.bubbleNode = bubble;
	document.getElementsByTagName("body")[0].appendChild(bubble);
	var tipTags = document.getElementsByTagName(type);
	for(var i=0;i<tipTags.length;i++){
	    this.bindBubbleTip(tipTags[i]);
	}
    },
    bindBubbleTip : function(elem) {
	var bubble = this.createElem("div","bubbleTooltip");
	var tipTop = this.createElem("div","top");
	var img = document.createElement("img");
	elem.removeAttribute("title");
	var tipImg=elem.getAttribute("image");
	img.setAttribute("src", tipImg);
	img.setAttribute("height", "400");
	img.setAttribute("width", "400");
	tipTop.appendChild(img);
	bubble.appendChild(tipTop);
	bubble.appendChild(this.createElem("div","bottom"));
	Effects.setOpacity(bubble,this.opacity);
	elem.tooltip = bubble;
	elem.onmouseover = ToolTipEvents.showTooltip;
	elem.onmouseout  = ToolTipEvents.hideTooltip;
	elem.onmousemove = ToolTipEvents.followMouse;
    },
    createElem : function(tag,className){
	var elem = document.createElement(tag);
	elem.className = className;
	elem.style.display = "block";
	return elem;
    }
};

var BlockQTipsConf = {
    offsetLeft : (-25)      /* pixel offset */,
    offsetTop  : (-20)      /* pixel offset */,
    width      : 20         /* width in em's */, 
    opacity    : "0.85"     /* final opacity of the block */,
    borderColor: "#555555",
    borderWidth: "1px",
    bgColor    : "#bbbbbb"
}
    var BlockQuoteEvents = {
	posRef : function(){
	    return (
		    (document.documentElement.scrollTop)?
		    document.documentElement : document.body
		    );
	},
	showCitation : function(e){
	    var citation = this.citation;
	    if(window.activeCit == citation){
		clearTimeout(window.hideEvent);
	    }
	    if(citation.style.display != "block"){
		citation.style.display = "block";
		Effects.fadeIn(citation,BlockQTipsConf.opacity);
		var posRef = ((document.documentElement.scrollTop)?
			      document.documentElement : document.body);
		if(!e){
		    e = window.event;
		}
		BlockQuoteEvents.moveCitation(e,citation);
	    }
	},
	moveCitation : function(e,citation){
	    if(e == null){ e = window.event };
	    var posx = BlockQTipsConf.offsetLeft;
	    var posy = BlockQTipsConf.offsetTop;
	    if(e.pageX || e.pageY){
		posx += e.pageX;
		posy += e.pageY;
	    } else if(e.clientX || e.clientY) {
		posx += e.clientX + BlockQuoteEvents.posRef().scrollLeft;
		posy += e.clientY + BlockQuoteEvents.posRef().scrollTop;
	    }
	    citation.style.top  = (posy) + "px";
	    citation.style.left = (posx) + "px";
	},
	hideCitation : function(e){
	    var citation = this.citation;
	    window.activeCit = citation;
	    window.hideEvent = setTimeout( function(){
		    window.activeCit.style.display = "none";
		}, 200);
	},
	_cleanup : function(){
	}
    };

var BlockQTips = {
    activateOn : function(type){
	var tags = document.getElementsByTagName(type);
	for(var i=0;i<tags.length;i++){
	    this.buildCitation(tags[i]);
	}
    },
    buildCitation : function(elem) {
	var titleText = elem.getAttribute("title");
	var url = elem.getAttribute("cite");
	elem.removeAttribute("title");
	if(titleText==null || titleText.length==0){
	    titleText = "No Info";
	}
	var citation = document.createElement("div");
	var vmlWrapper = document.createElement("v:roundrect");
	vmlWrapper.strokecolor  = BlockQTipsConf.borderColor;
	vmlWrapper.strokeweight = BlockQTipsConf.borderWidth;
	vmlWrapper.fillColor    = BlockQTipsConf.bgColor;
	vmlWrapper.arcSize = "15%";
	if(typeof vmlWrapper.style.behavior != "undefined"){
	    /* Cheap hack to determine if client has VML */
	    citation = vmlWrapper;
	}
	citation.className = "citation";
	citation.style.width = BlockQTipsConf.width + "em";
	citation.style.position = "absolute";
	
	var title = this.createElem("span","citeTitle");
	title.appendChild(document.createTextNode(titleText));
	var citeAnchorSec = this.createElem("div","citeBottom");
	var anchor = document.createElement("a");
	anchor.href = url;
	var urlSize = (BlockQTipsConf.width * 1.5);
	var urlText = this.makeUrlFit(url,urlSize);
	anchor.appendChild(document.createTextNode(urlText));
	anchor.style.fontFamily = "monospace";
	citeAnchorSec.appendChild(anchor);
	citation.appendChild(title);
	citation.appendChild(citeAnchorSec);
	
	elem.citation = citation.citation = citation;
	elem.onmouseover = citation.onmouseover = BlockQuoteEvents.showCitation;
	elem.onmouseout  = citation.onmouseout  = BlockQuoteEvents.hideCitation;
	document.getElementsByTagName("body")[0].appendChild(citation);
    },
    createElem : function(tag,className){
	var elem = document.createElement(tag);
	elem.className = className;
	elem.style.display = "block";
	return elem;
    },
    makeUrlFit : function(url,size){
	var urlText = url;
	size -=4;
	if(url.length>size){
	    urlText =
		urlText.substring(0,size/2)
		+ "....."
		+ urlText.substring(urlText.length-size/2);
	}
	return urlText;
    }
};

window.onload=function(){
	BubbleTips.activateTipOn("abbr");
	BubbleTips.activateTipOn("acronym");
};
