// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// HOW TO USE
// ----------------------------------------------
// <td class='EMS_CV_CMWeekendBox' width='84' height='84' id='24'>&nbsp;</td>
// <td class='EMS_CV_CMWeekdayBox' width='84' height='84' id='25'>
//      <a href='ems_wb_Details.aspx?CalID=1&EventID=657'  class='EMS_CV_EventLink'   
//          OnClick="javascript:open('ems_wb_Details.aspx?CalID=1&EventID=657', 'EventDetails', 'height=550, width=750, locationbar=0, menubar=0, status=0, toolbar=0, resizable, scrollbars');return false;"  
//          rel='Event_657_DIV' pref='up' tipwidth='400' 
//          highlightcolor='#CCCCCC' highlightfrom='25' highlightduration='1'
//      >Halo 3: Finish the Fight</a>
//      
//      <div id='Event_657_DIV' class='CMN_BT_BalloonStyle'>
//          <strong>Title:</strong>Halo 3: Finish the Fight<br />
//          <strong>Event Summary:</strong>Halo 3 is an interesting mix of established protocol and intriguing new stuff. <br />
//          <strong>Event Date(s):</strong>25 Aug 2008 <br />
//      </div>
// </td>
// <td class='EMS_CV_CMWeekdayBox' width='84' height='84' id='26'>&nbsp;</td>
// <td class='EMS_CV_CMWeekdayBox' width='84' height='84' id='27'>&nbsp;</td>
// <td class='EMS_CV_CMWeekdayBox' width='84' height='84' id='28'>&nbsp;</td>
// <td class='EMS_CV_CMWeekdayBox' width='84' height='84' id='29'>&nbsp;</td>
// <td class='EMS_CV_CMWeekendBox' width='84' height='84' id='30'>&nbsp;</td>
//
//
//
// ----------------------------------------------
// STYLE SHEET NEEDED
// ----------------------------------------------
// .CMN_BT_BalloonStyle
// {
// 	background-color: #E0EFBF; border: solid 1px #CCCCCC; color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9px; font-weight: normal; text-align: left; position: absolute; padding: 5px; visibility: hidden; line-height: 18px; z-index: 10000; overflow-x: auto; overflow-y: auto; top: -1000px; left: -1000px;
// 	/*Remove below line to remove OPACITY. Below line should always appear last within this CSS*/
// 	/* filter:alpha(opacity=85);-moz-opacity:.85;opacity:.85; */
// 	/*Remove below line to remove shadow. Below line should always appear last within this CSS*/
// 	filter:				progid:DXImageTransform.Microsoft.Shadow(color=#96A8BA,direction=135,Strength=5);
// }
// .CMN_BT_iBalloonStyle { position: absolute; z-index: 10; display: none; }
// #CMN_BT_ArrowHead { z-index:9999; position:absolute; top:-1000px; left:0; visibility:hidden; }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

var arrowToolTipOnTop = ROOT_FOLDER + 'images/BT_ArrowDown.gif';
var arrowToolTipAtBottom = ROOT_FOLDER + 'images/BT_ArrowUp.gif';
var arrowToolTipOnLeft = ROOT_FOLDER + 'images/BT_ArrowRight.gif';
var arrowToolTipOnRight = ROOT_FOLDER + 'images/BT_ArrowLeft.gif';
var arrowWidth = new Number(16);
var arrowHeight = new Number(16);
var offset = new Number(5);
var delay = new Number(250);



var _val_agt=navigator.userAgent.toLowerCase();
var _val_is_major=parseInt(navigator.appVersion);
var _val_is_ie=((_val_agt.indexOf("msie")!=-1) && (_val_agt.indexOf("opera")==-1));
var _val_isNT=_val_agt.indexOf("windows nt")!=-1;
var _val_IE=(document.all);
var _val_IE4=(_val_is_ie && (_val_is_major==4) && (_val_agt.indexOf("msie 4")!=-1));
var _val_IE6=(_val_is_ie && (_val_agt.indexOf("msie 6.0")!=-1));
var _val_NS=(document.layers);
var _val_DOM=(document.getElementById);
var _val_isMac=(_val_agt.indexOf("Mac")==-1);
var _val_allString="document.";
_val_allString += (_val_IE)?"all.":(_val_DOM)?"getElementById(\"":"";
var _val_styleString=(_val_IE)?".style":(_val_DOM)?"\").style":"";
var _val_endAllString=(_val_DOM && !_val_IE)?"\")":"";
var _val_px=(_val_DOM)?"px":"";



