function _removeChildren( poElement ) 
{ 
   while ( poElement.childNodes.length > 0 ) 
   { 
      poElement.removeChild( poElement.childNodes[0] ); 
   } 
} 

function _findElementById( psElementId ) 
{ 
    return document.getElementById( psElementId );
}

function _findElementsById(psElementId) 
{
    return document.getElementsByName(psElementId);
} 

function _findRow( poElement ) 
{ 
   var oTRow = poElement; 
   while ( oTRow != null ) 
   { 
      if ( oTRow.nodeName.toLowerCase( ) == "tr" ) 
      { 
         break; 
      } 
      oTRow = _safeGetParentElement( oTRow ); 
   } 
   return oTRow; 
} 

function _findParentElementById( poElement, psElementId ) 
{ 
   var oParentElement = poElement; 
   while ( oParentElement != null ) 
   { 
      if ( oParentElement.id = psElementId ) 
      { 
         break; 
      } 
      oParentElement = _safeGetParentElement( oTRow ); 
   } 
   return oParentElement; 
} 

function _safeGetSourceElement( poEvent ) 
{ 
   if ( poEvent.srcElement != null ) 
   { 
      return poEvent.srcElement; 
   } 
   else if ( poEvent.target != null ) 
   { 
      return poEvent.target; 
   } 
   else 
   { 
      return null; 
   } 
} 

function _safeGetToElement( poEvent ) 
{ 
   if ( poEvent.toElement != null ) 
   { 
      return poEvent.toElement; 
   } 
   else if ( poEvent.relatedTarget != null ) 
   { 
      return poEvent.relatedTarget; 
   } 
   else 
   { 
      return null; 
   } 
} 

function _safeAttachEvent( poElement, psEventName, pfnEventHandler ) 
{ 
   if ( poElement.attachEvent != null ) 
   { 
      poElement.attachEvent( psEventName, pfnEventHandler ); 
   } 
   else if ( poElement.addEventListener != null ) 
   { 
      poElement.addEventListener( psEventName.substr( 2 ), pfnEventHandler, true ); 
   } 
} 

function _safeUnattachEvent( poElement, psEventName, pfnEventHandler ) 
{ 
   if ( poElement.detachEvent != null ) 
   { 
      poElement.detachEvent( psEventName ); 
   } 
   else if ( poElement.removeEventListener != null ) 
   { 
      poElement.removeEventListener( psEventName.substr( 2 ), pfnEventHandler, true ); 
   } 
} 

function _postXML( psURL, psRequestXML ) 
{
   var oResponseXML = null;
   
   if ( window.XMLHttpRequest != null )
   {
      var oXMLHttp = new XMLHttpRequest( );
   
      oXMLHttp.open( "POST", psURL, false );
      oXMLHttp.setRequestHeader( "Content-Type", "text/xml;charset=UTF-8" );
      oXMLHttp.send( psRequestXML );
      
      if ( oXMLHttp.status == 200 )
      {
         oResponseXML = oXMLHttp.responseXML;
      }
      
      oXMLHttp = null;
   }
   else if ( window.ActiveXObject != null )
   {
      var oXML = new ActiveXObject( "Msxml2.DOMDocument" );
      
      oXML.async = false;
      oXML.loadXML( psRequestXML );

      var oXMLHttp = new ActiveXObject( "Msxml2.XMLHTTP" );   
      
      oXMLHttp.open( "POST", psURL, false );
      oXMLHttp.setRequestHeader( "Content-Type", "text/xml;charset=UTF-8" );
      oXMLHttp.send( oXML );
      
      if ( oXMLHttp.status == 200 )
      {
         oResponseXML = oXMLHttp.responseXML;
      }
      
      oXML = null;
      oXMLHttp = null;
   }
   
   if ( oResponseXML != null )
   {
      if ( oResponseXML.documentElement.nodeName != "success" )
      {
         oResponseXML = null;   
      }
   }
   
   return oResponseXML;
}

function _findChildElementById( poElement, psElementId ) 
{
   if ( poElement.id == psElementId )
   {
      return poElement;
   }
   else   
   {
      var nLoop = 0;
      var nLength = poElement.childNodes.length;
      for ( nLoop = 0; nLoop < nLength; ++nLoop )
      {
         var oCurrentElement = poElement.childNodes[nLoop];
         if ( oCurrentElement.id == psElementId )
         {
            return oCurrentElement;
         }
         
         var oFoundElement = _findChildElementById( oCurrentElement, psElementId );
         if ( oFoundElement != null )
         {
            return oFoundElement;
         }
      }
   }
   
   return null;
}

function _findAllChildElementsByNodeName( poElement, psNodeName ) 
{
   var aElements = new Array( );
   _findAllChildElementsByNodeName2( poElement, psNodeName.toUpperCase( ), aElements );
   return aElements;
}

