//
//  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 aSelectorData
	var aAttributeData
	var sAttribute 
	var sAREx

	var hSelectorRegEx = /([^\[]*)\[?(.*)\]$|([a-z0-9_\-]*)/i
	var hAttributeRegEx = /([a-z0-9_]*)([\*\^\$]?)(=?)(.*)/i

	if( hSelectorRegEx.test( sSelector ) ){
		aSelectorData = hSelectorRegEx.exec( sSelector )
		var sSelector = aSelectorData[ 1 ] ? aSelectorData[ 1 ] : aSelectorData[ 3 ]
		if( sSelector != '' ){
			hGroup  = hParent.getElementsByTagName( sSelector.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 '*' :	//alert( aAttributeData[ 4 ] )
												sAREx = new RegExp( aAttributeData[ 4 ], 'g' )
											
												if( sAREx.test( sAttribute ) ){
													hInitFunction( hGroup[ nI ] )
												}
												break
								}
							}
						} else {
							hInitFunction( hGroup[ nI ] )
						}
					}
				}
			}
			//we have the new implementation - css3 style selectors, so return
			return
		}
	}
}

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 )
}