var divTip = null;
var evtTO = null;
var winWidth;
var winHeight;
var winLeft;
var winTop;
var objLeft;
var objRight;
var objTop;
var objBottom;
var divWidth;
var divHeight;
var position;


var minHighlightFrom = 365;
var maxHighlightTo = 1;

AddEventListener(window, 'load', initBaloonTips);

function initBaloonTips()
{
	var imageUp = new Image(); imageUp.src = arrowToolTipOnTop;
	var imageDown = new Image(); imageDown.src = arrowToolTipAtBottom;
	var imageLeft = new Image(); imageLeft.src = arrowToolTipOnLeft;
	var imageRight = new Image(); imageRight.src = arrowToolTipOnRight;

	tiparrow = document.createElement('img');
	tiparrow.setAttribute('id', 'CMN_BT_ArrowHead');
	document.body.appendChild(tiparrow);
	tiparrow.style.position = 'absolute';
	tiparrow.style.display = 'none';
	var allLinks = document.getElementsByTagName('a');
	
	
	for (var i=0; i<allLinks.length; i++)
	{
		
		if (relToElement (allLinks[i]))
		{
		    // The 2 lines below have been disabled because 
		    // They remove the links
		    //allLinks[i].href = 'javascript:void(0);';
		    //allLinks[i].onclick = function() { return false; }
		    
			if(navigator.userAgent.toLowerCase().indexOf("firefox")!=-1||navigator.userAgent.toLowerCase().indexOf("mac")!=-1)
		    {
    		    allLinks[i].addEventListener("mouseover", handleonmouseover, false);
	    		allLinks[i].addEventListener("mouseout", hideBaloonTip, false);
			}
			else if(navigator.userAgent.toLowerCase().indexOf("msie")!=-1)
			{
				allLinks[i].onmouseover = function(e)
			    {
			        var evtObj = (window.event) ? window.event : e;
		        	displayBaloonTip (this, evtObj);
    			}
	    		allLinks[i].onmouseout = hideBaloonTip;
			}
			else
			{
    			allLinks[i].addEventListener("mouseover", handleonmouseover, false);
	    		allLinks[i].addEventListener("mouseout", hideBaloonTip, false);
			}
		}
	}
}

function handleonmouseover(e)
{
	var evtObj = (window.event) ? window.event : e;
	displayBaloonTip (this, evtObj);
}
function relToElement (linkObj)
{
	var rel = linkObj.getAttribute ('rel');
	return (rel!=null && rel!='' && document.getElementById(rel)!=null);
}

