whole_func_string: function matchedRangeForCSSProperty(rule, selRange, isBackward) {
  		/** @type CSSProperty */
  		var property = null;
  		var possibleRanges, curRange = null, ix;
  		var list = rule.list();
  		var searchFn, nearestItemFn;
  		
  		if (isBackward) {
  			list.reverse();
  			searchFn = function(p) {
  				return p.range(true).start <= selRange.start;
  			};
  			nearestItemFn = function(r) {
  				return r.start < selRange.start;
  			};
  		} else {
  			searchFn = function(p) {
  				return p.range(true).end >= selRange.end;
  			};
  			nearestItemFn = function(r) {
  				return r.end > selRange.start;
  			};
  		}
  		
  		// search for nearest to selection CSS property
  		while (property = _.find(list, searchFn)) {
  			possibleRanges = makePossibleRangesCSS(property);
  			if (isBackward)
  				possibleRanges.reverse();
  			
  			// check if any possible range is already selected
  			curRange = _.find(possibleRanges, function(r) {
  				return r.equal(selRange);
  			});
  			
  			if (!curRange) {
  				// no selection, select nearest item
  				var matchedRanges = _.filter(possibleRanges, function(r) {
  					return r.inside(selRange.end);
  				});
  				
  				if (matchedRanges.length > 1) {
  					curRange = matchedRanges[1];
  					break;
  				}
  				
  				if (curRange = _.find(possibleRanges, nearestItemFn))
  					break;
  			} else {
  				ix = _.indexOf(possibleRanges, curRange);
  				if (ix != possibleRanges.length - 1) {
  					curRange = possibleRanges[ix + 1];
  					break;
  				}
  			}
  			
  			curRange = null;
  			selRange.start = selRange.end = isBackward 
  				? property.range(true).start - 1
  				: property.range(true).end + 1;
  		}
  		
  		return curRange;
  	}
func_code_string: function matchedRangeForCSSProperty(rule, selRange, isBackward) {
  		/** @type CSSProperty */
  		var property = null;
  		var possibleRanges, curRange = null, ix;
  		var list = rule.list();
  		var searchFn, nearestItemFn;
  		
  		if (isBackward) {
  			list.reverse();
  			searchFn = function(p) {
  				return p.range(true).start <= selRange.start;
  			};
  			nearestItemFn = function(r) {
  				return r.start < selRange.start;
  			};
  		} else {
  			searchFn = function(p) {
  				return p.range(true).end >= selRange.end;
  			};
  			nearestItemFn = function(r) {
  				return r.end > selRange.start;
  			};
  		}
  		
  		// search for nearest to selection CSS property
  		while (property = _.find(list, searchFn)) {
  			possibleRanges = makePossibleRangesCSS(property);
  			if (isBackward)
  				possibleRanges.reverse();
  			
  			// check if any possible range is already selected
  			curRange = _.find(possibleRanges, function(r) {
  				return r.equal(selRange);
  			});
  			
  			if (!curRange) {
  				// no selection, select nearest item
  				var matchedRanges = _.filter(possibleRanges, function(r) {
  					return r.inside(selRange.end);
  				});
  				
  				if (matchedRanges.length > 1) {
  					curRange = matchedRanges[1];
  					break;
  				}
  				
  				if (curRange = _.find(possibleRanges, nearestItemFn))
  					break;
  			} else {
  				ix = _.indexOf(possibleRanges, curRange);
  				if (ix != possibleRanges.length - 1) {
  					curRange = possibleRanges[ix + 1];
  					break;
  				}
  			}
  			
  			curRange = null;
  			selRange.start = selRange.end = isBackward 
  				? property.range(true).start - 1
  				: property.range(true).end + 1;
  		}
  		
  		return curRange;
  	}
func_documentation_string: Tries to find matched CSS property and nearest range for selection
  @param {CSSRule} rule
  @param {Range} selRange
  @param {Boolean} isBackward
  @returns {Range}