// {{MadCap}} //////////////////////////////////////////////////////////////////
// Copyright: MadCap Software, Inc - www.madcapsoftware.com ////////////////////
////////////////////////////////////////////////////////////////////////////////
// <version>1.0.0.0</version>
////////////////////////////////////////////////////////////////////////////////

var gPopupObj           = null;
var gPopupBGObj         = null;
var gJustPopped         = false;

var gFadeID             = 0;
var gFadeObj            = null;
var gFadeBG             = null;

var gTextPopupBody      = null;
var gTextPopupBodyBG    = null;

var gImgNode            = null;

function FMCImageSwap( img, swapType )
{
    switch ( swapType )
    {
        case "swap":
            var src = img.src
            
            img.src = FMCGetMCAttribute( img, "MadCap:altsrc" );
            img.setAttribute( "MadCap:altsrc", src );
            
            var state   = FMCGetMCAttribute( img, "MadCap:state" );
            
            img.setAttribute( "MadCap:state", (state == null || state == "close") ? "open" : "close" );
            
            break;
            
        case "open":
            var state   = FMCGetMCAttribute( img, "MadCap:state" );
            
            if ( state != swapType )
            {
                var src = img.src
                
                img.src = FMCGetMCAttribute( img, "MadCap:altsrc" );
                img.setAttribute( "MadCap:altsrc", src );
                
                img.setAttribute( "MadCap:state", "open" );
            }
            
            break;
            
        case "close":
            var state   = FMCGetMCAttribute( img, "MadCap:state" );
            
            if ( state == "open" )
            {
                var src = img.src
                
                img.src = FMCGetMCAttribute( img, "MadCap:altsrc" );
                img.setAttribute( "MadCap:altsrc", src );
                
                img.setAttribute( "MadCap:state", "close" );
            }
            
            break;
    }
}

function FMCExpandAll( swapType )
{
    var nodes   = FMCGetElementsByAttribute( document, "MadCap:targetName", "*" );
    
    for ( var i = 0; i < nodes.length; i++ )
    {
        nodes[i].style.display = (swapType == "open") ? "" : "none";
    }
    
    nodes = FMCGetElementsByClassRoot( document, "MCTogglerIcon" );
    
    for ( var i = 0; i < nodes.length; i++ )
    {
        FMCImageSwap( nodes[i], swapType );
    }
    
    nodes = FMCGetElementsByClassRoot( document, "MCExpandingBody" );
    
    for ( var i = 0; i < nodes.length; i++ )
    {
        nodes[i].style.display = (swapType == "open") ? "" : "none";
    }
    
    nodes = FMCGetElementsByClassRoot( document, "MCExpandingIcon" );
    
    for ( var i = 0; i < nodes.length; i++ )
    {
        FMCImageSwap( nodes[i], swapType );
    }
    
    nodes = FMCGetElementsByClassRoot( document, "MCDropDownBody" );
    
    for ( var i = 0; i < nodes.length; i++ )
    {
        nodes[i].style.display = (swapType == "open") ? "" : "none";
    }
    
    nodes = FMCGetElementsByClassRoot( document, "MCDropDownIcon" );
    
    for ( var i = 0; i < nodes.length; i++ )
    {
        FMCImageSwap( nodes[i], swapType );
    }
}

function FMCDropDown( node )
{
    // Find head node
    
    var headNode    = node;
    
    while ( !FMCContainsClassRoot( headNode.className, "MCDropDown", "GlossaryPageEntry" ) )
    {
        headNode = headNode.parentNode;
    }
    
    // Toggle the icon
    
    var imgNodes    = node.getElementsByTagName( "img" );
    
    for ( var i = 0; i < imgNodes.length; i++ )
    {
        var imgNode = imgNodes[i];
        
        if ( FMCContainsClassRoot( imgNode.className, "MCDropDownIcon" ) )
        {
            FMCImageSwap( imgNode, "swap" );
            
            break;
        }
    }
    
    // Hide/unhide the body
    
    var id              = node.id.substring( "MCDropDownHotSpot_".length, node.id.length );
    var dropDownBody    = document.getElementById( "MCDropDownBody_" + id );
    
    dropDownBody.style.display = (dropDownBody.style.display == "none") ? "" : "none";
}

