/* Browser version snooper; determines your browser (Navigator 6, or Internet Explorer 4/5) */
var isNav4, isNav6, isIE4;

function setBrowser() {
    if (navigator.appVersion.charAt(0) == "4") {
        if (navigator.appName.indexOf("Explorer") >= 0) {
            isIE4 = 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 {
        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 (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 (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() {
    return document;
}
