﻿// tooltip functions etc.
// requires Prototype Javascript library v1.6

Event.observe(window, 'load', initTooltip);
var tooltipOpen = false,
		refs,
		gloss,
		dateobj = new Date(),
		slideMsgOpened = dateobj.getTime();

function initTooltip() {
    //glossary and reference links
    var lnx = document.getElementsByTagName('a');
    for (i = 0; i < lnx.length; i++) {
        url = lnx[i].getAttribute('href');
        if (!url) continue;
        if (url.indexOf('#reference_') != -1)
            Event.observe(lnx[i], 'mouseover', refTip);
        else if (url.indexOf('#GlossaryTerm') != -1)
            Event.observe(lnx[i], 'mouseover', glosTip);
    }
    //main image tootip
    var el, media;
    if ((el = $('mainMedia')) && (media = $('mainImage'))) {
        var offsets = $('mainImage').cumulativeOffset();
        media.observe('mouseover', function(e) {
            var now = new Date();
            if (!$('slideMsg')) {
                //var offsets = Event.element(e).cumulativeOffset();
                var lft = offsets.left + media.getWidth() - 130;
                var tp = offsets.top;
                el.insert('<a id="slideMsg" href="#" onclick="Slideshow.processClick();Effect.Fade(this, {from: 0.9, duration: 0.2});return false;" style="display:none;top:' + tp + 'px;left:' + lft + 'px;">Click the image to view a slideshow</a>');
            }
            if (now - slideMsgOpened > 500) {
                slideMsgOpened = now;
                Effect.Appear('slideMsg', { to: 0.8, duration: 0.2, queue: 'end' });
            }
        });
        el.observe('mouseout', function(e) {
            if (me = $('slideMsg')) {
                var x = e.pointerX();
                var y = e.pointerY();
                if (x <= offsets.left || x >= offsets.left + media.getWidth() || y <= offsets.top || y >= offsets.top + media.getHeight()) {
                    Effect.Fade(me, { from: 0.9, duration: 0.2, queue: 'end' });
                }
            }
        });
        media.observe('click', function(e) {
            if (me = $('slideMsg'))
                Effect.Fade(me, { from: 0.9, duration: 0.2, queue: 'end' });
        });

    }
}

// function to respond to an Event-initiated request for a reference tooltip
function refTip(evt) {
    if (tooltipOpen) return;
    var a = Event.element(evt);
    rgx = new RegExp(".*#reference_(\\d+)");
    ref = a.readAttribute('href').replace(rgx, '$1');
    if (refs) {
        var html = refs[ref];
    } else {
        li = $('ref' + ref);
        if (!li) return;
        var html = li.innerHTML;
        rgx = /<a name="reference_\d+" id="reference_\d+\"><\/a>/;
        html = html.replace(rgx, '');
    }
    openTooltip(html, a);
}

// function to respond to an Event-initiated request for a glossary tooltip
function glosTip(evt) {
    if (tooltipOpen) return;
    var a = Event.element(evt);
    var linkText = a.innerHTML;
    var id = a.href.substr(a.href.indexOf('#') + 1);
    var html = '';
    var tempHtml = '';
    var el = $(id);
    // if full-text page, can get definition from glossary section HTML
    if (gloss === undefined) { 
        // if a matching definition is found
        if (el !== null) {
            html = el.innerHTML;
        } else {
            var glist = $$('ul.Glossary li');
            for (var i = 0; i < glist.length; i++) {
                if (tempHtml.length != 0) tempHtml += '<br/>';
                tempHtml += glist[i].innerHTML;
                var termText = glist[i].firstDescendant().innerHTML.toLowerCase();
                if (termText.substr(0, termText.indexOf(':')) == linkText.toLowerCase()) {
                    html += glist[i].innerHTML;
                    break;
                }
            }
            if (html.length == 0)
                html = tempHtml;
        }
    // else must rely on JS array of definitions
    } else {
        // if a matching definition is found
        if (gloss[id] !== undefined) {
            html += gloss[id];
        } else {
            for (var p in gloss) {
                if (gloss[p].substring(8, gloss[p].indexOf(':</strong>')).toLowerCase() == linkText.toLowerCase()) {
                    html += gloss[p];
                    break;
                }
                if (tempHtml.length > 0) tempHtml += '<br/>';
                tempHtml += gloss[p];
            }
            if (html.length == 0)
                html = tempHtml;
        }
    }

    openTooltip(html, a);
}

// opens and positions a tooltip containing the passed html
function openTooltip(html, srcEl) {
    tt = $(document.createElement('div'));
    tt.setAttribute('id', 'tooltip');
    tt.insert(html);
    Element.insert(document.body, { bottom: tt });
    tooltipOpen = true;
    var tooltipDims = tt.getDimensions();
    var tooltipStyle = { top: 0 + 'px', left: 0 + 'px', width: tooltipDims.width + 'px' };
    var viewportDims = document.viewport.getDimensions();
    var docScrollOffsets = document.viewport.getScrollOffsets();
    var linkOffset = srcEl.cumulativeOffset();
    var infoDiv = $("info");
    if (infoDiv !== null)
        var elScrollOffset = infoDiv.scrollTop;
    else
        var elScrollOffset = 0;
    var spaceRight = viewportDims.width + docScrollOffsets.left - linkOffset.left - srcEl.getWidth() - 10;
    if (tooltipDims.width > 450) {
        tooltipDims.width = 450;
        tooltipStyle.width = '450px';
        tt.setStyle(tooltipStyle);
        tooltipDims.height = tt.getHeight();
    }
    if (spaceRight > tooltipDims.width) // if there's enough horizontal space to right of link
        tooltipStyle.left = linkOffset.left + 10 + 'px';
    else
        tooltipStyle.left = linkOffset.left - (tooltipDims.width - spaceRight) - 10 + 'px';
    if ((viewportDims.height + elScrollOffset + docScrollOffsets.top - linkOffset.top - srcEl.getHeight() - 10) > tooltipDims.height) { // if there's enough vertical space beneath link
        tooltipStyle.top = linkOffset.top - elScrollOffset + srcEl.getHeight() + 20 + 'px';
    } else {
        tooltipStyle.top = linkOffset.top - elScrollOffset - tooltipDims.height - 10 + 'px';
    }
    tt.setStyle(tooltipStyle);
    srcEl.observe('mouseout', closeTooltip);
    return tt;
}

// closes a tooltip
function closeTooltip(evt) {
    $('tooltip').remove();
    tooltipOpen = false;
    Event.stopObserving(Event.element(evt), 'mouseout', closeTooltip);
}