//DHTMLapi
//Based on the DHTMLapi by Danny Goodman, as published in O'Reilly's Dynamic HTML

//Global Variables
var isCSS, isW3C, isIE4, isNN4, isIE6CSS;

//initialize upon load to let all browsers 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;
    }
}

//Seek nested NN4 layer from string name
function seekLayer(doc, name)
{
    var theObj;
    for (var i=0; i<doc.layers.length; i++)
    {
        if(doc.layers[i].name==name)
        {
            theObj=doc.layers[i];
            break;
        }

        //dive into nested layers if necessary
        if(doc.layers[i].document.layers.length>0)
        {
            theObj=seekLayer(document.layers[i].document, name);
        }
    }
    
    return theObj;
}

//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 if(isNN4)
        {
            theObj=seekLayer(document, obj);
        }
    }
    else
    {
        //pass through object reference
        theObj=obj;
    }

    return theObj;
}

//Convert object name string or object reference into a valid style
//or NN4 layer 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 string 
            var units=(typeof theObj.left=="string")?"px":0;
            theObj.left = x + units;
            theObj.top = y + units;
        }
        else if(isNN4)
        {
            theObj.moveTo(x,y);
        }
    }
}

//move an object by x and/or y pixels
function shiftBy(obj, deltaX, deltaY)
{
    var theObj=getObject(obj);
    if(theObj)
    {
        if(isCSS)
        {
            //equalize incorrect numeric value type
            var units=(typeof theObj.left=="string")?"px":0;
            theObj.left=getObjectLeft(obj)+deltaX+units;
            theObj.top=getObjectTop(obj)+deltaY+units;
        }
        else if(isNN4)
        {
            theObj.moveBy(deltaX, deltaY);
        }
    }
}

//center an object vertically just to the right of where an event fires
function centerRightVert(objToMove, objReference)
{
    var theObjToMove=getObject(objToMove);
    var theObjReference=getRawObject(objReference);

    if(theObjToMove&&theObjReference)
    {
        theObjWidth=parseInt(theObjToMove.width);
        theObjHeight=parseInt(theObjToMove.height);

        //if there is an event object, use it to determine where to place the passed object
        if(typeof(event)=="object")
        {
            newX=event.x-theObjWidth-theObjReference.width;
            newY=event.y+document.body.scrollTop-(theObjHeight/2);
        }
        //else, use the reference object's X attribute.
        else if(theObjReference.x)
        {
            newX=theObjReference.x-theObjWidth-10;
            newY=theObjReference.y-(theObjHeight/2);
        }

        //if the Y coordinate is above the currently viewable screen,
        //set it so the "popup" will always have its top visible.
        if(newY<document.body.scrollTop)
        {
            newY=document.body.scrollTop+5;
        }
                
        shiftTo(objToMove, newX, newY);
    }
}


//set the z-order of an object
function setZIndex(obj, zOrder)
{
    var theObj=getObject(obj);
    if(theObj)
    {
        theObj.zIndex=zOrder;
    }
}

//sets bgcolor of an object
function setBGColor(obj, color)
{
    var theObj=getObject(obj);
    if(theObj)
    {
        if(isNN4)
        {
            theObj.bgColor=color;
        }
        else if(isCSS)
        {
            theObj.backgroundColor=color;
        }
    }
}    

//sets an object as visible
function show(obj)
{
    var theObj=getObject(obj);
    if(theObj)
    {
        theObj.visibility="visible";
    }
}

//sets an object as 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;
    }
    else if(isNN4)
    {
        result=elem.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;
    }
    else if(isNN4)
    {
        result=elem.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 && wlem.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 && wlem.style.pixelHeight)
    {
        result = elem.style.pixelHeight;
    }
    
    return parseInt(result);
}


//return the available content width space in the 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 the browser window
function getInsideWindowHeight()
{
    if(window.innerHeight)
    {
        return window.innerHeight;
    }
    else if (isIE6CSS)
    {
        //measure the html element's clientWidth
        return document.body.parentElement.clientHeight;
    }
    else if(document.body && document.body.clientHeight)
    {
        return document.body.clientHeight;
    }
    
    return 0;
}

//used for image mouseover
var preloadFlag = false;

//Functions to handle mouseover image effects
function newImage(arg) 
{
	if (document.images) 
	{
		rslt = new Image();
		rslt.src = arg;
		return rslt;
	}
}

function changeImages() 
{
	if (document.images && (preloadFlag == true)) 
	{
		for (var i=0; i<changeImages.arguments.length; i+=2) 
		{
			document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
		}
	}
}



