//////////////////////////////////////////////////////////////////////////////////////////////////
//  Foxbright ToolTip object.
//   Manages a set of tooltips on a page.
//   One single popup allowed to appear at a time.
//////////////////////////////////////////////////////////////////////////////////////////////////


function FoxToolTip()
{
};


//////////////////////////////////////////////////////////////////////////////////////////////////
// Variables.
//////////////////////////////////////////////////////////////////////////////////////////////////

// popup div.
FoxToolTip.popupDiv = "fb_tooltip_popbox";
// popup element (moused over/clicked to bring up the popup)
//   attribute that contains the identifier for the data to populate the tooltip.
FoxToolTip.id_attribute = "id";
// class to add to the anchor element.
FoxToolTip.elementClass = "fb_tooltip_popper";
FoxToolTip.hoverClass = "fb_tooltip_popper_active";
// time (in millis) that the popup should be delayed.
FoxToolTip.delay = 1000;

//vertical offset of tooltip from anchor link
FoxToolTip.v_offset = 0;
//horizontal offset of tooltip from anchor link
FoxToolTip.h_offset = 0;
// Pixels above cursor box should appear if at bottom of page
FoxToolTip.v_reverse_offset = 0;
// Pixels to right of cursor box should appear if at right of page
FoxToolTip.h_reverse_offset = 0;


//////////////////////////////////////////////////////////////////////////////////////////////////
// Utility variables.

// the time responsible for the delayed pop.
FoxToolTip.timer;
// variable for hanging on to the popup element (anchor or whatnot).
FoxToolTip.element;
// variable for hanging on to the popup event.
FoxToolTip.event;
// Is the popup visible right now?
FoxToolTip.popupVisible = false;
// are we running in IE?
FoxToolTip.ie4 = document.all;
// are we running in Netscape?
FoxToolTip.ns6 = document.getElementById&&!document.all;

var BN = navigator.appName;
// is IE?
var IE=(BN.indexOf('Explorer')!=-1);

// edgechecking variable.
FoxToolTip.edgeCheck = 0;

//////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////
// Gets the position offset for an object.
FoxToolTip.getOffset = function(what, offsettype)
{
    var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
    var parentEl=what.offsetParent;
    while (parentEl!=null)
    {
        totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
        parentEl=parentEl.offsetParent;
    }
    return totaloffset;
}//end getOffset


//////////////////////////////////////////////////////////////////////////////////////////////////
// Shows the tooltip
FoxToolTip.showPopup = function(obj, e, tipwidth)
{
    if (FoxToolTip.ie4||FoxToolTip.ns6)
    {
        dropmenuobj.style.left=dropmenuobj.style.top=-500;
    }
    if (tipwidth!="")
    {
        dropmenuobj.widthobj=dropmenuobj.style;
        dropmenuobj.widthobj.width=tipwidth;
    }
    if (!FoxToolTip.popupVisible)
    {
        obj.visibility="visible";
        FoxToolTip.popupVisible = true;
    }
}//end showPopup


//////////////////////////////////////////////////////////////////////////////////////////////////
// Hides the tooltip
FoxToolTip.hidePopup = function()
{
    document.getElementById(FoxToolTip.popupDiv).style.visibility = "hidden";
    FoxToolTip.popupVisible = false;
}//end hidePopup


//////////////////////////////////////////////////////////////////////////////////////////////////
// IE Compatibility test.
FoxToolTip.iecompattest = function()
{
    return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
}//end iecompattest


//////////////////////////////////////////////////////////////////////////////////////////////////
// Checks if the FoxToolTip is clear of the browser edge.
FoxToolTip.clearbrowseredge = function(obj, whichedge)
{
    var edgeoffset=(whichedge=="rightedge")? FoxToolTip.h_offset*-1 : FoxToolTip.v_offset*-1;
    if (whichedge=="rightedge")
    {
        var windowedge=FoxToolTip.ie4 && !window.opera? FoxToolTip.iecompattest().scrollLeft+FoxToolTip.iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15;
        dropmenuobj.contentmeasure=dropmenuobj.offsetWidth;
        if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
        {
            edgeoffset=dropmenuobj.contentmeasure - FoxToolTip.h_reverse_offset;
            FoxToolTip.edgeCheck += 1;
        }
    }
    else
    {
        var windowedge=FoxToolTip.ie4 && !window.opera? FoxToolTip.iecompattest().scrollTop+FoxToolTip.iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18;
        dropmenuobj.contentmeasure=dropmenuobj.offsetHeight;
        if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure)
        {
            edgeoffset=dropmenuobj.contentmeasure + FoxToolTip.v_reverse_offset;
            FoxToolTip.edgeCheck += 2;
        }
    }
    return edgeoffset;
}//end clearbrowseredge


