// {{MadCap}} //////////////////////////////////////////////////////////////////
// Copyright: MadCap Software, Inc - www.madcapsoftware.com ////////////////////
////////////////////////////////////////////////////////////////////////////////
// <version>1.0.0.0</version>
////////////////////////////////////////////////////////////////////////////////

//
//    Helper functions
//

var gImages	= new Array();

function FMCGetRootFolder( currLocation )
{
    var rootFolder  = null;
    var href        = currLocation.href;
    var hash        = currLocation.hash;
    var url         = href.substring( 0, href.lastIndexOf( hash ) );
    
    rootFolder = url.substring( 0, url.lastIndexOf( "/" ) + 1 );
    rootFolder = rootFolder.replace( /;/g, "%3B" );   // For Safari
    
    return rootFolder;
}

function FMCGetRootFrame()
{
	var currWindow	= window;
	
	while ( currWindow )
	{
		if ( currWindow.gRootFolder )
		{
			break;
		}
		else if ( currWindow.parent == currWindow )
		{
			return null;
		}
		
		currWindow = currWindow.parent;
	}
	
	return currWindow;
}

function FMCPreloadImage( imgPath )
{
	var index	= gImages.length;
	
    gImages[index] = new Image();
    gImages[index].src = imgPath;
}

function FMCTrim( str )
{
    return FMCLTrim( FMCRTrim( str ) );
}

function FMCLTrim( str )
{
    for ( var i = 0; i < str.length && str.charAt( i ) == " "; i++ );
    
    return str.substring( i, str.length );
}

function FMCRTrim( str )
{
    for ( var i = str.length - 1; i >= 0 && str.charAt( i ) == " "; i-- );
    
    return str.substring( 0, i + 1 );
}

function FMCContainsClassRoot( className )
{
    var ret = null;
    
    for ( var i = 1; i < FMCContainsClassRoot.arguments.length; i++ )
    {
        var classRoot = arguments[i];
        
        if ( className && (className == classRoot || className.indexOf( classRoot + "_" ) == 0) )
        {
            ret = classRoot;
            
            break;
        }
    }
    
    return ret;
}

function FMCGetChildNodeByTagName( node, tagName, index )
{
    var foundNode   = null;
    var numFound    = -1;
    
    for ( var currNode = node.firstChild; currNode != null; currNode = currNode.nextSibling )
    {
        if ( currNode.nodeName == tagName )
        {
            numFound++;
            
            if ( numFound == index )
            {
                foundNode = currNode;
                
                break;
            }
        }
    }
    
    return foundNode;
}

function FMCGetChildNodesByTagName( node, tagName )
{
    var nodes   = new Array();
    
    for ( var i = 0; i < node.childNodes.length; i++ )
    {
        if ( node.childNodes[i].nodeName == tagName )
        {
            nodes[nodes.length] = node.childNodes[i];
        }
    }
    
    return nodes;
}

function FMCStringToBool( stringValue )
{
	var boolValue		= false;
	var stringValLower	= stringValue.toLowerCase();

	boolValue = stringValLower == "true" || stringValLower == "1" || stringValLower == "yes";

	return boolValue;
}

function FMCGetAttribute( node, attribute )
{
    var value   = null;
    
    if ( node.getAttribute( attribute ) )
    {
        value = node.getAttribute( attribute );
    }
    else if ( node.getAttribute( attribute.toLowerCase() ) )
    {
        value = node.getAttribute( attribute.toLowerCase() );
    }
    
    return value;
}

function FMCGetMCAttribute( node, attribute )
{
	var value	= null;
	
    if ( node.getAttribute( attribute ) != null )
    {
        value = node.getAttribute( attribute );
    }
    else if ( node.getAttribute( attribute.substring( "MadCap:".length, attribute.length ) ) )
    {
        value = node.getAttribute( attribute.substring( "MadCap:".length, attribute.length ) );
    }
    
    return value;
}

