summaryrefslogtreecommitdiffstats
path: root/autocomplete/js/modomext.js
diff options
context:
space:
mode:
Diffstat (limited to 'autocomplete/js/modomext.js')
-rw-r--r--autocomplete/js/modomext.js219
1 files changed, 219 insertions, 0 deletions
diff --git a/autocomplete/js/modomext.js b/autocomplete/js/modomext.js
new file mode 100644
index 0000000..f914292
--- /dev/null
+++ b/autocomplete/js/modomext.js
@@ -0,0 +1,219 @@
+//
+// 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 )
+}