// contextual help.. 
// written by brandon burkett for elementblend
// may 1, 2006

//globals
var CURRENT_ELEM;
var STANDARD_WIDTH = 160;
var fader;
var delay;
var interval = 0.60;
var termClass = "defineTerm";
var labelClass = "labelHelp";
var termBG = "termbg.jpg";
var labelBG = "labelbg.jpg";

// change these to whatever entity you wish (that has a title)
var entityType = new Array();
entityType.push('img', 'label', 'span');

// Simple Browser sniffer
function Browser()
	{
	var ua, s, i;

	this.isIE = false;
	this.isNS = false;
	this.version = null;

	ua = navigator.userAgent;

	s = 'MSIE';
	if ((i = ua.indexOf(s)) >= 0)
		{
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
		}

	s = 'Netscape6/';
	if ((i = ua.indexOf(s)) >= 0)
		{
		this.isNS = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
		}

	// treat any other 'Gecko' browser as NS 6.1.
	s = 'Gecko';
	if ((i = ua.indexOf(s)) >= 0)
		{
		this.isNS = true;
		this.version = 6.1;
		return;
		}

	s = 'Safari';
	if ((i = ua.indexOf(s)) >= 0)
		{
		this.isSA = true;
		this.version = 2.0;
		return;
		}
}


// form structure