function FMCExpand( node )
{
    // Find top node
    
    while ( !FMCContainsClassRoot( node.className, "MCExpanding" ) )
    {
        node = node.parentNode;
    }
    
    var nodes       = node.childNodes;
    var imgNodes    = node.getElementsByTagName( "img" );
    
    // Toggle the icon
    
    for ( var i = 0; i < imgNodes.length; i++ )
    {
        var imgNode = imgNodes[i];
        
        if ( FMCContainsClassRoot( imgNode.className, "MCExpandingIcon" ) )
        {
            FMCImageSwap( imgNode, "swap" );
            
            break;
        }
    }
    
    // Hide/unhide the body
    
    var expandingBody;
    
    for ( i = 0; i < nodes.length; i++ )
    {
        var node = nodes[i];
        
        if ( FMCContainsClassRoot( node.className, "MCExpandingBody" ) )
        {
            expandingBody = node;
            break;
        }
    }
    
    expandingBody.style.display = (expandingBody.style.display == "none") ? "" : "none";
}

function FMCPopup( e, node )
{
    // Don't continue if something is already popped up
    
    if ( gPopupObj )
    {
        return;
    }
    
    if ( !e )
    {
        e = window.event;
    }
    
    // Toggle the icon
    
    var imgNodes    = node.getElementsByTagName( "img" );
    
    for ( var i = 0; i < imgNodes.length; i++ )
    {
        var imgNode = imgNodes[i];
        
        if ( FMCContainsClassRoot( imgNode.className, "MCExpandingIcon" ) )
        {
            FMCImageSwap( imgNode, "swap" );
            gImgNode = imgNode;
            
            break;
        }
    }
    
    // Find iframe node
    
    var popupBody;
    
    if ( node.nodeName == "AREA" )
    {
        var iframeName  = FMCGetMCAttribute( node, "MadCap:iframeName" );
        var iframes     = document.getElementsByTagName( "iframe" );
        
        for ( var i = 0; i < iframes.length; i++ )
        {
            var iframe  = iframes[i];
            
            if ( iframe.name == iframeName )
            {
                popupBody = iframe;
                break;
            }
        }
    }
    else
    {
        while ( !FMCContainsClassRoot( node.className, "MCPopup" ) )
        {
            node = node.parentNode;
        }
        
        var nodes   = node.childNodes;
        
        for ( i = 0; i < nodes.length; i++ )
        {
            var node    = nodes[i];
            
            if ( FMCContainsClassRoot( node.className, "MCPopupBody" ) )
            {
                popupBody = node;
                break;
            }
        }
    }
    
    // Hide/unhide the body
    
    if ( popupBody.style.display == "none" )
    {
        popupBody.style.display = "";
        
        FMCSetPopupSize( popupBody );
        
        // "+ 5" is to account for width of popup shadow.
        
        if ( e.clientY + parseInt( popupBody.style.height ) + 5 > FMCGetClientHeight( window ) )
        {
            popupBody.style.top = FMCGetScrollTop( window ) + FMCGetClientHeight( window ) - parseInt( popupBody.style.height ) - 5 + "px";
        }
        else
        {
            popupBody.style.top = e.clientY + FMCGetScrollTop( window ) + "px";
        }
        
        if ( e.clientX + parseInt( popupBody.style.width ) + 5 > FMCGetClientWidth( window ) )
        {
            popupBody.style.left = FMCGetScrollLeft( window ) + FMCGetClientWidth( window ) - parseInt( popupBody.style.width ) - 5 + "px";
        }
        else
        {
            popupBody.style.left = e.clientX + FMCGetScrollLeft( window ) + "px";
        }
        
        // Set up background
        
        var popupBodyBG = document.createElement( "span" );
        
        popupBodyBG.className = "MCPopupBodyBG";
        popupBodyBG.style.top = parseInt( popupBody.style.top ) + 5 + "px";
        popupBodyBG.style.left = parseInt( popupBody.style.left ) + 5 + "px";
        popupBodyBG.style.width = parseInt( popupBody.offsetWidth ) + "px";
        popupBodyBG.style.height = parseInt( popupBody.offsetHeight ) + "px";
        
        popupBody.parentNode.appendChild( popupBodyBG );
        gPopupObj = popupBody;
        gPopupBGObj = popupBodyBG;
        gJustPopped = true;
        
        // Set up fading
        
        gFadeObj = popupBody;
        gFadeBG = popupBodyBG;
        
        if ( gFadeObj.filters )
        {
            gFadeObj.style.filter = "alpha( opacity = 0 )";
            gFadeBG.style.filter = "alpha( opacity = 0 )";
        }
        else if ( gFadeObj.style.MozOpacity != null )
        {
            gFadeObj.style.MozOpacity = "0.0";
            gFadeBG.style.MozOpacity = "0.0";
        }
        
        gFadeID = setInterval( "FMCFade()", 10 );
    }
}