function FMCRemoveMCAttribute( node, attribute )
{
	var value	= null;
	
    if ( node.getAttribute( attribute ) != null )
    {
        value = node.removeAttribute( attribute );
    }
    else if ( node.getAttribute( attribute.substring( "MadCap:".length, attribute.length ) ) )
    {
        value = node.removeAttribute( attribute.substring( "MadCap:".length, attribute.length ) );
    }
    
    return value;
}

function FMCGetClientWidth( winNode )
{
    var clientWidth = null;
    
    if ( winNode.innerWidth )
    {
        clientWidth = winNode.innerWidth;
        
        if ( FMCGetScrollHeight( winNode ) > winNode.innerHeight )
        {
            clientWidth -= 19;
        }
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        clientWidth = winNode.document.body.clientWidth;
    }
    else if ( winNode.document.documentElement )
    {
        clientWidth = winNode.document.documentElement.clientWidth;
    }
    
    return clientWidth;
}

function FMCGetClientHeight( winNode )
{
    var clientHeight    = null;
    
    if ( winNode.innerHeight )
    {
        clientHeight = winNode.innerHeight;
        
        if ( FMCGetScrollWidth( winNode ) > winNode.innerWidth )
        {
            clientHeight -= 19;
        }
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        clientHeight = winNode.document.body.clientHeight;
    }
    else if ( winNode.document.documentElement )
    {
        clientHeight = winNode.document.documentElement.clientHeight;
    }
    
    return clientHeight;
}

function FMCGetScrollHeight( winNode )
{
    var scrollHeight    = null;
    
    if ( winNode.document.scrollHeight )
    {
        scrollHeight = winNode.document.scrollHeight;
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        scrollHeight = winNode.document.body.scrollHeight;
    }
    else if ( winNode.document.documentElement )
    {
        scrollHeight = winNode.document.documentElement.scrollHeight;
    }
    
    return scrollHeight;
}

function FMCGetScrollWidth( winNode )
{
    var scrollWidth = null;
    
    if ( winNode.document.scrollWidth )
    {
        scrollWidth = winNode.document.scrollWidth;
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        scrollWidth = winNode.document.body.scrollWidth;
    }
    else if ( winNode.document.documentElement )
    {
        scrollWidth = winNode.document.documentElement.scrollWidth;
    }
    
    return scrollWidth;
}

function FMCGetScrollTop( winNode )
{
    var scrollTop   = null;
    
    if ( winNode.document.clientHeight )
    {
        scrollTop = winNode.document.body.scrollTop;
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        scrollTop = winNode.document.body.scrollTop;
    }
    else if ( winNode.document.documentElement )
    {
        scrollTop = winNode.document.documentElement.scrollTop;
    }
    
    return scrollTop;
}

function FMCSetScrollTop( winNode, value )
{
    if ( winNode.document.clientHeight )
    {
        winNode.document.body.scrollTop = value;
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        winNode.document.body.scrollTop = value;
    }
    else if ( winNode.document.documentElement )
    {
        winNode.document.documentElement.scrollTop = value;
    }
}

function FMCGetScrollLeft( winNode )
{
    var scrollLeft  = null;
    
    if ( winNode.document.clientHeight )
    {
        scrollLeft = winNode.document.body.scrollLeft;
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        scrollLeft = winNode.document.body.scrollLeft;
    }
    else if ( winNode.document.documentElement )
    {
        scrollLeft = winNode.document.documentElement.scrollLeft;
    }
    
    return scrollLeft;
}

function FMCSetScrollLeft( winNode, value )
{
    if ( winNode.document.clientHeight )
    {
        winNode.document.body.scrollLeft = value;
    }
    else if ( navigator.appVersion.indexOf( "MSIE 5.5" ) != -1 || (winNode.document.compatMode && winNode.document.compatMode == "BackCompat") )
    {
        winNode.document.body.scrollLeft = value;
    }
    else if ( winNode.document.documentElement )
    {
        winNode.document.documentElement.scrollLeft = value;
    }
}

function FMCGetClientX( winNode, e )
{
    var clientX;
    
    if ( e.pageX )
    {
        clientX = e.pageX - FMCGetScrollLeft( winNode );
    }
    else if ( e.clientX )
    {
        clientX = e.clientX;
    }
    
    return clientX;
}

