/* --- BoxOver ---
/* --- v 2.1 17th June 2006
By Oliver Bryant with help of Matthew Tagg
http://boxover.swazz.org */

if (typeof document.attachEvent != 'undefined') {
    window.attachEvent('onload', init);
    document.attachEvent('onmousemove', moveMouse);
    document.attachEvent('onclick', checkMove);
}
else {
    window.addEventListener('load', init, false);
    document.addEventListener('mousemove', moveMouse, false);
    document.addEventListener('click', checkMove, false);
}

var oDv = document.createElement("div");
var dvHdr = document.createElement("div");
var dvBdy = document.createElement("div");
var windowlock, boxMove, fixposx, fixposy, lockX, lockY, fixx, fixy, ox, oy, boxLeft, boxRight, boxTop, boxBottom, evt, mouseX, mouseY, boxOpen, totalScrollTop, totalScrollLeft;
boxOpen = false;
ox = 10;
oy = 10;
lockX = 0;
lockY = 0;

function init() {
    oDv.appendChild(dvHdr);
    oDv.appendChild(dvBdy);
    oDv.style.position = "absolute";
    oDv.style.visibility = 'hidden';
    document.body.appendChild(oDv);
}

function defHdrStyle() {
    dvHdr.innerHTML = '<img  style="vertical-align:middle"  src="info.gif">&nbsp;&nbsp;' + dvHdr.innerHTML;
    dvHdr.style.fontWeight = 'bold';
    dvHdr.style.width = '180px';
    dvHdr.style.fontFamily = 'verdana';
    dvHdr.style.textTransform = 'capitalize';
    dvHdr.style.border = '1px solid #A5CFE9';
    dvHdr.style.padding = '3';
    dvHdr.style.fontSize = '80%';
    dvHdr.style.color = '#0033BD';
    dvHdr.style.background = '#D5EBF9';
    dvHdr.style.filter = 'alpha(opacity=85)'; // IE
    dvHdr.style.opacity = '0.85'; // FF
}

function defBdyStyle() {
    dvBdy.style.borderBottom = '1px solid #A5CFE9';
    dvBdy.style.borderLeft = '1px solid #A5CFE9';
    dvBdy.style.borderRight = '1px solid #A5CFE9';
    dvBdy.style.width = '180px';
    dvBdy.style.fontFamily = 'verdana';
    dvBdy.style.fontSize = '80%';
    dvBdy.style.padding = '3';
    dvBdy.style.color = '#000000';
    dvBdy.style.background = '#FFFFFF';
    dvBdy.style.filter = 'alpha(opacity=85)'; // IE
    dvBdy.style.opacity = '0.85'; // FF
}

function checkElemBO(txt) {
    if (!txt || typeof (txt) != 'string') return false;
    if ((txt.indexOf('header') > -1) && (txt.indexOf('body') > -1) && (txt.indexOf('[') > -1) && (txt.indexOf('[') > -1))
        return true;
    else
        return false;
}

function scanBO(curNode) {
    if (checkElemBO(curNode.title)) {
        curNode.boHDR = getParam('header', curNode.title);
        curNode.boBDY = getParam('body', curNode.title);
        curNode.boCSSBDY = getParam('cssbody', curNode.title);
        curNode.boCSSHDR = getParam('cssheader', curNode.title);
        curNode.IEbugfix = (getParam('hideselects', curNode.title) == 'on') ? true : false;
        curNode.fixX = parseInt(getParam('fixedrelx', curNode.title));
        curNode.fixY = parseInt(getParam('fixedrely', curNode.title));
        curNode.absX = parseInt(getParam('fixedabsx', curNode.title));
        curNode.absY = parseInt(getParam('fixedabsy', curNode.title));
        curNode.offY = (getParam('offsety', curNode.title) != '') ? parseInt(getParam('offsety', curNode.title)) : 10;
        curNode.offX = (getParam('offsetx', curNode.title) != '') ? parseInt(getParam('offsetx', curNode.title)) : 10;
        curNode.fade = (getParam('fade', curNode.title) == 'on') ? true : false;
        curNode.fadespeed = (getParam('fadespeed', curNode.title) != '') ? getParam('fadespeed', curNode.title) : 0.04;
        curNode.delay = (getParam('delay', curNode.title) != '') ? parseInt(getParam('delay', curNode.title)) : 0;
        if (getParam('requireclick', curNode.title) == 'on') {
            curNode.requireclick = true;
            document.all ? curNode.attachEvent('onclick', showHideBox) : curNode.addEventListener('click', showHideBox, false);
            document.all ? curNode.attachEvent('onmouseover', hideBox) : curNode.addEventListener('mouseover', hideBox, false);
        }
        else {// Note : if requireclick is on the stop clicks are ignored   			
            if (getParam('doubleclickstop', curNode.title) != 'off') {
                document.all ? curNode.attachEvent('ondblclick', pauseBox) : curNode.addEventListener('dblclick', pauseBox, false);
            }
            if (getParam('singleclickstop', curNode.title) == 'on') {
                document.all ? curNode.attachEvent('onclick', pauseBox) : curNode.addEventListener('click', pauseBox, false);
            }
        }
        curNode.windowLock = getParam('windowlock', curNode.title).toLowerCase() == 'off' ? false : true;
        curNode.title = '';
        curNode.hasbox = 1;
    }
    else
        curNode.hasbox = 2;
}