function FMCSetPopupSize( popupNode )
{
    var clientWidth     = FMCGetClientWidth( window );
    var clientHeight    = FMCGetClientHeight( window );
    var stepSize        = 10;
    var hwRatio         = clientHeight / clientWidth;
    var popupFrame      = frames[popupNode.name];
    var maxX            = clientWidth * 0.618034;
    var i               = 0;
    
    // Debug
    //window.status += document.body.clientHeight + ", " + document.body.offsetHeight + ", " + document.body.scrollHeight + ", " + document.body.scrollTop;
    //window.status += " : " + document.documentElement.clientHeight + ", " + document.documentElement.offsetHeight + ", " + document.documentElement.scrollHeight + ", " + document.documentElement.scrollTop;
    
    // Safari
    
    if ( document.clientHeight )
    {
        popupNode.style.width = maxX + "px";
        popupNode.style.height = (maxX * hwRatio) + "px";
        
        return;
    }
    
    //
    
    try
    {
        var popupDocument   = popupFrame.document; // This will throw an exception in IE.
        
        FMCGetScrollHeight( popupFrame.window );   // This will throw an exception in Mozilla.
    }
    catch ( err )
    {
        popupNode.style.width = maxX + "px";
        popupNode.style.height = (maxX * hwRatio) + "px";
        
        return;
    }
    
    while ( true )
    {
        popupNode.style.width = maxX - (i * stepSize) + "px";
        popupNode.style.height = (maxX - (i * stepSize)) * hwRatio + "px";
        
        if ( FMCGetScrollHeight( popupFrame.window ) > FMCGetClientHeight( popupFrame.window ) ||
             FMCGetScrollWidth( popupFrame.window ) > FMCGetClientWidth( popupFrame.window ) )
        {
            popupNode.style.width = maxX - ((i - 1) * stepSize) + "px";
            popupNode.style.height = (maxX - ((i - 1) * stepSize)) * hwRatio + "px";
            
            break;
        }
        
        i++;
    }
}

function GetHelpControlLinks( node )
{
    var linkMap		= new Array();
    var rootFrame	= FMCGetRootFrame();
    
    // Must check for rootFrame because it doesn't exist during topic preview in Flare
    
    if ( rootFrame && rootFrame.gHelpSystem.IsMerged() && FMCGetMCAttribute( node, "MadCap:indexKeywords" ) != null )
    {
        var indexFrame  = rootFrame.frames["navigation"].frames["index"];
        
        if ( !indexFrame.gInit )
        {
            indexFrame.gInit = true;
            indexFrame.Init();
        }
        
        //
        
        var indexKeywords   = FMCGetMCAttribute( node, "MadCap:indexKeywords" ).replace( "\\;", "%%%%%" );
        
        if ( indexKeywords == "" )
        {
            return null;
        }
        
        var keywords        = indexKeywords.split( ";" );
        
        for ( var i = 0; i < keywords.length; i++ )
        {
            keywords[i] = keywords[i].replace( "%%%%%", ";" );
            
            var currKeyword = keywords[i].replace( "\\:", "%%%%%" );
            var keywordPath = currKeyword.split( ":" );
            var level       = keywordPath.length - 1;
            var indexKey    = level + "_" + keywordPath[level].replace( "%%%%%", ":" );
            
            var currLinkMap = indexFrame.gLinkMap.GetItem( indexKey.toLowerCase() );
            
            // currLinkMap may be blank if keywords[i] isn't found in index XML file (user may have deleted keyword after associating it with a K-Link)
            
            if ( currLinkMap )
            {
                for ( var key in currLinkMap.GetKeys() )
                {
                    linkMap[linkMap.length] = key + "|" + currLinkMap.GetItem( key );
                }
            }
        }
    }
    else if ( rootFrame && rootFrame.gHelpSystem.IsMerged() && FMCGetMCAttribute( node, "MadCap:concepts" ) != null )
    {
        var conceptTerms    = FMCGetMCAttribute( node, "MadCap:concepts" ).replace( "\\;", "%%%%%" );
        
        if ( conceptTerms == "" )
        {
            return null;
        }
        
        var concepts        = conceptTerms.split( ";" );
        
        for ( var i = 0; i < concepts.length; i++ )
        {
            concepts[i] = concepts[i].replace( "%%%%%", ";" );
            
            var currLinks   = rootFrame.gHelpSystem.GetConceptLinks( concepts[i].toLowerCase() );
            
            for ( var j = 0; j < currLinks.length; j++ )
            {
                linkMap[linkMap.length] = currLinks[j];
            }
        }
    }
    else if ( FMCGetMCAttribute( node, "MadCap:topics" ) != null )
    {
        var topics  = FMCGetMCAttribute( node, "MadCap:topics" ).split( "||" );
        
        if ( topics == "" )
        {
            return null;
        }
        
        for ( var i = 0; i < topics.length; i++ )
        {
            linkMap[linkMap.length] = topics[i];
        }
    }
    else
    {
        return null;
    }
    
    return linkMap;
}



