text: ﻿Sys.ComponentSet = function ComponentSet(elementSet, query, index) {
      this._elementSet = elementSet || (elementSet = new Sys.ElementSet());
      this._components = this._execute(elementSet, query, index);
  }
  
  Sys.ComponentSet.prototype = {
      __class: true,
      setProperties: function ComponentSet$setProperties(properties) {
          // Sets properties on the matched components.
          // "properties" - object with the names and values of the properties to set.
          return this.each(function() {
              Sys._set(this, properties);
          });
      },
  
      get: function ComponentSet$get(index) {
          // Returns the component at the specified index, or an array of all matches if not specified.
          var components = this._components;
  
          return (typeof (index) === "undefined") ? (Array.apply(null, components)) : (components[index || 0] || null);
      },
  
      each: function ComponentSet$each(callback) {
          // Enumerate all the found components. The index of the component are passed as parameters to a callback. You may return 'false' to cancel the enumeration.
          // "callback" - function called for each component.
          foreach(this._components, function(c, i) {
              if(callback.call(c, i) === false)
                  return true;
          });
  
          return this;
      },
  
      elements: function ComponentSet$elements() {
          // Returns the underlying set of elements this component collection came from.
          return this._elementSet;
      },
  
      _execute: function ComponentSet$_execute(elementSet, query, index) {
          var components = [];
          function match(c) {
              var ctor;
              return (c instanceof query) ||
                  ((ctor = c.constructor) && (
                      (ctor === query) ||
                      (ctor.inheritsFrom && ctor.inheritsFrom(query)) ||
                      (ctor.implementsInterface && ctor.implementsInterface(query))));
          }
  
          if(query instanceof Array)
              components.push.apply(components, query);
          else
              // query is a type or not set
              elementSet.each(function() {
                  var c = this.control;
  
                  if(c && (!query || match(c)))
                      components.push(c);
  
                  foreach(this._behaviors, function(b) {
                      if(!query || match(b))
                          components.push(b);
                  });
              });
  
          if((typeof (index) !== "undefined")) {
              if(components[index])
                  components = [components[index]];
              else
                  components = [];
          }
  
          return components;
      }
  }