function getParam(param, list) {
    var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]');
    var res = reg.exec(list);
    var returnvar;
    if (res)
        return res[2].replace('[[', '[').replace(']]', ']');
    else
        return '';
}

function Left(elem) {
    var x = 0;
    if (elem.calcLeft)
        return elem.calcLeft;
    var oElem = elem;
    while (elem) {
        if ((elem.currentStyle) && (!isNaN(parseInt(elem.currentStyle.borderLeftWidth))) && (x != 0))
            x += parseInt(elem.currentStyle.borderLeftWidth);
        x += elem.offsetLeft;
        elem = elem.offsetParent;
    }
    oElem.calcLeft = x;
    return x;
}

function Top(elem) {
    var x = 0;
    if (elem.calcTop)
        return elem.calcTop;
    var oElem = elem;
    while (elem) {
        if ((elem.currentStyle) && (!isNaN(parseInt(elem.currentStyle.borderTopWidth))) && (x != 0))
            x += parseInt(elem.currentStyle.borderTopWidth);
        x += elem.offsetTop;
        elem = elem.offsetParent;
    }
    oElem.calcTop = x;
    return x;

}

var ah, ab;
function applyStyles() {
    if (ab)
        oDv.removeChild(dvBdy);
    if (ah)
        oDv.removeChild(dvHdr);
    dvHdr = document.createElement("div");
    dvBdy = document.createElement("div");
    CBE.boCSSBDY ? dvBdy.className = CBE.boCSSBDY : defBdyStyle();
    CBE.boCSSHDR ? dvHdr.className = CBE.boCSSHDR : defHdrStyle();
    dvHdr.innerHTML = CBE.boHDR;
    dvBdy.innerHTML = CBE.boBDY;
    ah = false;
    ab = false;
    if (CBE.boHDR != '') {
        oDv.appendChild(dvHdr);
        ah = true;
    }
    if (CBE.boBDY != '') {
        oDv.appendChild(dvBdy);
        ab = true;
    }
}

var CSE, iterElem, LSE, CBE, LBE, totalScrollLeft, totalScrollTop, width, height;
var ini = false;

