//  DHTMLapi.js custom API for cross-platform
//  object positioning for Danny Goodman (http://www.dannyg.com).
//  Release 2.0. Supports IE and W3C DOMs.

//  Global variables
var isCSS, isW3C, isIE4, isIE6CSS;

//  initialize upon load to let all broswers establish content objects
function initDHTMLAPI()
    {
    if (document.images)
        {
        isCSS = (document.body && document.body.style) ? true : false;
        isW3C = (isCSS && document.getElementById) ? true : false;
        isIE4 = (isCSS && document.all) ? true : false;
		isNN4 = (document.layers) ? true : false;
        isIE6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >= 0) ? true : false;
        }
    }
    
//  set event handler to initialize API
window.onload = initDHTMLAPI;

//  convert object name string or object reference
//  into a valid element object reference
function getRawObject(obj)
    {
    var theObj;
    
    if (typeof obj == "string")
        {
        if (isW3C)
            {
            theObj = document.getElementById(obj);
            }
        else if (isIE4)
            {
            theObj = document.all(obj);
            }
        }
    else
        {
        //  pass through the object reference
        theObj = obj;
        }
    return theObj;
    }
    
//  convert object name string or object reference
//  into a valid style reference
function getObject(obj)
    {
    var theObj = getRawObject(obj);
    if (theObj && isCSS)
        {
        theObj = theObj.style;
        }
    return theObj;
    }
    
//  position an object at a specific pixel coordinate
function shiftTo(obj, x, y)
    {
    var theObj = getObject(obj);
    if (theObj)
        {
        if (isCSS)
            {
            //  equalize incorrect numeric value type
            var units = (typeof theObj.left == "string") ? "px" : 0;
            theObj.left = x + units;
            theObj.top = y + units;
            }
        }
    }
    
//  move an object by x and/or y pixels
function shiftBy(obj, deltaX, deltaY)
    {
    var theObj = getObject(obj);
    if (theObj)
        {
        if (isCSS)
            {
            // equalize incorrect numberic value type
            var units = (typeof theObj.left == "string") ? "px" : 0;
            theObj.left = getObjectLeft(obj) + deltaX + units;
            theObj.top = getObjectTop(obj) + deltaY + units;
            }
        }
    }
    
//  set the z-order of an object
function setZIndex(obj, zOrder)
    {
    var theObj = getObject(obj);
    if (theObj)
        {
        theObj.zIndex = zOrder;
        }
    }
    
//  set the background color of an object
function setBGColor(obj, color)
    {
    var theObj = getObject(obj);
    if (theObj)
        {
        if (isCSS)
            {
            theObj.backgroundColor = color;
            }
        }
    }
    
//  set the visibility of an object to visible
function show(obj)
    {
    var theObj = getObject(obj);
    if (theObj)
        {
        theObj.visibility = "visible";
        }
    }
    
//  set the visibility of an object to hidden
function hide(obj)
    {
    var theObj = getObject(obj);
    if (theObj)
        {
        theObj.visibility = "hidden";
        }
    }
    
//  retrieve the x coordinate of a positionable object
function getObjectLeft(obj)
    {
    var elem = getRawObject(obj);
    var result = 0;
    if (document.defaultView)
        {
        var style = document.defaultView;
        var cssDecl = style.getComputedStyle(elem, "");
        result = cssDecl.getPropertyValue("left");
        }
    else if (elem.currentStyle)
        {
        result = elem.currentStyle.left;
        }
    else if (elem.style)
        {
        result = elem.style.left;
        }
    return parseInt(result);
    }
    
//  retrieve the y coordinate of a positionable object
function getObjectTop(obj)
    {
    var elem = getRawObject(obj);
    var result = 0;
    if (document.defaultView)
        {
        var style = document.defaultView;
        var cssDecl = style.getComputedStyle(elem, "");
        result = cssDecl.getPropertyValue("top");
        }
    else if (elem.currentStyle)
        {
        result = elem.currentStyle.top;
        }
    else if (elem.style)
        {
        result = elem.style.top;
        }
    return parseInt(result);
    }
    
//  retrieve the rendered width of an element
function getObjectWidth(obj)
    {
    var elem = getRawObject(obj);
    var result = 0;
    if (elem.offsetWidth)
        {
        if (elem.scrollWidth && (elem.offsetWidth != elem.scrollWidth))
            {
            result = elem.scrollWidth;
            }
        else
            {
            result = elem.offsetWidth;
            }
        }
    else if (elem.clip && elem.clip.width)
        {
        result = elem.clip.width;
        }
    else if (elem.style && elem.style.pixelWidth)
        {
        result = elem.style.pixelWidth;
        }
    return parseInt(result);
    }
    
//  retrieve the rendered height of an element
function getObjectHeight(obj)
    {
    var elem = getRawObject(obj);
    var result = 0;
    if (elem.offsetHeight)
        {
        result = elem.offsetHeight;
        }
    else if (elem.clip && elem.clip.height)
        {
        result = elem.clip.height;
        }
    else if (elem.style && elem.style.pixelHeight)
        {
        result = elem.style.pixelHeight;
        }
    return parseInt(result);
    }
    
//  return the available content width space in browser window
function getInsideWindowWidth()
    {
    if (window.innerWidth)
        {
        return window.innerWidth;
        }
    else if (isIE6CSS)
        {
        //  measure the html element's clientWidth
        return document.body.parentElement.clientWidth;
        }
    else if (document.body && document.body.clientWidth)
        {
        return document.body.clientWidth;
        }
    return 0;
    }
    
//  return the available content height space in browser window
function getInsideWindowHeight()
    {
    if (window.innerHeight)
        {
        return window.innerHeight;
        }
    else if (isIE6CSS)
        {
        //  measure the html element's clientHeight
        return document.body.parentElement.clientHeight;
        }
    else if (document.body && document.body.clientHeight)
        {
        return document.body.clientHeight;
        }
    return 0;
    }