/** A control that displays a repeating list of rows, suitable for displaying medium-sized lists (up to ~100 items). A flyweight strategy is employed to render one set of row controls, as needed, for as many rows as are contained in the repeater. The FlyweightRepeater's _components_ block contains the controls to be used for a single row. This set of controls will be rendered for each row. You may customize row rendering by handling the _onSetupItem_ event. The controls inside a FlyweightRepeater are non-interactive. This means that calling methods that would normally cause rendering to occur (e.g., _setContent_) will not do so. However, you can force a row to render by calling _renderRow(inRow)_. In addition, you can force a row to be temporarily interactive by calling _prepareRow(inRow)_. Call the _lockRow_ method when the interaction is complete. For more information, see the documentation on [Lists](https://github.com/enyojs/enyo/wiki/Lists) in the Enyo Developer Guide. */ enyo.kind({ name: "enyo.FlyweightRepeater", published: { //* Number of rows to render count: 0, //* If true, multiple selections are allowed multiSelect: false, //* If true, the selected item will toggle toggleSelected: false }, events: { /** Fires once per row at render time, with event object: _{index: , selected: }_ */ onSetupItem: "" }, components: [ {kind: "Selection", onSelect: "selectDeselect", onDeselect: "selectDeselect"}, {name: "client"} ], rowOffset: 0, bottomUp: false, //* @protected create: function() { this.inherited(arguments); this.multiSelectChanged(); }, multiSelectChanged: function() { this.$.selection.setMulti(this.multiSelect); }, setupItem: function(inIndex) { this.doSetupItem({index: inIndex, selected: this.isSelected(inIndex)}); }, //* Renders the list. generateChildHtml: function() { var h = ""; this.index = null; // note: can supply a rowOffset // and indicate if rows should be rendered top down or bottomUp for (var i=0, r=0; i