r = jQuery.grep( r, function(e) { return jQuery.className.has(e, m[2]); }); 
r = jQuery.classFilter( r, m[2] ); 
	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.ownerDocument ) {			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;		// 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( /^\/\//, "" );			var foundToken = false;			// An attempt at speeding up child selectors that			// point to a specific element tag			var re = /^[\/>]\s*([\w*-]+)/;			var m = re.exec(t);			if ( m ) {				// Perform our own iteration and filter				jQuery.each( ret, function(){					for ( var c = this.firstChild; c; c = c.nextSibling )						if ( c.nodeType == 1 && ( jQuery.nodeName(c, m[1]) || m[1] == "*" ) )							r.push( c );				});				ret = r;				t = t.replace( re, "" );				if ( t.indexOf(" ") == 0 ) continue;				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 = jQuery.token[i], fn = jQuery.token[i+1];					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.isFunction( fn ) ?							fn : new Function( "a", "return " + fn ) );						// 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					done = 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 = new RegExp("^(\\w+)(#)(" + jQuery.chars + "+)");					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 = new RegExp("^([#.]?)(" + jQuery.chars + "*)");						m = re2.exec(t);					}					m[2] = m[2].replace(/\\/g, "");					var elem = ret[ret.length-1];					// Try to do a global search by ID, where we can					if ( m[1] == "#" && elem && elem.getElementById ) {						// Optimization for HTML document case						var oid = elem.getElementById(m[2]);												// Do a quick check for the existence of the actual ID attribute						// to avoid selecting by the name attribute in IE						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && oid.id != m[2] )							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];						// Do a quick check for node name (where applicable) so						// that div#foo searches will be really fast						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];					} else {						// We need to find all descendant elements						for ( var i = 0, rl = ret.length; i < rl; i++ ) {							// Grab the tag name being searched for							var tag = m[1] != "" || m[0] == "" ? "*" : m[2];							// Handle IE7 being really dumb about <object>s							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )								tag = "param";							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));						}						// It's faster to filter by class and be done with it						if ( m[1] == "." )							r = jQuery.grep( r, function(e) {								return jQuery.className.has(e, m[2]);							});						// Same with ID filtering						if ( m[1] == "#" ) {							// Remember, then wipe out, the result set							var tmp = r;							r = [];							// Then try to find the element with the ID							jQuery.each( tmp, function(){								if ( this.getAttribute("id") == m[2] ) {									r = [ this ];									return false;								}							});						}						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);			}		}		// An error occurred with the selector;		// just return an empty set instead		if ( t )			ret = [];		// Remove the root context		if ( ret && ret[0] == context )			ret.shift();		// And combine the results		done = jQuery.merge( done, ret );		return done;	},
6056	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/6056/9c94ef4c411867d38f301ccbf406af21e277188c/selector.js/buggy/src/selector/selector.js