//
//  This script was created
//  by Mircho Mirev
//  mo /mo@momche.net/
//
//	:: feel free to use it BUT
//	:: if you want to use this code PLEASE send me a note
//	:: and please keep this disclaimer intact
//

if ( document.ELEMENT_NODE == null )
{
	document.ELEMENT_NODE = 1
	document.TEXT_NODE = 3
}

function getSubNodeByName( hNode, sNodeName )
{
	if( hNode != null )
	{
		var nNc = 0
		var nC	= 0
		var hNodeChildren = hNode.childNodes
		var hCNode = null
		while( nC < hNodeChildren.length )
		{
			hCNode = hNodeChildren.item( nC++ )
			if( ( hCNode.nodeType == 1 ) && ( hCNode.nodeName.toLowerCase() == sNodeName.toLowerCase() ) )
			{
				return hCNode
			}
		}
	}
	return null
}

function getSubNodeByTagName( hNode, sNodeName )
{
	if( hNode != null )
	{
		var nNc = 0
		var nC	= 0
		var hNodeChildren = hNode.childNodes
		var hCNode = null
		while( nC < hNodeChildren.length )
		{
			hCNode = hNodeChildren.item( nC++ )
			if( ( hCNode.nodeType == 1 ) && ( hCNode.tagName.toLowerCase() == sNodeName ) )
			{
				return hCNode
			}
		}
	}
	return null
}

function getPrevNodeSibling( hNode )
{
	if( hNode != null )
	{
		do {
			hNode = hNode.previousSibling
		} while( hNode != null && hNode.nodeType != 1 )
		return hNode
	}
}

function getNextNodeSibling( hNode )
{
	if( hNode != null )
	{
		do {
			hNode = hNode.nextSibling
		} while( hNode != null && hNode.nodeType != 1 )
		return hNode
	}
}

function getLastSubNodeByName( hNode, sNodeName )
{
	if( hNode != null )
	{
		var nNc = 0
		var nC	= 0
		var hNodeChildren = hNode.childNodes
		var hCNode = null
		var nLength = hNodeChildren.length - 1
		while( nLength >=0  )
		{
			hCNode = hNodeChildren.item( nLength )
			if( ( hCNode.nodeType == 1 ) && ( hCNode.nodeName.toLowerCase() == sNodeName ) )
			{
				return hCNode
			}
			nLength--
		}
	}
	return null
}

function getSubNodeByProperty( hNode, sProperty, sPropValue )
{
	if( hNode != null )
	{
		var nNc = 0
		var nC	= 0
		var hNodeChildren = hNode.childNodes
		var hCNode = null
		var sAttribute
		var hProp
		sPropValue = sPropValue.toLowerCase()
		while( nC < hNodeChildren.length )
		{
			hCNode = hNodeChildren.item( nC++ )
			if( hCNode.nodeType == document.ELEMENT_NODE )
			{
				hProp = eval( 'hCNode.'+sProperty )
				if( typeof( sPropValue ) != 'undefined' )
				{
					if( hProp.toLowerCase() == sPropValue )
					{
						return hCNode
					}
				}
				else
				{
					return hCNode
				}
			}
			nNc++
		}
	}
	return null
}

function findAttribute( hNode, sAtt )
{
	sAtt = sAtt.toLowerCase()
	for( var nI = 0; nI < hNode.attributes.length; nI++ )
	{
		if( hNode.attributes.item( nI ).nodeName.toLowerCase() == sAtt )
		{
			return hNode.attributes.item( nI ).nodeValue
		}
	}
	return null
}

function getSubNodeByAttribute( hNode, sAtt, sAttValue )
{
	if( hNode != null )
	{
		var nNc = 0
		var nC	= 0
		var hNodeChildren = hNode.childNodes
		var hCNode = null
		var sAttribute
		sAttValue = sAttValue.toLowerCase()
		while( nC < hNodeChildren.length )
		{
			hCNode = hNodeChildren.item( nC++ )
			if( hCNode.nodeType == document.ELEMENT_NODE )
			{
				sAttribute = hCNode.getAttribute( sAtt )
				if( sAttribute && sAttribute.toLowerCase() == sAttValue )
				return hCNode
			}
			nNc++
		}
	}
	return null
}