function FMCGetClientY( winNode, e )
{
    var clientY;
    
    if ( e.pageY )
    {
        clientY = e.pageY - FMCGetScrollTop( winNode );
    }
    else if ( e.clientY )
    {
        clientY = e.clientY;
    }
    
    return clientY;
}

function FMCGetPageX( winNode, e )
{
    var pageX;
    
    if ( e.pageX )
    {
        pageX = e.pageX;
    }
    else if ( e.clientX )
    {
        pageX = e.clientX + FMCGetScrollLeft( winNode );
    }
    
    return pageX;
}

function FMCGetPageY( winNode, e )
{
    var pageY;
    
    if ( e.pageY )
    {
        pageY = e.pageY;
    }
    else if ( e.clientY )
    {
        pageY = e.clientY + FMCGetScrollTop( winNode );
    }
    
    return pageY;
}

function FMCGetComputedStyle( node, style )
{
    var value   = null;
    
    if ( node.currentStyle )
    {
        value = node.currentStyle[style];
    }
    else if ( document.defaultView && document.defaultView.getComputedStyle )
    {
        value = document.defaultView.getComputedStyle( node, null )[style];
    }
    
    return value;
}

function FMCConvertToPx( doc, str, dimension, defaultValue )
{
    if ( !str || str.charAt( 0 ) == "-" )
    {
        return defaultValue;
    }
    
    if ( str.charAt( str.length - 1 ) == "\%" )
    {
        switch (dimension)
        {
            case "Width":
                return parseInt( str ) * screen.width / 100;
                
                break;
            case "Height":
                return parseInt( str ) * screen.height / 100;
                
                break;
        }
    }
    else
    {
		if ( parseInt( str ).toString() == str )
		{
			str += "px";
		}
    }
    
    try
    {
        var div	= doc.createElement( "div" );
    }
    catch ( err )
    {
        return defaultValue;
    }
    
    doc.body.appendChild( div );
    div.style.width = str;
    
    var value	= parseInt( FMCGetComputedStyle( div, "width" ) );
    
    doc.body.removeChild( div );
    
    return value;
}

function FMCUnhide( node )
{ 
    for ( var currNode = node.parentNode; currNode.nodeName != "BODY"; currNode = currNode.parentNode )
    {
        if ( currNode.style.display == "none" )
        {
            var classRoot   = FMCContainsClassRoot( currNode.className, "MCExpandingBody", "MCDropDownBody" );
            
            if ( classRoot == "MCExpandingBody" )
            {
                FMCExpand( currNode.parentNode.getElementsByTagName("a")[0] );
            }
            else if ( classRoot == "MCDropDownBody" )
            {
                var dropDownBodyID  = currNode.id.substring( "MCDropDownBody".length + 1, currNode.id.length );
                var aNodes          = currNode.parentNode.getElementsByTagName( "a" );
                
                for ( var i = 0; i < aNodes.length; i++ )
                {
                    var aNode   = aNodes[i];
                    
                    if ( aNode.id.substring( "MCDropDownHotSpot".length + 1, aNode.id.length ) == dropDownBodyID )
                    {
                        FMCDropDown( aNode );
                    }
                }
            }
            else if ( FMCGetMCAttribute( currNode, "MadCap:targetName" ) )
            {
                var targetName      = FMCGetMCAttribute( currNode, "MadCap:targetName" );
                var togglerNodes    = FMCGetElementsByClassRoot( document.body, "MCToggler" );
                
                for ( var i = 0; i < togglerNodes.length; i++ )
                {
                    var targets = FMCGetMCAttribute( togglerNodes[i], "MadCap:targets" ).split( ";" );
                    var found   = false;
                    
                    for ( var j = 0; j < targets.length; j++ )
                    {
                        if ( targets[j] == targetName )
                        {
                            found = true;
                            
                            break;
                        }
                    }
                    
                    if ( !found )
                    {
                        continue;
                    }
                    
                    FMCToggler( togglerNodes[i] );
                    
                    break;
                }
            }
            else
            {
                currNode.style.display = "";
            }
        }
    }
}

