function setOpacity(element, opacity) {

    element.style.opacity = opacity;
    element.style.MozOpacity = opacity;
    element.style.KhtmlOpacity = opacity;
    element.style.filter = "alpha(opacity=" + opacity * 100 + ")";
}


/* Scrolling stuff ********************************************************************************************************/

var scrollPane;
var lhsScrollUp;
var lhsScrollDown;
var scrollDelta = 10;
var deltaDelta = 0;
var scrollInterval;

/**
* Checks to see if we have a scrollable left hand column, and if so sets up the function that checks for scrollability
* and sets up events required. Mad gibberish.
*/

function startScrollChecker()
{
    scrollPane = document.getElementById("lhsScrollPane");
    lhsScrollUp = document.getElementById("lhsscrollup");
    lhsScrollDown = document.getElementById("lhsscrolldown");

    if (scrollPane == null || lhsScrollUp == null || lhsScrollDown == null) return;

    if ((""+lhsScrollUp.style.display).toLowerCase() == "none") return;
    if ((""+lhsScrollDown.style.display).toLowerCase() == "none") return;
    if (lhsScrollUp.offsetWidth == 0) return;
    if (lhsScrollDown.offsetWidth == 0) return;

    lhsScrollUp.onmousedown = startScrollUp;
    lhsScrollDown.onmousedown = startScrollDown;
    lhsScrollUp.onmouseout = stopScrolling;
    lhsScrollUp.onmouseup = stopScrolling;
    lhsScrollDown.onmouseout = stopScrolling;
    lhsScrollDown.onmouseup = stopScrolling;

    if (scrollPane.addEventListener) {
        scrollPane.addEventListener('DOMMouseScroll', scrollByWheel, false);
    } else {
        scrollPane.onmousewheel = scrollByWheel;
    }

    window.setInterval("checkScrolling()",500);
    checkScrolling();
}

function stopScrolling()
{
    if (this.className == "disabled") return;

    if(scrollInterval)
        window.clearInterval(scrollInterval);
    scrollInterval = null;
    lastPost = 0;
    lastInnerHeight = 0;
    this.className = "";
    this.className = "";
}

function startScrollUp(e)
{
    if (this.className == "disabled") return;

    if (scrollInterval) //Should never be
        window.clearInterval(scrollInterval);
    scrollInterval = window.setInterval("doScroll()",10);
    scrollDelta = -10;
    deltaDelta = -2;
    this.className = "active";
}

function startScrollDown(e)
{
    if (this.className == "disabled") return;

    if (scrollInterval) //Should never be
        window.clearInterval(scrollInterval);
    scrollInterval = window.setInterval("doScroll()",10);
    scrollDelta = 10;
    deltaDelta = 2;
    this.className = "active";
}

function doScroll()
{
    scrollPane.scrollTop = restrictRange(scrollPane, scrollPane.scrollTop + scrollDelta);;
    scrollDelta += deltaDelta;
}

function checkScrolling()
{
    var fits = scrollPane.scrollHeight <= scrollPane.offsetHeight;
    var scrolled = scrollPane.scrollTop > 0;
    if (lhsScrollUp.className == "disabled") {
        if (!fits || scrolled) {
            lhsScrollUp.className = "";
            lhsScrollDown.className = "";
        }

    } else {
        if (fits && !scrolled) {
            lhsScrollUp.className = "disabled";
            lhsScrollDown.className = "disabled";
        }
    }
}

function scrollByWheel(e)
{
    var event = e ? e : window.event;
    var delta = 0;

    if (event.detail) {
        // for firefox -- detail = -/+3
        delta = -event.detail * 10;

    } else if (event.wheelDelta) {
        // for IE/Opera -- wheelDelta = +/-120
        delta = event.wheelDelta / 4
    }

    if (delta != 0) {
        scrollPane.scrollTop = restrictRange(scrollPane, scrollPane.scrollTop - delta);
    }
}

function restrictRange(aScrollPane, aScrollTopToCheck)
{
    if (aScrollTopToCheck < 0) {
        return 0;

    } else if (aScrollTopToCheck + aScrollPane.offsetHeight > aScrollPane.scrollHeight) {
        return aScrollPane.scrollHeight - aScrollPane.offsetHeight;

    } else {
        return aScrollTopToCheck;
    }
}

function scrollIntoView(aDiv)
{
    aDiv.offsetParent.scrollTop = restrictRange(aDiv.offsetParent, aDiv.offsetTop - 50);
}

/* Tooltip stuff ********************************************************************************************************/

function getTotalLeft(element) {

    var tmp = element;
    var left = 0;

    var safeguard = 200;

    while (tmp != null && tmp.tagName.toLowerCase() != "body" && safeguard > 0) {

        left += tmp.offsetLeft;
        tmp = tmp.offsetParent;
        safeguard--;
    }

    return left;
}

