//

//  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

//



//	This in fact is a simple dom iterator

//	requires: mobrowser.js



function cDomExtension( hParent, aSelectors, hInitFunction )

{

	this.hParent = hParent

	this.aSelectors = aSelectors

	this.hInitFunction = hInitFunction

}



cDomExtensionManager = 

{

	aExtensions : new Array()

}



cDomExtensionManager.register = function( hDomExtension )

{

	cDomExtensionManager.aExtensions.push( hDomExtension )

}



cDomExtensionManager.initSelector = function( hParent, sSelector, hInitFunction )

{

	var hSelectorRegEx

	var hAttributeRegEx

	var aSelectorData

	var aAttributeData

	var sAttribute 



	hSelectorRegEx = /([a-z0-9_]*)\[?([^\]]*)\]?/i

	hAttributeRegEx = /([a-z0-9_]*)([\*\^\$]?)(=?)(([a-z0-9_=]*))/i



	if( hSelectorRegEx.test( sSelector ) && !/[@#\.]/.test( sSelector ) )

	{

		aSelectorData = hSelectorRegEx.exec( sSelector )

		if( aSelectorData[ 1 ] != '' )

		{

			hGroup  = hParent.getElementsByTagName( aSelectorData[ 1 ].toLowerCase() )

			for( nI = 0; nI < hGroup.length; nI ++ )

			{

				hGroup[ nI ].markExt = true

			}

			for( nI = 0; nI < hGroup.length; nI ++ )

			{

				if( !hGroup[ nI ].markExt )

				{

					continue

				}

				else

				{

					hGroup[ nI ].markExt = false

				}

				if( aSelectorData[ 2 ] == '' )

				{

					if( hGroup[ nI ].tagName.toLowerCase() == aSelectorData[ 1 ].toLowerCase()  )

					{

						hInitFunction( hGroup[ nI ] )

					}

				}

				else

				{

					aAttributeData = hAttributeRegEx.exec( aSelectorData[ 2 ] )

					if( aAttributeData[ 1 ] == 'class' )

					{

						sAttribute = hGroup[ nI ].className

					}

					else

					{

						sAttribute = hGroup[ nI ].getAttribute( aAttributeData[ 1 ] )

					}

					if( sAttribute != null && sAttribute.length > 0 )

					{

						if( aAttributeData[ 3 ] == '=' )

						{

							if( aAttributeData[ 2 ] == '' )

							{

								if( sAttribute == aAttributeData[4] )

								{

									hInitFunction( hGroup[ nI ] )

								}

							}

							else

							{

								switch( aAttributeData[ 2 ] )

								{

									case '^' :	if( sAttribute.indexOf( aAttributeData[ 4 ] ) == 0 )

												{

													hInitFunction( hGroup[ nI ] )

												}

												break

									case '$' :	if( sAttribute.lastIndexOf( aAttributeData[ 4 ] ) == sAttribute.length - aAttributeData[ 4 ].length )

												{

													hInitFunction( hGroup[ nI ] )

												}

												break

									case '*' :	if( sAttribute.indexOf( aAttributeData[ 4 ] ) >= 0 )

												{

													hInitFunction( hGroup[ nI ] )

												}

												break

								}

							}

						}

						else

						{

							hInitFunction( hGroup[ nI ] )

						}

					}

				}

			}

			//we have the new implementation - css3 style selectors, so return

			return

		}

	}





	hSelectorRegEx = /([a-z0-9_]*)([\.#@]?)([a-z0-9_=~]*)/i

	hAttributeRegEx = /([a-z0-9_]*)([=~])?([a-z0-9_]*)/i

	aSelectorData = hSelectorRegEx.exec( sSelector )

	

	if( aSelectorData[ 1 ] != '' )

	{

		var hGroup  = hParent.getElementsByTagName( aSelectorData[ 1 ] )

		for( nI = 0; nI < hGroup.length; nI ++ )

		{

			hGroup[ nI ].markExt = true

		}

		for( nI = 0; nI < hGroup.length; nI ++ )

		{

			if( !hGroup[ nI ].markExt )

			{

				continue

			}

			else

			{

				hGroup[ nI ].markExt = false

			}

			if( aSelectorData[ 2 ] != '' )

			{

				switch( aSelectorData[ 2 ] )

				{

					case '.' : 	if( hGroup[ nI ].className == aSelectorData[ 3 ] )

								{

									hInitFunction( hGroup[ nI ] )

								}

								break

								

					case '#' : 	if( hGroup[ nI ].id == aSelectorData[ 3 ] )

								{

									hInitFunction( hGroup[ nI ] )

								}

								break

								

					case '@' : 	aAttributeData = hAttributeRegEx.exec( aSelectorData[ 3 ] )

								sAttribute = hGroup[ nI ].getAttribute( aAttributeData[ 1 ] )

								if(  sAttribute != null && sAttribute.length > 0  )

								{					

									if( aAttributeData[ 3 ] != '' )

									{

										if( aAttributeData[ 2 ] == '=' )

										{

											if( sAttribute == aAttributeData[ 3 ] )

											{

												hInitFunction( hGroup[ nI ] )

											}

										}

										else /* the case is like ~ */

										{

											if( sAttribute.indexOf( aAttributeData[ 3 ] ) >= 0 )

											{

												hInitFunction( hGroup[ nI ] )

											}

										}

									}

									else

									{

										hInitFunction( hGroup[ nI ] )

									}

								}

								break

				}

			}

		}

	}



}



cDomExtensionManager.initialize = function()

{

	var hDomExtension = null

	var aSelectors

	

	for( var nKey in cDomExtensionManager.aExtensions )

	{

		aSelectors = cDomExtensionManager.aExtensions[ nKey ].aSelectors

		for( var nKey2 in aSelectors )

		{

			cDomExtensionManager.initSelector( cDomExtensionManager.aExtensions[ nKey ].hParent, aSelectors[ nKey2 ], cDomExtensionManager.aExtensions[ nKey ].hInitFunction )

		}

	}

}



if( window.addEventListener )

{

	window.addEventListener( 'load', cDomExtensionManager.initialize, false )

}

else if( window.attachEvent )

{

	window.attachEvent( 'onload', cDomExtensionManager.initialize )

}