function getLastSubNodeByAttribute( hNode, sAtt, sAttValue )
{
	if( hNode != null )
	{
		var nNc = 0
		var nC	= 0
		var hNodeChildren = hNode.childNodes
		var hCNode = null
		var nLength = hNodeChildren.length - 1
		while( nLength >= 0 )
		{
			hCNode = hNodeChildren.item( nLength )
			if( hCNode.nodeType == document.ELEMENT_NODE )
			{
				sAttribute = hCNode.getAttribute( sAtt )
				if( sAttribute && sAttribute.toLowerCase() == sAttValue )
				return hCNode
			}
			nLength--
		}
	}
	return null
}

function getParentByTagName( hNode, sParentTagName )
{
	while( ( hNode.tagName ) && !( hNode.tagName.toLowerCase() == 'body' || hNode.tagName.toLowerCase() == 'html' ) )
	{
		if( hNode.tagName == sParentTagName )
		{
			return hNode
		}
		hNode = hNode.parentNode
	}
	return null
}

function getParentByAttribute( hNode, sAtt, sAttValue )
{
	while( ( hNode.tagName ) && !( hNode.tagName.toLowerCase() == 'body' || hNode.tagName.toLowerCase() == 'html' ) )
	{
		//opera strangely returns non null result sometimes
		var sAttr = hNode.getAttribute( sAtt )
		if( sAttr != null && sAttr.toString().length > 0 )
		{
			if( sAttValue !== null )
			{
				if( sAttr == sAttValue )
				{
					return hNode
				}
			}
			else
			{
				return hNode
			}
		}
		hNode = hNode.parentNode
	}
	return null
}

function getParentByProperty( hNode, sProperty, sPropValue )
{
	while( ( hNode.tagName ) && !( hNode.tagName.toLowerCase() == 'body' || hNode.tagName.toLowerCase() == 'html' ) )
	{
		//opera strangely returns non null result sometimes
		var hProp = eval( 'hNode.'+sProperty )
		if( hProp != null && hProp.toString().length > 0 )
		{
			if( sPropValue !== null )
			{
				if( hProp == sPropValue )
				{
					return hNode
				}
			}
			else
			{
				return hNode
			}
		}
		hNode = hNode.parentNode
	}
	return null
}

function getNodeText( hNode )
{
	if( hNode == null )
	{
		return ''
	}
	var sRes
	if( hNode.hasChildNodes() )
	{
		sRes = hNode.childNodes.item(0).nodeValue
	}
	else
	{
		sRes = hNode.text
	}
	return sRes
}

//deep get text
function getAllNodeText( hNode )
{
	var sText = ''
	for( var nI = 0; nI < hNode.childNodes.length; nI ++ )
	{
		if( hNode.childNodes[ nI ].nodeType == document.TEXT_NODE )
		{
			sText += hNode.childNodes[ nI ].nodeValue
		}
		else
		{
			sText += getAllNodeText( hNode.childNodes[ nI ] )
		}
	}
	return sText
}

function getElementsByClass( sSearchClass, hNode, sTagName )
{
	var hClassElements = new Array()
	if ( hNode == null )
	{
		hNode = document
	}
	if ( sTagName == null )
	{
		sTagName = '*'
	}

	var hElements = hNode.getElementsByTagName( sTagName )
	var nElementsLength = hElements.length;

	var hPattern = new RegExp( "(^|\\s)"+sSearchClass+"(\\s|$)" )
	for ( var nI = 0, nJ = 0; nI < nElementsLength; nI++ )
	{
		if ( hPattern.test( hElements[ nI ].className ) )
		{
			hClassElements[ nJ++ ] = hElements[ nI ]
		}
	}
	return hClassElements
}

