From af0be8f9546fb5dec947be33e465bb6d9e85d0a7 Mon Sep 17 00:00:00 2001 From: Andreas Unterkircher Date: Thu, 27 Mar 2008 22:59:06 +0100 Subject: issue111, first try of auto completion for tag search box Signed-off-by: Andreas Unterkircher --- autocomplete/js/modomext.js | 219 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 autocomplete/js/modomext.js (limited to 'autocomplete/js/modomext.js') 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 ) +} -- cgit v1.2.3-18-g5258