//////////////////////////////////////////////////////////////////////////////////////////////////
// Creates the tooltip for display from the events list sent in.
FoxToolTip.fixedtooltip = function(obj, e, tipwidth, content)
{
    if (window.event)
    {
        event.cancelBubble=true;
    }
    else if (FoxToolTip.ie4) // added for IE8 issues.
    {
        e.cancelBubble=true;
    }
    else if (e.stopPropagation)
    {
        e.stopPropagation();
    }

    dropmenuobj=document.getElementById? document.getElementById(FoxToolTip.popupDiv) : FoxToolTip.popupDiv;
    dropmenuobj.innerHTML=content;

    if (FoxToolTip.ie4||FoxToolTip.ns6)
    {
        FoxToolTip.showPopup(dropmenuobj.style, e, tipwidth);
        dropmenuobj.x=FoxToolTip.getOffset(obj, "left");
        dropmenuobj.y=FoxToolTip.getOffset(obj, "top");
        FoxToolTip.edgeCheck = 0;
        dropmenuobj.style.left=dropmenuobj.x-FoxToolTip.clearbrowseredge(obj, "rightedge")+"px";
        dropmenuobj.style.top=dropmenuobj.y-FoxToolTip.clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+"px";
    }
}//end fixedtooltip


//////////////////////////////////////////////////////////////////////////////////////////////////
// Builds the html for the tooltip
FoxToolTip.buildPopBox = function(title, content)
{
    var popupContents = '<div id="'+FoxToolTip.popupDiv+'_container">';
    popupContents += '<div id="'+FoxToolTip.popupDiv+'_close"><a href="javascript:" onclick="FoxToolTip.hidePopup();return false;"><img src="/core/img/spacer.gif" alt="Close" /></a></div>';
    popupContents += '<div id="'+FoxToolTip.popupDiv+'_title">'+title+'</div>';
    popupContents += '<div id="'+FoxToolTip.popupDiv+'_content">'+content+'</div>';
    popupContents += '</div>';
    return popupContents;
}//end buildPopBox


//////////////////////////////////////////////////////////////////////////////////////////////////
// Returns the info for the tooltip in an array.  First entry is the title, second is the content.
// (This is a dummy function, the user should override this function with a custom function that
//  retrieves the data based on the id given)
FoxToolTip.getInfo = function(topic_id)
{
    //to be replaced with custom callback by the client.
}//end getInfo


//////////////////////////////////////////////////////////////////////////////////////////////////
// Puts together the popup for to display, calls the user-defined getInfo function.
FoxToolTip.fetchPopupInfo = function(link_element, e, topic_id)
{
    var pop_title = 'Title';
    var pop_content = 'Loading content...'
    var popvalue_arr = FoxToolTip.getInfo(topic_id);
    if (typeof(popvalue_arr) != "unidentified" && popvalue_arr != null)
    {
        pop_title = popvalue_arr[0];
        pop_content = popvalue_arr[1];
    }
    var popup_html = FoxToolTip.buildPopBox(pop_title, pop_content);
    FoxToolTip.fixedtooltip(link_element, e, '', popup_html);
}//end fetchPopupInfo


