setBodyClass();

function setBodyClass()
{
    var htmlElement = document.childNodes[1];
    if ( window.createPopup ) //IE
        htmlElement.className = htmlElement.className + " IE";
    else //FF
        htmlElement.className = htmlElement.className + " NonIE";
}

function htmlSafe( text )
{
    return text.replace( /&/g, "&amp;" );
}

function getRandomQueryString()
{
    return "&" + new Date().getTime() + "=" + Math.random();
}

function getText( node )
{
    var text        = "";
    var children    = node.childNodes;
    var len         = children.length;

    if ( node.nodeType == 3 ) //text
        return node.nodeValue ;
    
    for ( var i = 0; i < len; i++ )
        text += getText( children[i] );
        
    return text;
}

function swapNodes( node1, node2 ) 
{
    if ( window.createPopup )
    {
        node1.swapNode( node2 );
        return;
    }

    var tmpNode = node1.cloneNode(1);
    var parent  = node1.parentNode;

    node2 = parent.replaceChild( tmpNode, node2);
    parent.replaceChild( node2, node1 );
    parent.replaceChild( node1, tmpNode );
    tmpNode = null;
}

function nodeToPoint( node, subtractScroll )
{
    var point       = { x: 0, y: 0 };
    var lastNode    = node;
	
	while ( node ) 
	{
        point.x     += node.offsetLeft;
        point.y     += node.offsetTop;
        lastNode    = node;
        node        = node.offsetParent;
    }
    
    if ( subtractScroll )
    {
        point.x -= ( window.createPopup ? lastNode.scrollLeft : window.pageXOffset );
        point.y -= ( window.createPopup ? lastNode.scrollTop : window.pageYOffset );
    }
	
	return point;
}

function syncTableElements( element1, element2, isRecursive )
{   
    try
    {
        if ( element2.nodeName == "TD" || element2.nodeName == "TR" || element2.nodeName == "TABLE" )
        {
            var heightOffset = 0;
            var isSnapHeader = element2.className.indexOf( 'wLSnH' ) >= 0;
            if ( isSnapHeader && !window.createPopup ) //FF
            {
                var prevCol = element2.previousSibling.previousSibling;
                
                //if next column also snaps, set size
                //if ( prevCol != null && prevCol.className.indexOf( 'wLSnH' ) >= 0 ) ~*~ removed for now, but not sure about that.
                {
                    var offset      = ( element2.parentNode.cells.length - 1 ) - element2.cellIndex;
                    var otherCell   = element2.parentNode.cells[offset];
                    var diff        = otherCell.nextSibling.nextSibling.offsetLeft - otherCell.offsetLeft;
                    element2.style.width    = ( diff - 9 ) + "px";
                }
                heightOffset = -1;
            }
            else
            {
                if ( !window.createPopup ) //FF
                {
                    if ( !isSnapHeader && element2.nodeName == "TD" )
                    {
                        element2.style.width    = element1.offsetWidth + "px";
                        element2.style.position = "absolute";
                        element2.style.top      = "0px";
                        element2.style.left     = ( element1.offsetLeft - 
                            nodeToPoint( element1.parentNode, false ).x ) + "px";
//                        alert( element2.innerHTML + "," + element2.style.left + "," + element1.offsetLeft +
//                            "," + nodeToPoint( element1.parentNode, false ).x );
                    }
                }
                else
                    element2.style.width    = element1.offsetWidth + "px";
            }
                
            element2.style.height   = ( element1.offsetHeight + heightOffset ) + "px";
        }
        
        if ( isRecursive )
        {
            for ( var i = 0; i < element2.childNodes.length; i++ )
                syncTableElements( element1.childNodes[i], element2.childNodes[i], isRecursive );
        }
     }
     catch ( e )
     {
        //alert( e + "," + element2 + "," + element1 )
     }
}

function getCSSClass( className ) 
{
    var rulesText;
    if ( document.all )
        rulesText = 'rules';
    else if ( document.getElementById )
        rulesText = 'cssRules';
    
    var sheet;
    var classRule;
    var isDone = false;
    for ( var sheetIX = 0; sheetIX < document.styleSheets.length; sheetIX++ )
    {
        sheet = document.styleSheets[sheetIX];
        for ( var ruleIX = 0; ruleIX < sheet[rulesText].length; ruleIX++ ) 
        {
            classRule = sheet[rulesText][ruleIX];
            if ( classRule.selectorText == className )
                return classRule;
        }
    }
    
    return null;
}

function addCSSClass( className ) 
{
    if ( document.styleSheets[0].addRule )
    {
         document.styleSheets[0].addRule( className, null, 0 );
         return document.styleSheets[0].rules[0];
    }
    else 
        return document.styleSheets[0].cssRules[ document.styleSheets[0].insertRule( className + ' { }', 0 ) ];
}