// Customised function for inner window dimension
function SHW() {
    if (document.body && (document.body.clientWidth != 0)) {
        width = document.body.clientWidth;
        height = document.body.clientHeight;
    }
    if (document.documentElement && (document.documentElement.clientWidth != 0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) {
        width = document.documentElement.clientWidth;
        height = document.documentElement.clientHeight;
    }
    return [width, height];
}


var ID = null;
function moveMouse(e) {
    //boxMove=true;
    e ? evt = e : evt = event;

    CSE = evt.target ? evt.target : evt.srcElement;

    if (!CSE.hasbox) {
        // Note we need to scan up DOM here, some elements like TR don't get triggered as srcElement
        iElem = CSE;
        while ((iElem.parentNode) && (!iElem.hasbox)) {
            scanBO(iElem);
            iElem = iElem.parentNode;
        }
    }

    if ((CSE != LSE) && (!isChild(CSE, dvHdr)) && (!isChild(CSE, dvBdy))) {
        if (!CSE.boxItem) {
            iterElem = CSE;
            while ((iterElem.hasbox == 2) && (iterElem.parentNode))
                iterElem = iterElem.parentNode;
            CSE.boxItem = iterElem;
        }
        iterElem = CSE.boxItem;
        if (CSE.boxItem && (CSE.boxItem.hasbox == 1)) {
            LBE = CBE;
            CBE = iterElem;
            if (CBE != LBE) {
                applyStyles();
                if (!CBE.requireclick)
                    if (CBE.fade) {
                    if (ID != null)
                        clearTimeout(ID);
                    ID = setTimeout("fadeIn(" + CBE.fadespeed + ")", CBE.delay);
                }
                else {
                    if (ID != null)
                        clearTimeout(ID);
                    COL = 1;
                    ID = setTimeout("oDv.style.visibility='visible';ID=null;", CBE.delay);
                }
                if (CBE.IEbugfix) { hideSelects(); }
                fixposx = !isNaN(CBE.fixX) ? Left(CBE) + CBE.fixX : CBE.absX;
                fixposy = !isNaN(CBE.fixY) ? Top(CBE) + CBE.fixY : CBE.absY;
                lockX = 0;
                lockY = 0;
                boxMove = true;
                ox = CBE.offX ? CBE.offX : 10;
                oy = CBE.offY ? CBE.offY : 10;
            }
        }
        else if (!isChild(CSE, dvHdr) && !isChild(CSE, dvBdy) && (boxMove)) {
            // The conditional here fixes flickering between tables cells.
            if ((!isChild(CBE, CSE)) || (CSE.tagName != 'TABLE')) {
                CBE = null;
                if (ID != null)
                    clearTimeout(ID);
                fadeOut();
                showSelects();
            }
        }
        LSE = CSE;
    }
    else if (((isChild(CSE, dvHdr) || isChild(CSE, dvBdy)) && (boxMove))) {
        totalScrollLeft = 0;
        totalScrollTop = 0;

        iterElem = CSE;
        while (iterElem) {
            if (!isNaN(parseInt(iterElem.scrollTop)))
                totalScrollTop += parseInt(iterElem.scrollTop);
            if (!isNaN(parseInt(iterElem.scrollLeft)))
                totalScrollLeft += parseInt(iterElem.scrollLeft);
            iterElem = iterElem.parentNode;
        }
        if (CBE != null) {
            boxLeft = Left(CBE) - totalScrollLeft;
            boxRight = parseInt(Left(CBE) + CBE.offsetWidth) - totalScrollLeft;
            boxTop = Top(CBE) - totalScrollTop;
            boxBottom = parseInt(Top(CBE) + CBE.offsetHeight) - totalScrollTop;
            doCheck();
        }
    }

    if (boxMove && CBE) {
        // This added to alleviate bug in IE6 w.r.t DOCTYPE
        bodyScrollTop = document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop;
        bodyScrollLet = document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft;
        mouseX = evt.pageX ? evt.pageX - bodyScrollLet : evt.clientX - document.body.clientLeft;
        mouseY = evt.pageY ? evt.pageY - bodyScrollTop : evt.clientY - document.body.clientTop;
        if ((CBE) && (CBE.windowLock)) {
            mouseY < -oy ? lockY = -mouseY - oy : lockY = 0;
            mouseX < -ox ? lockX = -mouseX - ox : lockX = 0;
            mouseY > (SHW()[1] - oDv.offsetHeight - oy) ? lockY = -mouseY + SHW()[1] - oDv.offsetHeight - oy : lockY = lockY;
            mouseX > (SHW()[0] - dvBdy.offsetWidth - ox) ? lockX = -mouseX - ox + SHW()[0] - dvBdy.offsetWidth : lockX = lockX;
        }
        oDv.style.left = ((fixposx) || (fixposx == 0)) ? fixposx : bodyScrollLet + mouseX + ox + lockX + "px";
        oDv.style.top = ((fixposy) || (fixposy == 0)) ? fixposy : bodyScrollTop + mouseY + oy + lockY + "px";

    }
}

function doCheck() {
    if ((mouseX < boxLeft) || (mouseX > boxRight) || (mouseY < boxTop) || (mouseY > boxBottom)) {
        if (!CBE.requireclick)
            fadeOut();
        if (CBE.IEbugfix) { showSelects(); }
        CBE = null;
    }
}

function pauseBox(e) {
    e ? evt = e : evt = event;
    boxMove = false;
    evt.cancelBubble = true;
}

function showHideBox(e) {
    oDv.style.visibility = (oDv.style.visibility != 'visible') ? 'visible' : 'hidden';
}

function hideBox(e) {
    oDv.style.visibility = 'hidden';
}

var COL = 0;
var stopfade = false;
function fadeIn(fs) {
    ID = null;
    COL = 0;
    oDv.style.visibility = 'visible';
    fadeIn2(fs);
}

function fadeIn2(fs) {
    COL = COL + fs;
    COL = (COL > 1) ? 1 : COL;
    oDv.style.filter = 'alpha(opacity=' + parseInt(100 * COL) + ')';
    oDv.style.opacity = COL;
    if (COL < 1)
        setTimeout("fadeIn2(" + fs + ")", 20);
}


function fadeOut() {
    oDv.style.visibility = 'hidden';

}

function isChild(s, d) {
    while (s) {
        if (s == d)
            return true;
        s = s.parentNode;
    }
    return false;
}

var cSrc;
function checkMove(e) {
    e ? evt = e : evt = event;
    cSrc = evt.target ? evt.target : evt.srcElement;
    if ((!boxMove) && (!isChild(cSrc, oDv))) {
        fadeOut();
        if (CBE && CBE.IEbugfix) { showSelects(); }
        boxMove = true;
        CBE = null;
    }
}

function showSelects() {
    var elements = document.getElementsByTagName("select");
    for (i = 0; i < elements.length; i++) {
        elements[i].style.visibility = 'visible';
    }
}

function hideSelects() {
    var elements = document.getElementsByTagName("select");
    for (i = 0; i < elements.length; i++) {
        elements[i].style.visibility = 'hidden';
    }
}


/******************************************************************************
* CHART HEADER HOVER OVER HELP ITEM                                          *
******************************************************************************/
function IsIE() {
    return (document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body
}

function DisplayToolTip(text, element, cssClass) {
    $(document).ready(function() {
        if ($("#toolTipHover").length == 0) {
            $(document.createElement("div")).attr("id", "toolTipHover").addClass('toolTipHoverDefault').appendTo("body");
            $(document.createElement("div")).attr("id", "toolTipContent").html(text).appendTo("#toolTipHover");
        }
        else {
            $("#toolTipContent").html(text);
        }
        if (cssClass != null)
            $('#toolTipHover').addClass(cssClass);
        else
            $('#toolTipHover').removeClass($('#toolTipHover').className).addClass('toolTipHoverDefault');
        if (element != null) {
            var elementPos = $(element).offset();
            if ($("#hoverArrow").length == 0) {
                $(document.createElement("div")).attr("id", "hoverArrow").appendTo("body");
            }
            else {
                $("#hoverArrow").css({ 'display': 'block' });
            }
            if ($.browser.opera) {
                var oElement = element;
                var elementPosTop = 0;
                while (oElement != null) {
                    elementPosTop += oElement.offsetTop;
                    oElement = oElement.offsetParent;
                }
            }
            else
                var elementPosTop = elementPos.top;
            PositionToolTip(elementPos.left, elementPosTop, (elementPos.left + $(element).outerWidth()), (elementPosTop + $(element).outerHeight()));
        }
        else {
            if (window.addEventListener)
                window.addEventListener('mousemove', PositionToolTipDescription, false);
            else if (document.attachEvent)
                document.attachEvent('onmousemove', PositionToolTipDescription);
        }
    })
}

function DisplayToolTipWithGWOCheck(text, element, cssClass) {
    // 11/02/2010 - DJB - SD#44449
    //          Just adding an extra check to see whether to disable displaying this tool tip or not based
    //          on the Google Web Optimizer variable set.  We don't want to hide the column header tool tips
    //          or any other tooltips that may be on the page.
    if ((typeof disableToolTip == 'undefined') || (disableToolTip == false)) {
        // Just execute the function as normal.
        DisplayToolTip(text, element, cssClass);
    }
}

function HideToolTip() {
    $(document).ready(function() {
        $("#hoverArrow").css({ 'display': 'none', "left": '0px', "top": '0px' });
        $("#toolTipHover").css({ 'display': 'none', "left": '0px', "top": '0px' });
        if (window.removeEventListener)
            window.removeEventListener('mousemove', PositionToolTipDescription, false);
        else if (document.detachEvent)
            document.detachEvent('onmousemove', PositionToolTipDescription);
    });
}

function PositionToolTip(leftX, topY, rightX, bottomY) {
    if (rightX == null)
        rightX = leftX;
    if (bottomY == null)
        bottomY = topY;
    var divWidth = $('#toolTipHover').width();
    var divHeight = $('#toolTipHover').height();
    var descriptionTop = topY - 5;
    var descriptionLeft = rightX + 20;
    var arrowTop = topY + Math.floor((bottomY - topY) / 2) - 9;
    var arrowLeft = rightX + 2;
    $('#hoverArrow').removeClass('hoverArrowRight');
    $('#hoverArrow').addClass('hoverArrowLeft');
    if ((descriptionLeft + divWidth) > ($(window).width() + $(window).scrollLeft())) {
        descriptionLeft = leftX - divWidth - 20;
        arrowLeft = leftX - 19;
        $('#hoverArrow').removeClass('hoverArrowLeft');
        $('#hoverArrow').addClass('hoverArrowRight');
    }
    if (window.innerHeight == undefined)
        var windowHeight = $(window).height();
    else
        var windowHeight = window.innerHeight;
    if (descriptionTop + divHeight > (windowHeight + $(window).scrollTop()) && (bottomY - divHeight) > $(window).scrollTop())
        descriptionTop = bottomY - divHeight + 5;
    if (descriptionTop < 0)
        descriptionTop = 0;
    if (arrowTop < 0)
        arrowTop = 0;
    $("#toolTipHover").css({ 'display': 'block', "left": descriptionLeft + 'px', "top": descriptionTop + 'px' });
    $("#hoverArrow").css({ "left": arrowLeft + 'px', "top": arrowTop + 'px' });
}

function PositionToolTipDescription(e) {
    var curX = (ns) ? e.pageX : event.clientX + IsIE().scrollLeft;
    var curY = (ns) ? e.pageY : event.clientY + IsIE().scrollTop;
    PositionToolTip(curX, curY + 15);
}