rem: re2 = /^([#.]?)([a-z0-9\\*_-]*)/i; 
add: re2 = /^([#.]?)([\w\u0128-\uFFFF*-]*)/i; 
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.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 = 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				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];					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( jQuery.token[i+1] ) ?							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					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 = /^([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);					}					var last = ret[ret.length-1];					// Try to do a global search by ID, where we can					if ( m[1] == "#" && last && last.getElementById ) {						// Optimization for HTML document case						var oid = last.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 && oid && oid.id != m[2] )							oid = jQuery('[@id="'+m[2]+'"]', last)[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 {						// 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++ ) {							// 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 rec.test(e.className);							});						// 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);			}		}		// Remove the root context		if ( ret && ret[0] == context ) ret.shift();		// And combine the results		done = jQuery.merge( done, ret );		return done;	},
meta: 1471	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/1471/af79bb1f255433d553d8d9dde0306cc340903c1a/selector.js/buggy/src/selector/selector.js