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