var contextualHelp = 
{
	// will add an event to id/element
	addEvent: function(elem, eventType, funct)
	{
		if(elem.addEventListener)
		{
			elem.addEventListener(eventType,funct,false);
		}
		else if(elem.attachEvent)
		{
			elem.attachEvent('on'+eventType, funct);
		}
		else
		{
			elem['on'+eventType] = funct;
		}

		

	},

	// initalizer function
	init: function(entity)
	{
		for(i=0; i<entity.length; i++)
		{
			if(document.getElementsByTagName(entity[i]))
			{
				var elements = document.getElementsByTagName(entity[i]);
				

				for(x=0; x<elements.length; x++)
				{
					var thisElem = elements[x];
					
					if(thisElem.className == 'terminology' || thisElem.className == 'galleryImage' || thisElem.className == 'newsImageDetail')
					{						
						var thisTitle = thisElem.title;

						// remove title and add new attribute
						thisElem.setAttribute('contextualhelp', thisTitle);
						thisElem.removeAttribute('title');

						// add events for item
						contextualHelp.addEvent(thisElem,'mouseover',contextualHelp.delay);
						contextualHelp.addEvent(thisElem,'mouseout',contextualHelp.hide);
						contextualHelp.addEvent(thisElem,'focus',contextualHelp.delay);
						contextualHelp.addEvent(thisElem,'blur',contextualHelp.hide);
					}
					
					// special case for language ratings
					if(thisElem.className == 'languageLevel' || thisElem.className == 'programTitle')
					{						
						var thisTitle = thisElem.title;
						
						if(thisTitle != '')
						{
							// remove title and add new attribute
							thisElem.setAttribute('contextualhelp', thisTitle);
							thisElem.removeAttribute('title');

							// add events for item
							contextualHelp.addEvent(thisElem,'mouseover',contextualHelp.delay);
							contextualHelp.addEvent(thisElem,'mouseout',contextualHelp.hide);
							contextualHelp.addEvent(thisElem,'focus',contextualHelp.delay);
							contextualHelp.addEvent(thisElem,'blur',contextualHelp.hide);
						}
					}

				}
			}

		}
			
		
	},

	position: function (elem)
	{
		if (elem.offsetParent)
		{
			for (var posX = 0, posY = 0; elem.offsetParent; elem = elem.offsetParent)
			{
				posX += elem.offsetLeft;
				posY += elem.offsetTop;
			}
			return [posX, posY];
		}
		else
		{
			return [elem.x, elem.y];
		}
	},



	getParent: function (el, pTagName)
	{
		if (el == null)
		{
			return null;
		}
		// gecko bug, supposed to be uppercase
		else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())
		{
			return el;
		}
		else
		{
			return getParent(el.parentNode, pTagName);
		}
	},

	delay: function (e)
	{
		// get event for multiple browsers
		if(!e)
		{
			e = window.event;
		}
		if(e.target)
		{
			targ = e.target;
		}
		else if(e.srcElement)
		{
			targ = e.srcElement;
		}
		if(targ.nodeType == 3) // defeat Safari bug
		{
			targ = targ.parentNode;
		}
		// end get e

		if(targ == null)
		{
			if(browser.isIE == true)
			{
				targ = window.event.srcElement

			}
			else
			{
				targ = e.target
			}
		}
		
		delay = setTimeout("contextualHelp.show(targ)", interval * 100);		
	},

	show: function (elem)
	{
		//alert(elem+" "+elem.getAttribute('contextualhelp'));
		if (CURRENT_ELEM) contextualHelp.hide(CURRENT_ELEM);
    	if (!document.getElementsByTagName) return;

		// check class names

		if(elem.className == 'terminology' || elem.className == 'galleryImage' || elem.className == 'newsImageDetail')
		{

			var contextual_help = elem.getAttribute('contextualhelp');
    
		    var newDiv = document.createElement('div');

			if(elem.className == 'terminology')
			{
	    		newDiv.className = termClass;
				//newDiv.style.backgroundImage = 'url(images/'+termBG+')';
				//newDiv.style.backgroundColor = '#ffffff';
				//newDiv.style.backgroundRepeat = 'no-repeat';
				//newDiv.style.backgroundPosition = 'top left';
				
			}
			if(elem.className == 'galleryImage' || elem.className == 'newsImageDetail')
			{
				
				newDiv.className = labelClass;
				//newDiv.style.backgroundImage = 'url(images/'+labelBG+')';
				//newDiv.style.backgroundColor = '#000000';
				//newDiv.style.backgroundRepeat = 'no-repeat';
				//newDiv.style.backgroundPosition = 'top left';
			}
		    innerText = "<p>"+contextual_help.replace(/\r\r|\n\n|\r\n\r\n/g, "</p><p>")+"</p>";
			newDiv.innerHTML = innerText;	

			var w = STANDARD_WIDTH;
        
		    newDiv.style.width = w + 'px';    

		    mpos = contextualHelp.position(elem);
		    mx = mpos[0];
		    my = mpos[1];
    
		    newDiv.style.left = (mx+15) + 'px';
		    newDiv.style.top = (my+95) + 'px';

		    if (window.innerWidth && ((mx+w) > (window.innerWidth-30)))
			{
		        newDiv.style.left = (window.innerWidth - w - 30) + 'px';
			}
		    if (document.body.scrollWidth && ((mx+w) > (document.body.scrollWidth-30)))
			{
		        newDiv.style.left = (document.body.scrollWidth - w - 30) + 'px';
			}
    
		    document.getElementsByTagName('body')[0].appendChild(newDiv);
		    fader = new Fadomatic(newDiv, 10, 0);
		    fader.fadeIn();

		    CURRENT_ELEM = newDiv;			
		} 
		
		// custom settings for language rating levels
		if(elem.className == 'languageLevel' || elem.className == 'programTitle')
		{
			var contextual_help = elem.getAttribute('contextualhelp');
    
		    var newDiv = document.createElement('div');
			newDiv.className = labelClass;
			
		    innerText = "<p>"+contextual_help.replace(/\r\r|\n\n|\r\n\r\n/g, "</p><p>")+"</p>";
			newDiv.innerHTML = innerText;		

			var w = 500;
        
		    newDiv.style.width = w + 'px';    

		    mpos = contextualHelp.position(elem);
		    mx = mpos[0];
		    my = mpos[1];
    
		    newDiv.style.left = (mx-200) + 'px';
		    newDiv.style.top = (my+45) + 'px';

		    if (window.innerWidth && ((mx+w) > (window.innerWidth-30)))
			{
		        newDiv.style.left = (window.innerWidth - w - 30) + 'px';
			}
		    if (document.body.scrollWidth && ((mx+w) > (document.body.scrollWidth-30)))
			{
		        newDiv.style.left = (document.body.scrollWidth - w - 30) + 'px';
			}
    
		    document.getElementsByTagName('body')[0].appendChild(newDiv);
		    fader = new Fadomatic(newDiv, 10, 0);
		    fader.fadeIn();

		    CURRENT_ELEM = newDiv;			
		} 
		// end custom settings for language rating levels
    

		
	},

	hide: function (e)
	{
		if (delay) clearTimeout(delay);
		if (CURRENT_ELEM)
		{
			fader.haltFade();		
			fader.fadeOut();
			CURRENT_ELEM = null;
		}
	}
}