rem: ret[i].getElementsByTagName( m[1] != "" || m[0] == "" ? "*" : m[2] ) 
add: ret[i].getElementsByTagName( tag ) 
context: 	find: function( t, context ) {		// Quickly handle non-string expressions		if ( typeof t != "string" )			return [ t ];		// Make sure that the context is a DOM Element		if ( context && !context.nodeType )			context = null;		// Set the correct context (if none is provided)		context = context || document;		// Handle the common XPath // expression		if ( !t.indexOf("//") ) {			context = context.documentElement;			t = t.substr(2,t.length);		// And the / root expression		} else if ( !t.indexOf("/") ) {			context = context.documentElement;			t = t.substr(1,t.length);			if ( t.indexOf("/") >= 1 )				t = t.substr(t.indexOf("/"),t.length);		}		// Initialize the search		var ret = [context], done = [], last = null;		// Continue while a selector expression exists, and while		// we're no longer looping upon ourselves		while ( t && last != t ) {			var r = [];			last = t;			t = jQuery.trim(t).replace( /^\/\//i, "" );			var foundToken = false;			// An attempt at speeding up child selectors that			// point to a specific element tag			var re = /^[\/>]\s*([a-z0-9*-]+)/i;			var m = re.exec(t);			if ( m ) {				// Perform our own iteration and filter				for ( var i = 0, rl = ret.length; i < rl; i++ )					for ( var c = ret[i].firstChild; c; c = c.nextSibling )						if ( c.nodeType == 1 && ( c.nodeName == m[1].toUpperCase() || m[1] == "*" ) )							r.push( c );				ret = r;				t = jQuery.trim( t.replace( re, "" ) );				foundToken = true;			} else {				// Look for pre-defined expression tokens				for ( var i = 0; i < jQuery.token.length; i += 2 ) {					// Attempt to match each, individual, token in					// the specified order					var re = new RegExp("^(" + jQuery.token[i] + ")");					var m = re.exec(t);					// If the token match was found					if ( m ) {						// Map it against the token's handler						r = ret = jQuery.map( ret, jQuery.token[i+1].constructor == Function ?							jQuery.token[i+1] :							function(a){ return eval(jQuery.token[i+1]); });						// And remove the token						t = jQuery.trim( t.replace( re, "" ) );						foundToken = true;						break;					}				}			}			// See if there's still an expression, and that we haven't already			// matched a token			if ( t && !foundToken ) {				// Handle multiple expressions				if ( !t.indexOf(",") ) {					// Clean the result set					if ( ret[0] == context ) ret.shift();					// Merge the result sets					jQuery.merge( done, ret );					// Reset the context					r = ret = [context];					// Touch up the selector string					t = " " + t.substr(1,t.length);				} else {					// Optomize for the case nodeName#idName					var re2 = /^([a-z0-9_-]+)(#)([a-z0-9\\*_-]*)/i;					var m = re2.exec(t);										// Re-organize the results, so that they're consistent					if ( m ) {					   m = [ 0, m[2], m[3], m[1] ];					} else {						// Otherwise, do a traditional filter check for						// ID, class, and element selectors						re2 = /^([#.]?)([a-z0-9\\*_-]*)/i;						m = re2.exec(t);					}					// Try to do a global search by ID, where we can					if ( m[1] == "#" && ret[ret.length-1].getElementById ) {						// Optimization for HTML document case						var oid = ret[ret.length-1].getElementById(m[2]);						// Do a quick check for node name (where applicable) so						// that div#foo searches will be really fast						ret = r = oid && 						  (!m[3] || oid.nodeName == m[3].toUpperCase()) ? [oid] : [];					} else {						// Pre-compile a regular expression to handle class searches						if ( m[1] == "." )							var rec = new RegExp("(^|\\s)" + m[2] + "(\\s|$)");						// We need to find all descendant elements, it is more						// efficient to use getAll() when we are already further down						// the tree - we try to recognize that here						for ( var i = 0, rl = ret.length; i < rl; i++ )							jQuery.merge( r,								m[1] != "" && ret.length != 1 ?									jQuery.getAll( ret[i], [], m[1], m[2], rec ) :									ret[i].getElementsByTagName( m[1] != "" || m[0] == "" ? "*" : m[2] )							);						// It's faster to filter by class and be done with it						if ( m[1] == "." && ret.length == 1 )							r = jQuery.grep( r, function(e) {								return rec.test(e.className);							});						// Same with ID filtering						if ( m[1] == "#" && ret.length == 1 ) {							// Remember, then wipe out, the result set							var tmp = r;							r = [];							// Then try to find the element with the ID							for ( var i = 0, tl = tmp.length; i < tl; i++ )								if ( tmp[i].getAttribute("id") == m[2] ) {									r = [ tmp[i] ];									break;								}						}						ret = r;					}					t = t.replace( re2, "" );				}			}			// If a selector string still exists			if ( t ) {				// Attempt to filter it				var val = jQuery.filter(t,r);				ret = r = val.r;				t = jQuery.trim(val.t);			}		}		// Remove the root context		if ( ret && ret[0] == context ) ret.shift();		// And combine the results		jQuery.merge( done, ret );		return done;	},
meta: 1471	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/1471/74c06be3ea29d246194815342a79ea798ea56771/selector.js/buggy/src/selector/selector.js