function getTotalTop(element) {

    var tmp = element;
    var top = 0;

    var safeguard = 200;

    while (tmp != null && tmp.tagName.toLowerCase() != "body" && safeguard > 0) {

        //debug(tmp.tagName + " @ " + tmp.offsetTop + " scrollTop = " + tmp.scrollTop + "; top: " + top);

        if (tmp.scrollTop)
            top -= tmp.scrollTop;
        
        top += tmp.offsetTop;
        tmp = tmp.offsetParent;
        safeguard--;
    }

    return top;
}

function tooltipMouseoverWork(e,msg) {

    //Locate / create tooltip div

    var ttdiv = document.getElementById("toolTip");
    if (ttdiv == null) {

        //Tooltip hasn't been created, go crazy.
        ttdiv = document.createElement("div");
        ttdiv.id = "toolTip";
        ttdiv.style.display = "none";
        document.body.appendChild(ttdiv);
    }

    //Clean up any children the tt might have
    while (ttdiv.childNodes.length > 0)
        ttdiv.removeChild(ttdiv.firstChild);

    //Add the new text
    ttdiv.appendChild(document.createTextNode(msg));

    var trigger = getEventSource(e);

    if (trigger.tagName == 'IMG') {
        trigger = trigger.parentNode;
    }

    var left = getTotalLeft(trigger.offsetParent);
    var top = getTotalTop(trigger.offsetParent);

    //debug(trigger.tagName + " @ " + trigger.offsetLeft + ", " + trigger.offsetTop + " yields offset of " + left + ", " + top);

    //Doing some stupid stuff here to attempt to stop it blinking around in the last known position.....
    ttdiv.style.left = "-999px";
    ttdiv.style.top = "-999px";
    ttdiv.style.display = "block"; //Can't measure it unless it's being layed out somewhere

    //Work out where to put the popup.



    var newLeft = left + trigger.offsetWidth + 3;
    var newTop = (top - Math.floor(ttdiv.offsetHeight/2) + Math.floor(trigger.offsetHeight / 2));

    if (newLeft + ttdiv.offsetWidth > document.documentElement.offsetWidth)
        newLeft = left - ttdiv.offsetWidth - 3;

    if (newTop < 0) newTop = 0;

    if (newTop + ttdiv.offsetHeight > document.documentElement.offsetHeight)
        newTop = document.documentElement.offsetHeight - ttdiv.offsetHeight;

    ttdiv.style.top = newTop + "px";
    ttdiv.style.left = newLeft + "px";
}

function createTooltipMouseover(msg) {

    return function(e) {

        tooltipMouseoverWork(e,msg);
    };
}

function tooltipMouseout(e) {

    var ttdiv = document.getElementById("toolTip");
    if (ttdiv) {
        ttdiv.style.display = "none";
    }
}

function attachTooltips() {

    var anchors = document.getElementsByTagName("a");

    for (var i = 0; i < anchors.length; i++) {

        var anchor = anchors[i];
        var title = anchor.getAttribute("title");

        if (title) {

            anchor.removeAttribute("title");
            anchor.onmouseover = createTooltipMouseover(title);
            anchor.onmouseout = tooltipMouseout;
        }
    }
}

/* heritage inspector ********************************************************************************************************/

var heritageInspector = null;
var inspectorP = null;

function setupHeritageInspector() {

    heritageInspector = document.getElementById("heritageInspector");

    if(heritageInspector == null) return;
    inspectorP = heritageInspector.getElementsByTagName("p")[0];

    heritageSetupChildren(document.documentElement.childNodes);
}

function heritageSetupChildren(elements) {

    if(elements == null) return;

    for (var i = 0; i < elements.length; i++) {

        if (elements[i] == heritageInspector) continue;

        if (elements[i].onmouseover == null)
            elements[i].onmouseover = inspectorMouseover;

        heritageSetupChildren(elements[i].childNodes);
    }
}

function identify(el) {

    return "<" + el.tagName + " id=\"" + el.id + "\" class=\"" + el.className + "\">";
}

function inspectorMouseover(e) {
    var src = getEventSource(e);

    var str = identify(src);
    var c = src;
    var d = 0;
    while (c != document.documentElement) {
        d++;
        c = c.parentNode;
    }

    for (var i = 0; i <= d; i++)
        str = " " + str;

    c = src;
    while (c != document.documentElement) {
        str = identify(c.parentNode) + "\n" + str;
        for (var i = 0; i < d; i++)
            str = " " + str;
        c = c.parentNode;
        d--;
    }

    inspectorP.removeChild(inspectorP.firstChild);
    inspectorP.appendChild(document.createTextNode(str));

    e.stopPropagation();
}

function traceParentage() {

    var traceme = document.getElementById("traceme");

    while (traceme != null && traceme != document.documentElement) {

        debug("<" + traceme.tagName + " class=\"" + traceme.className + "\" id=\"" + traceme.id + "\" width=\"" +
              traceme.offsetWidth + "px\" height=\"" + traceme.offsetHeight + "px\">");
        traceme = traceme.offsetParent;
    }
}
//registerOnDOMload(traceParentage);

registerOnDOMload(startScrollChecker);
//registerOnDOMload(attachTooltips);
//registerOnDOMload(setupHeritageInspector);

if (!(" ").replace)
    debug("Browser is too old.");
