docs: function(options) {
  			if (this._text.length > 1) {
  				this._text = [this._text.join("")];
  			}
  			var string = options.string;
  			var regex = options.regex;
  			var pattern = string;
  			var flags = "";
  			var caseInsensitive = options.caseInsensitive;
  			if (pattern) {
  				if (regex) {
  					var parsed = mRegex.parse(pattern);
  					if (parsed) {
  						pattern = parsed.pattern;
  						flags = parsed.flags;
  					}
  				} else {
  					pattern = string.replace(/([\\$\^*\/+?\.\(\)|{}\[\]])/g, "\\$&"); //$NON-NLS-0$
  					/*
  					* Bug in JS RegEx. In a Turkish locale, dotless i (u0131) capitalizes to I (u0049) and i (u0069) 
  					* capitalizes to dot I (u0130). The JS RegEx does not match correctly the Turkish i's in case
  					* insensitive mode. The fix is to detect the presence of Turkish i's in the search pattern and 
  					* to modify the pattern to search for both upper and lower case.
  					*/
  					if (caseInsensitive) {
  						pattern = pattern.replace(/[iI\u0130\u0131]/g, "[Ii\u0130\u0131]"); //$NON-NLS-0$
  					}
  				}
  			}
  			var current = null, skip;
  			if (pattern) {
  				var reverse = options.reverse;
  				var wrap = options.wrap;
  				var wholeWord = options.wholeWord;
  				var start = options.start || 0;
  				var rangeStart = options.rangeStart;
  				var rangeEnd = options.rangeEnd;
  				var isRange = rangeStart !== null && rangeStart !== undefined && rangeEnd !== null && rangeEnd !== undefined;
  				if (flags.indexOf("g") === -1) { flags += "g"; } //$NON-NLS-1$ //$NON-NLS-2$
  				if (flags.indexOf("m") === -1) { flags += "m"; } //$NON-NLS-1$ //$NON-NLS-2$
  				if (caseInsensitive) {
  					if (flags.indexOf("i") === -1) { flags += "i"; } //$NON-NLS-1$ //$NON-NLS-2$
  				}
  				if (wholeWord) {
  					pattern = "\\b" + pattern + "\\b"; //$NON-NLS-1$ //$NON-NLS-2$
  				}
  				var text = this._text[0], result, lastIndex, offset = 0;
  				if (isRange) {
  					var s = rangeStart < rangeEnd ? rangeStart : rangeEnd;
  					var e = rangeStart < rangeEnd ? rangeEnd : rangeStart;
  					text = text.substring(s, e);
  					offset = s;
  				}
  				var re = new RegExp(pattern, flags);
  				if (reverse) {
  					skip = function() {
  						var match = null;
  						re.lastIndex = 0;
  						while (true) {
  							lastIndex = re.lastIndex;
  							result = re.exec(text);
  							if (lastIndex === re.lastIndex) {
  								return null;
  							}
  							if (result) {
  								if (result.index + offset < start) {
  									match = {start: result.index + offset, end: re.lastIndex + offset};
  								} else {
  									if (!wrap || match) {
  										break;
  									}
  									start = text.length + offset;
  									match = {start: result.index + offset, end: re.lastIndex + offset};
  								}
  							} else {
  								break;
  							}
  						}
  						if (match) { start = match.start; }
  						return match;
  					};
  				} else {
  					re.lastIndex = start - offset;
  					skip = function() {
  						while (true) {
  							lastIndex = re.lastIndex;
  							result = re.exec(text);
  							if (lastIndex === re.lastIndex) {
  								return null;
  							}
  							if (result) {
  								return {start: result.index + offset, end: re.lastIndex + offset};
  							}
  							if (lastIndex !== 0) {
  								if (wrap) {
  									continue;
  								}
  							}
  							break;
  						}
  						return null;
  					};
  				}
  				current = skip();
  			}
  			return {
  				/**
  				 * @callback 
  				 */
  				next: function() {
  					var result = current;
  					if (result) { current = skip(); }
  					return result;					
  				},
  				/**
  				 * @callback 
  				 */
  				hasNext: function() {
  					return current !== null;
  				}
  			};
  		}