function FMCTextPopup( e, node )
{
    // Don't continue if something is already popped up
    
    if ( gPopupObj )
    {
        return;
    }
    
    if ( !e )
    {
        e = window.event;
    }
    
    // Find top node
    
    while ( !FMCContainsClassRoot( node.className, "MCTextPopup" ) )
    {
        node = node.parentNode;
    }
    
    // Toggle the icon
    
    var imgNodes    = node.getElementsByTagName( "img" );
    
    for ( var i = 0; i < imgNodes.length; i++ )
    {
        var imgNode = imgNodes[i];
        
        if ( FMCContainsClassRoot( imgNode.className, "MCExpandingIcon" ) )
        {
            FMCImageSwap( imgNode, "swap" );
            gImgNode = imgNode;
            
            break;
        }
    }
    
    // Hide/unhide the body
    
    var nodes   = node.childNodes;
    
    for ( i = 0; i < nodes.length; i++ )
    {
        var node = nodes[i];
        
        if ( FMCContainsClassRoot( node.className, "MCTextPopupBody" ) )
        {
            gTextPopupBody = node;
            break;
        }
    }
    
    if ( gTextPopupBody.style.display == "none" )
    {
        if ( gTextPopupBody.childNodes.length == 0 )
        {
            gTextPopupBody.appendChild( document.createTextNode( "(No data to display)") );
        }
        
        gTextPopupBody.style.display = "";
        
        FMCSetTextPopupSize( gTextPopupBody );
        
        // "+ 5" is to account for width of popup shadow.
        
        if ( FMCGetClientY( window, e ) + gTextPopupBody.offsetHeight + 5 > FMCGetClientHeight( window ) )
        {
            gTextPopupBody.style.top = FMCGetScrollTop( window ) + FMCGetClientHeight( window ) - gTextPopupBody.offsetHeight - 5 + "px";
        }
        else
        {
            gTextPopupBody.style.top = FMCGetPageY( window, e ) + "px";
        }
        
        if ( FMCGetClientX( window, e ) + gTextPopupBody.offsetWidth + 5 > FMCGetClientWidth( window ) )
        {
            gTextPopupBody.style.left = FMCGetScrollLeft( window ) + FMCGetClientWidth( window ) - gTextPopupBody.offsetWidth - 5 + "px";
        }
        else
        {
            gTextPopupBody.style.left = FMCGetPageX( window, e ) + "px";
        }
        
        // Set up background
        
        gTextPopupBodyBG = document.createElement( "span" );
        gTextPopupBodyBG.className = "MCTextPopupBodyBG";
        gTextPopupBodyBG.style.top = parseInt( gTextPopupBody.style.top ) + 5 + "px";
        gTextPopupBodyBG.style.left = parseInt( gTextPopupBody.style.left ) + 5 + "px";
        
        FMCSetTextPopupDimensions();
        
        gTextPopupBody.parentNode.appendChild( gTextPopupBodyBG );
        window.onresize = FMCSetTextPopupDimensions;
        gPopupObj = gTextPopupBody;
        gPopupBGObj = gTextPopupBodyBG;
        gJustPopped = true;
        
        // Set up fading
        
        gFadeObj = gTextPopupBody;
        gFadeBG = gTextPopupBodyBG;
        
        if ( gFadeObj.filters )
        {
            gFadeObj.style.filter = "alpha( opacity = 0 )";
            gFadeBG.style.filter = "alpha( opacity = 0 )";
        }
        else if ( gFadeObj.style.MozOpacity != null )
        {
            gFadeObj.style.MozOpacity = "0.0";
            gFadeBG.style.MozOpacity = "0.0";
        }
        
        gFadeID = setInterval( "FMCFade()", 10 );
    }
}