//////////////////////////////////////////////////////////////////////////////////////////////////
// Initializes the popup.
//  REQUIRED PARAMETERS
//  jquery_selector - indicates which elements on the page should have tooltips.
//
//  OPTIONAL PARAMETERS
//  id_attribute - indicates which attribute of the elment indicates the data to populate the tooltip.
//              default - id
//  delay - the time, in milliseconds, that the tooltip should be delayed.
//              default - 1000, -1 to disable mouseover.
//  element_class - class that should be on all elements with tooltip events attached.
//              default - fb_tooltip_popper
//  hover_class - class that should be on all elements when active (hovered or open).
//              default - fb_tooltip_popper_active
//  v_offset - the vertical offset, in pixels, below the element that the tooltip should appear.
//              default - 0
//  h_offset - the horizontal offset, in pixels, right of the element that the tooltip should appear.
//              default - 0
//  v_reverse_offset - the vertical offset, in pixels, above the element that the tooltip
//          should appear if there is no room below the element.
//              default - 0
//  h_reverse_offset - the horizontal offset, in pixels, left of the element that the tooltip
//          should appear if there is no room below the element.
//              default - 0
FoxToolTip.initPopup = function(jquery_selector, id_attribute, delay, element_class, hover_class, v_offset, h_offset, v_reverse_offset, h_reverse_offset)
{
    if (typeof(id_attribute) != "undefined")
    {
        FoxToolTip.id_attribute = id_attribute;
    }
    if (typeof(delay) != "undefined")
    {
        FoxToolTip.delay = delay;
    }
    if (typeof(v_offset) != "undefined")
    {
        FoxToolTip.v_offset = v_offset;
    }
    if (typeof(h_offset) != "undefined")
    {
        FoxToolTip.h_offset = h_offset;
    }
    if (typeof(v_reverse_offset) != "undefined")
    {
        FoxToolTip.v_reverse_offset = v_reverse_offset;
    }
    if (typeof(h_reverse_offset) != "undefined")
    {
        FoxToolTip.h_reverse_offset = h_reverse_offset;
    }
    if (typeof(element_class) != "undefined")
    {
        FoxToolTip.elementClass = element_class;
    }
    if (typeof(hover_class) != "undefined")
    {
        FoxToolTip.hoverClass = hover_class;
    }

    if (FoxToolTip.ie4||FoxToolTip.ns6)
    {
        var poppaDiv = document.createElement('div');
        poppaDiv.setAttribute('id', FoxToolTip.popupDiv);
        poppaDiv.setAttribute('class', FoxToolTip.popupDiv);
        poppaDiv.setAttribute('style', 'visibility: hidden');
        document.body.appendChild(poppaDiv);
    }

    jQuery(jquery_selector).each(function (i)
    {
        // for attribute?
        if (jQuery(this).attr(FoxToolTip.id_attribute).length != 0)
        {
            jQuery(this).addClass(FoxToolTip.elementClass);

            if (FoxToolTip.delay > -1)
            {
                jQuery(this).mouseover( FoxToolTip_Activate );
                jQuery(this).mouseout( FoxToolTip_Deactivate );
            }
            jQuery(this).click( function(e)
            {
                if (FoxToolTip.delay > -1)
                {
                    FoxToolTip_Deactivate(e);
                }
                FoxToolTip.fetchPopupInfo( this, e, this.getAttribute(FoxToolTip.id_attribute) );
                return false;
            });
        }
    });
}//end initFoxToolTip


//////////////////////////////////////////////////////////////////////////////////////////////////
// EVENT HANDLING FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////
// Activate the tooltip (on delay).
function FoxToolTip_Activate(e)
{
    jQuery(this).addClass(FoxToolTip.hoverClass);
    FoxToolTip_DoWork(this, e);
}//end FoxToolTip_Activate

//////////////////////////////////////////////////////////////////////////////////////////////////
// Do the activation work.
function FoxToolTip_DoWork(element, e)
{
    FoxToolTip.element = element;
    FoxToolTip.event = FoxToolTip_GetEvent(e);
    FoxToolTip.timer = setTimeout( 'FoxToolTip.fetchPopupInfo( FoxToolTip.element, FoxToolTip.event, FoxToolTip.element.getAttribute(FoxToolTip.id_attribute) );', FoxToolTip.delay );
}//end FoxToolTip_DoWork

//////////////////////////////////////////////////////////////////////////////////////////////////
// Deactivate the tooltip timer (ex: if a click has occured).
function FoxToolTip_Deactivate(e)
{
    if (FoxToolTip.popupVisible == false)
    {
        jQuery(this).removeClass(FoxToolTip.hoverClass);
    }
    clearTimeout(FoxToolTip.timer);
    FoxToolTip.element = null;
    FoxToolTip.event = null;
}//end FoxToolTip_Deactivate

//////////////////////////////////////////////////////////////////////////////////////////////////
// Get the event.
function FoxToolTip_GetEvent(e)
{
    if (! e)
    {
        e = event;
    }
    return e;
}//end FoxToolTip_getEvent

//////////////////////////////////////////////////////////////////////////////////////////////////