//
//    End helper functions
//

//
//    Class CMCXmlParser
//

function CMCXmlParser( args )
{
    // Public member functions
    
    var mXmlDoc	= null;
    var mArgs	= args;
    
    this.Load		= function( xmlFile, async, LoadFunc )
    {
        if ( window.ActiveXObject )
        {
            mXmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
            mXmlDoc.async = async;
            
            if ( LoadFunc )
            {
				mXmlDoc.onreadystatechange = function () { if ( mXmlDoc.readyState == 4 ) { LoadFunc( mXmlDoc, mArgs ); } };
            }
            
            try
            {
                if ( !mXmlDoc.load( xmlFile ) )
                {
                    mXmlDoc = null;
                }
            }
            catch ( err )
            {
            }
        }
        else if ( window.XMLHttpRequest )
        {
            xmlFile = xmlFile.replace( /;/g, "%3B" );   // For Safari
            
            var xmlHTTP = null;
            
            xmlHTTP = new XMLHttpRequest();
            
            if ( LoadFunc )
            {
				xmlHTTP.onreadystatechange = function () { if ( xmlHTTP.readyState == 4 ) { LoadFunc( xmlHTTP.responseXML, mArgs ); } };
            }
            
            xmlHTTP.open( "GET", xmlFile, async );
            
            try
            {
                xmlHTTP.send( null );
            }
            catch ( err )
            {
				xmlHTTP.abort();
            }
            
            mXmlDoc = xmlHTTP.responseXML;
        }
        
        return mXmlDoc;
    };
}

//
//    End class CMCXmlParser
//

//
//    Class CMCDictionary
//

function CMCDictionary()
{
    // Public properties
    
    this.mMap	= new Array();
    this.mKeys	= new Array();
}

CMCDictionary.prototype.GetItem		= function( key )
{
    return this.mMap["_" + key];
};

CMCDictionary.prototype.GetKeys		= function()
{
	return this.mKeys;
};

CMCDictionary.prototype.RemoveItem	= function( key )
{
	delete( this.mMap["_" + key] );
	delete( this.mKeys[key] );
}

CMCDictionary.prototype.SetItem		= function( key, value )
{
    this.mMap["_" + key] = value;
    this.mKeys[key] = true;
};

//
//    DOM traversal functions
//

function FMCGetElementsByClassRoot( node, classRoot )
{
    var nodes   = new Array();
    var args    = new Array();
    
    args[0] = nodes;
    args[1] = classRoot;
    
    FMCTraverseDOM( "post", node, FMCGetByClassRoot, args );
                         
    return nodes;
}

function FMCGetByClassRoot( node, args )
{
    var nodes       = args[0];
    var classRoot   = args[1];
    
    if ( node.nodeType == 1 && FMCContainsClassRoot( node.className, classRoot ) )
    {
        nodes[nodes.length] = node;
    }
}

function FMCGetElementsByAttribute( node, attribute, value )
{
    var nodes   = new Array();
    var args    = new Array();
    
    args[0] = nodes;
    args[1] = attribute;
    args[2] = value;
    
    FMCTraverseDOM( "post", node, FMCGetByAttribute, args );
                         
    return nodes;
}

function FMCGetByAttribute( node, args )
{
    var nodes       = args[0];
    var attribute   = args[1];
    var value       = args[2];
    
    try
    {
        if ( node.nodeType == 1 && (FMCGetMCAttribute( node, attribute ) == value || (value == "*" && FMCGetMCAttribute( node, attribute ))) )
        {
            nodes[nodes.length] = node;
        }
    }
    catch( err )
    {
        node.setAttribute( attribute, null );
    }
}

function FMCTraverseDOM( type, root, Func, args )
{
    if ( type == "pre" )
    {
        Func( root, args );
    }
    
    if ( root.childNodes.length != 0 )
    {
        for ( var i = 0; i < root.childNodes.length; i++ )
        {
            FMCTraverseDOM( type, root.childNodes[i], Func, args );
        }
    }
    
    if ( type == "post" )
    {
        Func( root, args );
    }
}

//
//    End DOM traversal functions
//