function FMCSetTextPopupSize( popupNode )
{
    var clientWidth     = FMCGetClientWidth( window );
    var clientHeight    = FMCGetClientHeight( window );
    var stepSize        = 10;
    var hwRatio         = clientHeight / clientWidth;
    var maxX            = clientWidth * 0.618034;
    var i               = 0;
    
    while ( true )
    {
        popupNode.style.width = maxX - (i * stepSize) + "px";
        popupNode.style.height = (maxX - (i * stepSize)) * hwRatio + "px";
        
        // "- 2" is to account for borderLeft + borderRight.
        
        if ( popupNode.scrollHeight > popupNode.offsetHeight - 2 || popupNode.scrollWidth > popupNode.offsetWidth - 2 )
        {
            popupNode.style.overflow = "hidden";    // Since scrollbars are now present, temporarily remove them before enlarging the node or else they'll still be present
            popupNode.style.overflow = "auto";      // Allow scrollbars again.
            
            popupNode.style.width = maxX - ((i - 1) * stepSize) + "px";
            popupNode.style.height = (maxX - ((i - 1) * stepSize)) * hwRatio + "px";
            
            break;
        }
        
        i++;
    }
    
    // Debug
    //window.status = popupNode.offsetWidth + ", " + popupNode.scrollWidth + ", " + popupNode.offsetHeight + ", " + popupNode.scrollHeight;
}

function FMCToggler( node )
{
    // Don't continue if something is already popped up
    
    if ( gPopupObj )
    {
        return;
    }
    
    // Toggle the icon
    
    var imgNodes    = node.getElementsByTagName( "img" );
    
    for ( var i = 0; i < imgNodes.length; i++ )
    {
        var imgNode = imgNodes[i];
        
        if ( FMCContainsClassRoot( imgNode.className, "MCTogglerIcon" ) )
        {
            FMCImageSwap( imgNode, "swap" );
            
            break;
        }
    }
    
    // Toggle all toggler items
    
    var targets = FMCGetMCAttribute( node, "MadCap:targets" ).split( ";" );
    
    for ( var i = 0; i < targets.length; i++ )
    {
        var nodes   = FMCGetElementsByAttribute( document, "MadCap:targetName", targets[i] );
        
        for ( var j = 0; j < nodes.length; j++ )
        {
            nodes[j].style.display = (nodes[j].style.display == "none") ? "" : "none";
            
            FMCUnhide( nodes[j] );
        }
    }
}

function FMCSetTextPopupDimensions()
{
    gTextPopupBodyBG.style.width = gTextPopupBody.offsetWidth + "px";
    gTextPopupBodyBG.style.height = gTextPopupBody.offsetHeight + "px";
}

function FMCFade()
{
    var finished    = false;
    
    if ( gFadeObj.filters )
    {
        var fadeObjOpacity  = gFadeObj.style.filter;
        var fadeBGOpacity   = gFadeBG ? gFadeBG.style.filter : null;
        
        gFadeObj.style.filter = "alpha( opacity = " + (parseInt( fadeObjOpacity.substring( 17, fadeObjOpacity.length - 2 ) ) + 10) + " )";
        gFadeBG ? gFadeBG.style.filter = "alpha( opacity = " + (parseInt( fadeBGOpacity.substring( 17, fadeBGOpacity.length - 2 ) ) + 5) + " )" : false;
        
        if ( gFadeObj.style.filter == "alpha( opacity = 100 )" )
        {
            finished = true;
        }
    }
    else if ( gFadeObj.style.MozOpacity != null )
    {
        gFadeObj.style.MozOpacity = parseFloat( gFadeObj.style.MozOpacity ) + 0.11;
        gFadeBG ? gFadeBG.style.MozOpacity = parseFloat( gFadeBG.style.MozOpacity ) + 0.05 : false;
        
        if ( parseFloat( gFadeObj.style.MozOpacity ) == 0.99 )
        {
            finished = true;
        }
    }
    
    if ( finished )
    {
        clearInterval( gFadeID );
        gFadeID = 0;
        gFadeObj = null;
        gFadeBG = null;
    }
}

