var isNav4, isNav6, isIE4;



/*

 * Browser version snooper; determines your browser

 * (Navigator 4, Navigator 6, or Internet Explorer 4/5)

 */

function setBrowser()

{

    if (navigator.appVersion.charAt(0) == "4")

    {

        if (navigator.appName.indexOf("Explorer") >= 0)

        {

            isIE4 = true;

        }

        else

        {

            isNav4 = true;

        }

    }

    else if (navigator.appVersion.charAt(0) > "4")

    {

        isNav6 = true;

    }

}



/*

 *

 * Given a selector string, return a style object

 * by searching through stylesheets. Return null if

 * none found

 *

 */

function getStyleBySelector( selector )

{

    if (!isNav6)

    {

        return null;

    }

    var sheetList = document.styleSheets;

    var ruleList;

    var i, j;



    /* look through stylesheets in reverse order that

       they appear in the document */

    for (i=sheetList.length-1; i >= 0; i--)

    {

        ruleList = sheetList[i].cssRules;

        for (j=0; j<ruleList.length; j++)

        {

            if (ruleList[j].type == CSSRule.STYLE_RULE &&

                ruleList[j].selectorText == selector)

            {

                return ruleList[j].style;

            }   

        }

    }

    return null;

}



/*

 *

 * Given an id and a property (as strings), return

 * the given property of that id.  Navigator 6 will

 * first look for the property in a tag; if not found,

 * it will look through the stylesheet.

 *

 * Note: do not precede the id with a # -- it will be

 * appended when searching the stylesheets

 *

 */

function getIdProperty( id, property )

{

    if (isNav6)

    {

        var styleObject = document.getElementById( id );

        if (styleObject != null)

        {

            styleObject = styleObject.style;

            if (styleObject[property])

            {

                return styleObject[ property ];

            }

        }

        styleObject = getStyleBySelector( "#" + id );

        return (styleObject != null) ?

            styleObject[property] :

            null;

    }

    else if (isNav4)

    {

        return document[id][property];

    }

    else

    {

        return document.all[id].style[property];

    }

}



/*

 *

 * Given an id and a property (as strings), set

 * the given property of that id to the value provided.

 *

 * The property is set directly on the tag, not in the

 * stylesheet.

 *

 */

function setIdProperty( id, property, value )

{

    if (isNav6)

    {

        var styleObject = document.getElementById( id );

        if (styleObject != null)

        {

            styleObject = styleObject.style;

            styleObject[ property ] = value;

        }

    }

    else if (isNav4)

    {

        document[id][property] = value;

    }

    else // if (isIE4)

    {

         document.all[id].style[property] = value;

    }

}



/*

 *

 * Move a given id.  If additive is true,

 * then move it by xValue dots horizontally and

 * yValue units vertically.  If additive is

 * false, then move it to (xValue, yValue)

 *

 * Note: do not precede the id with a # -- it will be

 * appended when searching the stylesheets

 *

 * Note also: length units are preserved in Navigator 6

 * and Internet Explorer. That is, if left is 2cm and

 * top is 3cm, and you move to (4, 5), the left will

 * become 4cm and the top 5cm.

 *

 */

function generic_move( id, xValue, yValue, additive )

{

    var left = getIdProperty(id, "left");

    var top = getIdProperty(id, "top");

    var leftMatch, topMatch;



    if (isNav4)

    {

        leftMatch = new Array( 0, left, "");

        topMatch = new Array( 0, top, "");

    }

    else if (isNav6 || isIE4 )

    {

        var splitexp = /([-0-9.]+)(\w+)/;

        leftMatch = splitexp.exec( left );

        topMatch = splitexp.exec( top );

        if (leftMatch == null || topMatch == null)

        {

            leftMatch = new Array(0, 0, "px");

            topMatch = new Array(0, 0, "px");

        }

    }

    left = ((additive) ? parseFloat( leftMatch[1] ) : 0) + xValue;

    top = ((additive) ? parseFloat( topMatch[1] ) : 0) + yValue;

    setIdProperty( id, "left", left + leftMatch[2] );

    setIdProperty( id, "top", top + topMatch[2] );

}



/*

 *

 * Move a given id to position (xValue, yValue)

 *

 */

function moveTo( id, x, y )

{

    generic_move( id, x, y, false );

}



/*

 *

 * Move a given id to (currentX + xValue, currentY + yValue)

 *

 */

function moveBy( id, x, y)

{

    generic_move( id, x, y, true );

}



/*

 *

 * Function used when converting rgb format colors

 * from Navigator 6 to a hex format

 *

 */ 

function hex( n )

{

    var hexdigits = "0123456789abcdef";

    return ( hexdigits.charAt(n >> 4) + hexdigits.charAt(n & 0x0f) );

}



/*

 *

 * Retrieve background color for a given id.

 * The value returned will be in hex format (#rrggbb)

 *

 */ 

function getBackgroundColor( id )

{

    var color;



    if (isNav4)

    {

        color = document[id].bgColor;

    }

    else if (isNav6)

    {

        var parseExp = /rgb.(\d+),(\d+),(\d+)./;

        var rgbvals;

        color = getIdProperty( id, "backgroundColor" );

        if (color)

        {

            rgbvals = parseExp.exec( color );

            if (rgbvals)

            {

                color = "#" + hex( rgbvals[1] ) + hex( rgbvals[2] ) +

                    hex( rgbvals[3] );

            }

        }

        return color;

    }

    else if (isIE4)

    {

        return document.all[id].backgroundColor;

    }

    return "";

}



/*

 *

 * Return a division's document

 * 

 */

function getDocument( divName )

{

    var doc;



    if (isNav4)

    {

        doc = window.document[divName].document;

    }

    else if (isNav6)

    {

        doc = document;

    }

    else if (isIE4)

    {

        doc = document;

    }

    return doc;

}