function calcOffset (obj, topLeft)
{
	var offset = new Number(0);
	while (obj!=null)
	{
	    if (topLeft=='left') offset += obj.offsetLeft;
	    if (topLeft=='top') offset += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return offset;
}

function displayUp (obj, e)
{
    if (divTip != null)
	{
    	if(typeof divTip == "object")
	    {
            if (winWidth-(objRight-winLeft)-2*offset >= divWidth)    {divTip.style.left = objLeft + 'px';}
            else if ((objLeft-winLeft)-2*offset >= divWidth)         {divTip.style.left = (objRight-divWidth+shadowOffset) + 'px';}
            else if (winWidth-2*offset >= divWidth)                  {divTip.style.left = (winLeft+(winWidth-(divWidth-shadowOffset))/2) + 'px';}
            else
            {
                divTip.style.width = (winWidth-4*offset) + 'px';
                calcDimensions (obj, e);
                if ((objTop-winTop)-2*offset < divHeight)
                {
                    divTip.style.height = ((objTop-winTop)-4*offset) + 'px';
	                calcDimensions (obj, e);
                }
                divTip.style.left = (winLeft+(winWidth-(divWidth-shadowOffset))/2) + 'px';
            }
            divTip.style.top = (objTop-divHeight-offset) + 'px';
            position = 'up';
            display ();
        }
    } 
}

function displayDown (obj, e)
{
    if (divTip != null)
	{
        if(typeof divTip == "object")
	    {
            if (winWidth-(objRight-winLeft)-2*offset >= divWidth)    {divTip.style.left = objLeft + 'px';}
            else if ((objLeft-winLeft)-2*offset >= divWidth)         {divTip.style.left = (objRight-divWidth+shadowOffset) + 'px';}
            else if (winWidth-2*offset >= divWidth)                  {divTip.style.left = (winLeft+(winWidth-(divWidth-shadowOffset))/2) + 'px';}
            else
            {
                divTip.style.width = (winWidth-4*offset) + 'px';
                calcDimensions (obj, e);
                if (winHeight-(objBottom-winTop)-2*offset < divHeight)
                {
                    divTip.style.height = (winHeight-(objBottom-winTop)-2*offset) + 'px';
	                calcDimensions (obj, e);
                }
                divTip.style.left = (winLeft+(winWidth-(divWidth-shadowOffset))/2) + 'px';
            }
            divTip.style.top = (objBottom+offset+shadowOffset) + 'px';
            position = 'down';
            display ();
        }
    }
}

function displayLeft (obj, e)
{
    if (divTip != null)
	{
        if(typeof divTip == "object")
	    {
            if (winHeight-(objBottom-winTop)-2*offset >= divHeight)  {divTip.style.top = objTop + 'px';}
            else if ((objTop-winTop)-2*offset >= divHeight)          {divTip.style.top = (objBottom-divHeight+shadowOffset) + 'px';}
            else if (winHeight-2*offset >= divHeight)                {divTip.style.top = (winTop+(winHeight-(divHeight-shadowOffset))/2) + 'px';}
            else
            {
                divTip.style.height = (winHeight-4*offset) + 'px';
                calcDimensions (obj, e);
                if ((objLeft-winLeft)-2*offset < divWidth)
                {
                    divTip.style.width = ((objLeft-winLeft)-2*offset) + 'px';
                    calcDimensions (obj, e);
                }
                divTip.style.top = (winTop+(winHeight-(divHeight-shadowOffset))/2) + 'px';
            }
            divTip.style.left = (objLeft-divWidth-offset) + 'px';
            position = 'left';
            display ();
        }
    }
}

function displayRight (obj, e)
{
    if (divTip != null)
	{
        if(typeof divTip == "object")
    	{
            if (winHeight-(objBottom-winTop)-2*offset >= divHeight)  {divTip.style.top = objTop + 'px';}
            else if ((objTop-winTop)-2*offset >= divHeight)          {divTip.style.top = (objBottom-divHeight+shadowOffset) + 'px';}
            else if (winHeight-2*offset >= divHeight)                {divTip.style.top = (winTop+(winHeight-(divHeight-shadowOffset))/2) + 'px';}
            else
            {
                divTip.style.height = (winHeight-4*offset) + 'px';
                calcDimensions (obj, e);
                if (winWidth-(objRight-winLeft)-2*offset < divWidth)
                {
                    divTip.style.width = (winWidth-(objRight-winLeft)-2*offset) + 'px';
                    calcDimensions (obj, e);
                }
                divTip.style.top = (winTop+(winHeight-(divHeight-shadowOffset))/2) + 'px';
            }
            divTip.style.left = (objRight+offset+shadowOffset) + 'px';
            position = 'right';
            display ();
        }
    }
}
function display ()
{
	if(navigator.userAgent.toLowerCase().indexOf("msie")!=-1)
	{
	    if(document.getElementById('iframetop')!=null)
        {
	    	//Fix for overlapping dropdowns
		    
		    // show layer
            if (divTip != null)
	        {
    	        if(typeof divTip == "object")
	            {
                    var layer = document.getElementById(divTip.id);
                    layer.style.display = 'block';
                }
            }
            
            // show IFRAME
            var iframe = document.getElementById('iframetop');
            iframe.style.display = 'block';
            iframe.style.width = layer.offsetWidth-5;
            iframe.style.height = layer.offsetHeight-5;
            iframe.style.left = layer.offsetLeft;
            iframe.style.top = layer.offsetTop;
        }   
    }
}
function calcDimensions (obj, e)
{
	winWidth = new Number (document.body.clientWidth);
	winHeight = new Number (document.body.clientHeight);
	winLeft = new Number (document.body.scrollLeft);
    winTop = new Number (document.body.scrollTop);
    objLeft = new Number (calcOffset(obj,'left'));
    objRight = new Number (calcOffset(obj,'left')+obj.offsetWidth);
    objTop = new Number (calcOffset(obj,'top'));
    objBottom = new Number (calcOffset(obj,'top')+obj.offsetHeight);
	
	position = '';
	
	if (divTip != null)
	{
        if(typeof divTip == "object")
	    {
    	    divWidth = new Number (divTip.offsetWidth);
    	    divHeight = new Number (divTip.offsetHeight);
        	
        	shadowOffset = (divTip.filters && divTip.filters[0]) ? divTip.filters[0].Strength-1 : 0;
	    }
	}
	
}
function displayBaloonTip (obj, e)
{
	if (window.event)
	{
		e.cancelBubble = true;
	}
	if (divTip != null)
	{
        if(typeof divTip == "object")
	    {
            divTip.style.visibility = 'hidden';
            divTip = null;
		    cancelHideBaloonTip();
    	}
	}

	divTip = document.getElementById(obj.rel);
	if (divTip != null)
	{
    	if(typeof divTip == "object")
	    {
            divTip.style.left = '';
        	divTip.style.top = '';
	        divTip.style.width = '';
        	divTip.style.height = '';
            divTip.onmouseover = cancelHideBaloonTip;
            divTip.onmouseout = hideBaloonTip;
    	    if (typeof obj.tipwidth != 'undefined') { divTip.style.width = obj.tipwidth + 'px'; }
        	else { divTip.style.width = '400px'; }
            
            
        	calcDimensions (obj, e);
            
        	if (typeof obj.pref != 'undefined')
	        {
		        switch (obj.pref)
    		    {
	    		    case 'up':
		    		    displayUp (obj, e);
    			    	break;
        			case 'down':
	        			displayDown (obj, e);
		        		break;
			        case 'left':
        				displayLeft (obj, e);
	        			break;
		        	case 'right':
			        	displayRight (obj, e);
				    break;
        		}
	        }
        	else
	        {
		        if ((objTop-winTop)-2*offset >= divHeight)				{displayUp (obj, e);}
    		    else if (winHeight-(objBottom-winTop)-2*offset >= divHeight)		{displayDown (obj, e);}
    	    	else
	    	    {
    	    	    if ((objLeft-winLeft)-2*offset >= divWidth)						{displayLeft (obj, e);}
        	    	else if (winWidth-(objRight-winLeft)-2*offset >= divWidth)		{displayRight (obj, e);}
        		    else
        	    	{
        				if ((objLeft-winLeft) > winWidth-(objRight-winLeft))
	        			{
		        			divTip.style.width = ((objLeft-winLeft)-4*offset) + 'px';
			        		calcDimensions (obj, e);
    				    	displayLeft (obj, e);
    	    			}
	    	    		else
		    	    	{
    		    			divTip.style.width = ((winWidth-(objRight-winLeft))-4*offset) + 'px';
	    		    		calcDimensions (obj, e);
		    		    	displayRight (obj, e);
			    	    }
            		}
	        	}
    	    }
            
            divTip.style.visibility = 'visible';
            
    	    var tipArrow = document.getElementById('CMN_BT_ArrowHead');
    	    switch (position)
        	{
                case 'up':
                    tipArrow.src = arrowToolTipOnTop;
                    tipArrow.style.left = (objLeft+objRight-arrowWidth)/2 + 'px';
                    tipArrow.style.top = (objTop-arrowHeight) + 'px';
                    break;
                case 'down':
                    tipArrow.src = arrowToolTipAtBottom;
                    tipArrow.style.left = (objLeft+objRight-arrowWidth)/2 + 'px';
                    tipArrow.style.top = (objBottom) + 'px';
                    break;
                case 'left':
                    tipArrow.src = arrowToolTipOnLeft;
                    tipArrow.style.top = (objTop+objBottom-arrowWidth)/2 + 'px';
                    tipArrow.style.left = (objLeft-arrowHeight) + 'px';
                    break;
                case 'right':
                    tipArrow.src = arrowToolTipOnRight;
                    tipArrow.style.top = (objTop+objBottom-arrowWidth)/2 + 'px';
                    tipArrow.style.left = (objRight) + 'px';
                    break;
    	    }
    	    switch (position)
        	{
                case 'up':
                case 'down':
                    tipArrow.style.width = arrowWidth + 'px';
                    tipArrow.style.height = arrowHeight + 'px';
                    break;
                case 'left':
                case 'right':
                    tipArrow.style.width = arrowHeight + 'px';
                    tipArrow.style.height = arrowWidth + 'px';
                    break;
	        }
        	if(navigator.userAgent.indexOf("Firefox")!=-1)
	        {document.body.appendChild(tiparrow);}
    	    tiparrow.style.visibility = 'visible';
    	    tiparrow.style.display = '';
	        
    	    if (typeof obj.highlightfrom != 'undefined')
    	    {
        	    if (minHighlightFrom > parseInt(obj.highlightfrom)) 
	            { 
	                minHighlightFrom = parseInt(obj.highlightfrom); 
	                maxHighlightTo = minHighlightFrom + 40;
                }
                
        	    var backgroundColor = "";
	            if (typeof obj.highlightcolor != 'undefined') { backgroundColor = obj.highlightcolor; }
	            
        	    if (typeof obj.highlightduration != 'undefined')
	            { showPeriod(parseInt(obj.highlightfrom), parseInt(obj.highlightduration), backgroundColor); }
	            else { showPeriod(parseInt(obj.highlightfrom), 1, backgroundColor); }
	        }
    	}
	}
}



function cancelHideBaloonTip()
{
	if (evtTO)
	{
        clearTimeout (evtTO);
	}
}

function hideBaloonTip()
{
	if(navigator.userAgent.toLowerCase().indexOf("msie")!=-1)
	{
	    if(document.getElementById('iframetop')!=null)
    	{
	    	// hide IFRAME
		    var iframe = document.getElementById('iframetop');
    		iframe.style.display = 'none';
	    	// hide layer
		    if (divTip != null)
	        {
        	    if(typeof divTip == "object")
            	{
                    var layer = document.getElementById(divTip.id);
                    if (layer != null) { layer.style.visibility = 'hidden'; }
    		    }
    		}
        }
    }
	var codeStr = '';
	codeStr += 'try';
	codeStr += '{';
	codeStr += 'divTip.style.visibility=\'hidden\';';
	codeStr += 'divTip = null;';
	codeStr += 'tiparrow.style.visibility=\'hidden\'';
	codeStr += '}';
	codeStr += 'catch (e)';
	codeStr += '{';
	codeStr += '}';
	cancelHideBaloonTip();
	evtTO = setTimeout (codeStr, delay);
    
    hidePeriod(1, 365);
}


function showPeriod(start, period, backgroundColor)
{
    for(i = 0; i< period; i++)
    {
        var v = document.getElementById(start+i);
        if (v != null)
        {
            if (backgroundColor == null || backgroundColor == "")
            { v.style.backgroundColor = "#CCCCCC";}
            else { v.style.backgroundColor = backgroundColor; }
        }
    }	
}

function hidePeriod(start, period)
{
    for(i = 0; i< period; i++)
    {
        var v = document.getElementById(start+i);
        if (v != null) { v.style.backgroundColor = ""; }
    }
}
