//v4.01
function MM_findObj(n,d){var p,i,x;if(!d)d=document;if((p=n.indexOf("?"))>0&&parent.frames.length){d=parent.frames[n.substring(p+1)].document;n=n.substring(0,p);}if(!(x=d[n])&&d.all)x=d.all[n];for(i=0;!x&&i<d.forms.length;i++)x=d.forms[i][n];for(i=0;!x&&d.layers&&i<d.layers.length;i++)x=MM_findObj(n,d.layers[i].document);if(!x && d.getElementById)x=d.getElementById(n);return x;}


var _reverseEntityMap = new Object();
_reverseEntityMap["lt"] = '<';
_reverseEntityMap["gt"] = '>';
_reverseEntityMap["apos"] = '\'';
_reverseEntityMap["quot"] = '"';
_reverseEntityMap["amp"] = '&';


// decodes entities in a string into their actual values
function htmlDecode(s)
{
    if (!s)
    {
        return s
    }

    var entity = false;
    var out = "";
    var accum = "";
    for (var i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (entity)
        {
            if (c == ';')
            {
                entity = false;
                var c2 = _reverseEntityMap[accum];
                if (c2)
                {
                    out += c2;
                } else {
                    out += '&' + accum + ';';
                }
            } else if (c == ' ') {
                // no spaces in entities
                entity = false;
                out += '&' + accum + ' ';
            }
            accum += c;
        } else {
            if (c == '&')
            {
                entity = true;
                accum = "";
            } else {
                out += c;
            }
        }
    }

    return out;
}

function getScrollX(win)
{
    if (!win)
    {
        win = window;
    }

    if (_isMsie)
    {
        return win.document.body.scrollLeft;
    }

    return win.scrollX;
}

function getScrollY(win)
{
    if (!win)
    {
        win = window;
    }

    if (_isMsie)
    {
        return win.document.body.scrollTop;
    }

    return win.scrollY;
}

function getWindowHeight(win)
{
    if (!win)
    {
        win = window;
    }

    if (_isMsie)
    {
        return win.document.body.clientHeight;
    }

    return win.innerHeight;
}

function getWindowWidth(win)
{
    if (!win)
    {
        win = window;
    }

    if (_isMsie)
    {
        return win.document.body.clientWidth;
    }

    return win.innerWidth;
}

function getWindowSize()
{
    var retVal = new Object();
    retVal.w = getWindowWidth(window);
    retVal.h = getWindowHeight(window);
    if (_isGecko)
    {
        var mainDiv = MM_findObj("mainDiv");
        if (retVal.h < mainDiv.offsetHeight)
        {
            retVal.w -= SCROLLBAR_WIDTH;
        }

        if (retVal.w < mainDiv.offsetWidth)
        {
            retVal.h -= SCROLLBAR_WIDTH;
        }
    }
    
    return retVal;
}

// gets the page-relative bounds of an HTML element
function getBounds(o)
{
    if (!o)
    {
        return null;
    }

    var state = new Object();
    state.x = o.offsetLeft;
    state.y = o.offsetTop;
    state.w = o.offsetWidth;
    state.h = o.offsetHeight;

    var p = o.offsetParent;
    while (p)
    {
        state.x += p.offsetLeft;
        state.y += p.offsetTop;
        p = p.offsetParent;
    }
    return state;
}

// disables text selection on an element;
function disableSelection(element)
{
    if (_isMsie)
    {
        element.onselectstart = function () { return false; };
    } else {
        element.onmousedown = function () { return false; };
        element.onclick = function () { return true; };
    }
}

// returns the ancestor node of the given class name, or null if not found
function findAncestorByClass(node, className)
{
    if (!node)
    {
        return null;
    }

    if (node.className == className)
    {
        return node;
    }
    
    return findAncestorByClass(node.parentNode, className);
}

// returns an array of all children with the given class name
function findChildrenByClass(node, className, accum)
{
    if (!node)
    {
        return null;
    }

    if (typeof accum == "undefined")
    {
        accum = [];
    }

    if (node.className == className)
    {
        accum[accum.length] = node;
    }

    var children = node.childNodes;
    for (var i = 0; i < children.length; i++)
    {
        findChildrenByClass(children.item(i), className, accum);
    }

    return accum;
}