function _findAllChildElementsByNodeName2( poElement, psNodeName, paElements ) 
{
   if ( poElement.nodeName.toUpperCase( ) == psNodeName )
   {
      paElements[paElements.length] = poElement;
   }
   else   
   {
      var nLoop = 0;
      var nLength = poElement.childNodes.length;
      for ( nLoop = 0; nLoop < nLength; ++nLoop )
      {
         var oCurrentElement = poElement.childNodes[nLoop];
         if ( oCurrentElement.nodeName.toUpperCase( ) == psNodeName )
         {
            paElements[paElements.length] = oCurrentElement;
         }
         _findAllChildElementsByNodeName2( oCurrentElement, psNodeName, paElements );
      }
   }
}

function _trimString( psValue )
{
	if ( typeof( pValue) == "string" )
   {
      while ( psValue.length > 0 )
      {
         if ( psValue.charAt( 0 ) == " " )
         {
            psValue = psValue.substr( 1 );
         }
         else
         {
            break;
         }
      }
      
      while ( psValue.length > 0 )
      {
         if ( psValue.charAt( psValue.length - 1 ) == " " )
         {
            psValue = psValue.substr( 0, psValue.length - 1 );
         }
         else
         {
            break;
         }
      }
   }

   return psValue;
}

function _escapeXMLValue( psXMLValue )	
{
	if( typeof(psXMLValue) == "string" )
	{
		return ( psXMLValue.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/\'/g,"&apos;") );
	}
	else
	{
		return psXMLValue;
	}
}

function _unEscapeXMLValue( psXMLValue )	
{
	if ( typeof( psXMLValue ) == "string" )
	{
		return ( psXMLValue.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,"\"").replace(/&apos;/g,"'") );
	}
	else
	{
		return psXMLValue;
	}
}

function _getAbsoluteXY( poElement )
{
   var obj = new Object( );
   obj.offsetLeft = poElement.offsetLeft;
   obj.offsetTop = poElement.offsetTop;
   
   while ( poElement.offsetParent != null )
   {
      poElement = poElement.offsetParent;
      obj.offsetLeft += poElement.offsetLeft;
      obj.offsetTop += poElement.offsetTop;
   }

   return obj;
}

function _fill( psValue, pnCount )
{
   var nLoop = 0;
   var nLength = pnCount;
   var sValue = "";
   for ( nLoop = 0; nLoop < nLength; ++nLoop )
   {
      sValue += psValue;
   }
   return sValue;
}

function _getAttribute(poElement, psAttribute)
{
    return poElement.getAttributeNode(psAttribute).nodeValue
}

function _safeXPathQuery( poXMLNode, psQuery )
{
    if ( typeof( XPathEvaluator ) == "function" )
    {
        var oEvaluator = new XPathEvaluator( );
        var oResult = oEvaluator.evaluate( psQuery, poXMLNode, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );    
	    var aNodes = new Array( );
        if ( oResult != null ) 
        {
            var oElement = oResult.iterateNext( );
            while ( oElement != null ) 
            {
                aNodes.push( oElement );
                oElement = oResult.iterateNext( );
            }
        }
    
        return aNodes;
    }
    else
    {
        return poXMLNode.selectNodes( psQuery );
    }
}

function _safeGetParentElement( poNode )
{
    if ( poNode.parentElement != null )
    {
        return poNode.parentElement;
    }
    else
    {
        return poNode.parentNode;
    }
}

function _safeMoveRow( poTable, pnFromIndex, pnToIndex )
{
    if ( typeof( poTable.moveRow ) == "undefined" )
    {
        var nFromIndex = ( pnFromIndex != null ) ? pnFromIndex : -1;
        var nToIndex = ( pnToIndex != null ) ? pnToIndex : -1;
        if ( ( poTable.rows[nFromIndex] != null ) && ( nToIndex < poTable.rows.length ) )
        {
            // This is just so that it gets put in the right place.
            if ( nToIndex > nFromIndex )
            {
                ++nToIndex;
            }
            else if( nFromIndex > nToIndex )
            {
                ++nFromIndex;
            }

            var oTRow = poTable.insertRow( nToIndex );
            oTRow.innerHTML = poTable.rows[nFromIndex].innerHTML;
            poTable.deleteRow( nFromIndex );
            
            return oTRow;
        }
        else
        {
            return null;
        }
    }
    else
    {
        return poTable.moveRow( pnFromIndex, pnToIndex );
    }
}

function _safeGetClientWidth( ) 
{
	return _filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}

function _safeGetClientHeight( ) 
{
	return _filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}

function _safeGetScrollLeft( ) 
{
	return _filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}

function _safeGetScrollTop( ) 
{
	return _filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}

function _filterResults(n_win, n_docel, n_body) 
{
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function _trim(str, chars) 
{
    return _ltrim(_rtrim(str, chars), chars);
}

function _ltrim(str, chars) 
{
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function _rtrim(str, chars) 
{
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}