//
//    Button effects
//

var gButton		= null;
var gTabIndex	= 1;

function MakeButton( td, title, outImagePath, overImagePath, selectedImagePath, width, height, text )
{
	var div	= document.createElement( "div" );
	
	div.tabIndex = gTabIndex++;
	
    title ? div.title = title : false;
    div.setAttribute( "MadCap:outImage", outImagePath );
    div.setAttribute( "MadCap:overImage", overImagePath );
    div.setAttribute( "MadCap:selectedImage", selectedImagePath );
    div.setAttribute( "MadCap:width", width );
    div.setAttribute( "MadCap:height", height );
    
    FMCPreloadImage( outImagePath );
    FMCPreloadImage( overImagePath );
    FMCPreloadImage( selectedImagePath );
    
    div.appendChild( document.createTextNode( text ) );
    td.appendChild( div );
    
    InitButton( div );
}

function InitButton( button )
{
	var width	= parseInt( FMCGetMCAttribute( button, "MadCap:width" ) ) + "px";
	var height	= parseInt( FMCGetMCAttribute( button, "MadCap:height" ) ) + "px";

	button.style.backgroundImage = "url(" + FMCGetMCAttribute( button, "MadCap:outImage" ) + ")";
	button.style.cursor = "default";
	button.style.width = width;
	button.style.height = height;
	button.onmouseover = function() { this.style.backgroundImage = "url(" + FMCGetMCAttribute( this, "MadCap:overImage" ) + ")"; };
	button.onmouseout = function() { this.style.backgroundImage = "url(" + FMCGetMCAttribute( this, "MadCap:outImage" ) + ")"; };
	button.onmousedown = function() { StartPress( this ); return false; };

	button.parentNode.style.width = width;
	button.parentNode.style.height = height;
}

function StartPress( node )
{
    // Debug
    //window.status += "s";
    
    gButton = node;
    
    if ( document.body.setCapture )
    {
        document.body.setCapture();
        
        document.body.onmousemove = Press;
        document.body.onmouseup = EndPress;
    }
    else if ( document.addEventListener )
    {
        document.addEventListener( "mousemove", Press, true );
        document.addEventListener( "mouseup", EndPress, true );
    }
    
    gButton.style.backgroundImage = "url(" + FMCGetMCAttribute( gButton, "MadCap:selectedImage" ) + ")";
    gButton.onmouseover = function() { this.style.backgroundImage = "url(" + FMCGetMCAttribute( this, "MadCap:selectedImage" ); + ")" };
}

function Press( e )
{
    // Debug
    //window.status += "p";
    
    if ( !e )
    {
        e = window.event;
        target = e.srcElement;
    }
    else if ( e.target )
    {
        target = e.target;
    }
    
    if ( target == gButton )
    {
        gButton.style.backgroundImage = "url(" + FMCGetMCAttribute( gButton, "MadCap:selectedImage" ) + ")";
    }
    else
    {
        gButton.style.backgroundImage = "url(" + FMCGetMCAttribute( gButton, "MadCap:outImage" ) + ")";
    }
}

function EndPress( e )
{
    // Debug
    //window.status += "e";
    
    var target  = null;
    
    if ( !e )
    {
        e = window.event;
        target = e.srcElement;
    }
    else if ( e.target )
    {
        target = e.target;
    }
    
    if ( target == gButton )
    {
        // Debug
        //window.status += "c";
        
        gButton.style.backgroundImage = "url(" + FMCGetMCAttribute( gButton, "MadCap:overImage" ) + ")";
    }
    
    gButton.onmouseover = function() { this.style.backgroundImage = "url(" + FMCGetMCAttribute( this, "MadCap:overImage" ) + ")"; };
    
    if ( document.body.releaseCapture )
    {
        document.body.releaseCapture();
        
        document.body.onmousemove = null;
        document.body.onmouseup = null;
    }
    else if ( document.removeEventListener )
    {
        document.removeEventListener( "mousemove", Press, true );
        document.removeEventListener( "mouseup", EndPress, true );
    }
    
    gButton = null;
}

//
//    End button effects
//