// makes an HTML element invisible
function hide(element, force)
{
    if (!element)
    {
        return;
    }
    var s = element.style;
    s.visibility = "hidden";

    // on IE, set display to none to avoid nasty border-bug
    if (_isMsie || force)
    {
        s.display = "none";
    }
}

// makes an HTML element visible
function show(element, force)
{
    if (!element)
    {
        return;
    }
    var s = element.style;
    s.visibility = "visible";
    if (_isMsie || force)
    {
        s.display = "inline";
    }
}


// delete extra spaces and CR's in a single string
function cleanStr(s) 
{
    if (!s)
    {
        return s;
    }

    var out = "";
    var len = s.length;
    var last = 0;

    for (var i = 0; i < len; i++)
    {
        var c = s.charAt(i);
        if (c == " " && (last == c || last == 0))
        {
            continue;
        }

        switch (c)
        {
            case 13:
            case 10:
                break;
            default:
                out += c;
                break;
        }
        last = c;
    }

    var i = len;
    while (i--)
    {
        if (out.charAt(i) != " ")
        {
            out = out.substring(0, i+1);
            break;
        }
    }

	return out;
}

// makes lower case & deletes non-text/non-numbers from string
function cleanName(t)
{
    if (!t)
    {
        return t; 
    }

	var c;
    var i = 0;
	t = t.toLowerCase();
	while (i < t.length)
    {
		if (((c = t.charAt(i)) >= "a" && c <= "z") || (c >= "0" && c <= "9"))
        {
            i++; 
        } else {
            t = t.substr(0,i) + t.substr(i+1);
        }
    }
	return t;
}



// delete extra spaces and CR's in array of strings
function cleanArray(a)
{
	for (var i = 0; i < a.length; i++)
    {
        a[i] = cleanStr(a[i]);
    }
}

// is a an ancestor element of b
function isAncestor(a, b)
{
    if (a == document.body)
    {
        return true;
    }

    if (!b || b == document.body)
    {
        return false;
    }

    if (a == b)
    {
        return true;
    }

    return isAncestor(a, b.parentNode);
}

function isVisible(node)
{
    if (!node)
    {
        return false;
    }

    if (node.style)
    {
        return (node.style.visibility == "visible");
    }

    return isVisible(node.menu) || isVisible(node.scrollMenu);
}

function isDisplayed(node)
{
    if (!node)
    {
        return false;
    }

    if (node.style)
    {
        return (node.style.display != "none");
    }

    return isDisplayed(node.menu) || isDisplayed(node.scrollMenu);
}




var _entityMap = new Object();
_entityMap['<'] = "&lt;";
_entityMap['>'] = "&gt;";
_entityMap['\''] = "&apos;";
_entityMap['"'] = "&quot;";
_entityMap['&'] = "&amp;";
_entityMap['\n'] = "<br/>";

function htmlEncode(s)
{
    if (!s)
    {
        return "null";
    }

    var out = "";
    for (var i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        var n = _entityMap[c];
        if (n)
        {
            out += n;
        }
        else
        {
            var cc = s.charCodeAt(i);
            if (cc > 128)
            {
                out += "&#"+ cc + ";";
            }
            else
            {
                out += c;
            }
        }
    }

    return out;
}

/* DEBUG STUFF -------------------------------------------------

// this stuff will get removed for the final version

var _debugWin = null;
function debug(s)
{
    if (!_debugWin || _debugWin.closed)
    {
        _debugWin = window.open("","debugWin","left=0,top=0,width=300,height=500,resizable=yes,scrollbars=yes" );
    }

    if (!_debugWin)
    {
        return;
    }

    s += " ";
    _debugWin.document.write(htmlEncode(s)+"<br/>\n");
    _debugWin.scrollTo(0, _debugWin.document.body.offsetHeight);
}

function dumpToStr(obj, filter)
{
    var s = "";
    for (var i in obj)
    {
        if (typeof obj[i] != "function")
        {
            if (typeof filter != "function" || filter(i))
            {
                s += i + ": " + obj[i] + "\n";
            }
        }
    }
    return s;
}

// END DEBUG STUFF ---------------------------------------------- */
