/*** = Description ** This class is still at experimental phase. ** Please assume that the API _will_ change later. ** HCheckboxList is a combined list of HCheckboxes. ** ***/ var//RSence.Lists HCheckboxList = HListItemControl.extend({ /** = Description * Draws borders with 1px and sets 'overflow' to 'auto'. * **/ drawSubviews: function(){ this.setStyle('border','1px solid #999'); this.setStyle('border-radius','3px'); this.setStyle('overflow','auto'); }, listItems: [], listItemViews: [], ListCheckbox: HCheckbox.extend({ /** = Description * Adds listValues to the parent if they are true otherwise deletes them. * **/ refreshValue: function(){ this.base(); if(this.value === true){ this.parent.addItem( this.options.listValue ); } else{ this.parent.delItem( this.options.listValue ); } } }), // End ListCheckbox setEnabled: function(_state){ this.base(_state); if(!this['listItemViews']){ return; } for(var i=0;i<this.listItems.length;i++){ this.listItemViews[i].setEnabled(_state) } }, /** = Description * Checks if +_listValue+ can be found from the values. Adds the value * if it can't be found. * * = Parameters * +_listValue+:: listValue to add. * **/ addItem: function( _listValue ){ if(!~this.value.indexOf(_listValue)){ var _newValue = [], i = 0; for( ; i < this.value.length; i++ ){ _newValue.push( this.value[i] ); } _newValue.push( _listValue ); this.setValue( _newValue ); } }, /** = Description * Checks if the item can be found from this.value and deletes it * in case it can be found. * * = Parameters * +_listValue+:: A listValue to delete. * **/ delItem: function( _listValue ){ var _listIndex = this.value.indexOf(_listValue); if(~_listIndex){ var _newValue = [], i = 0; for( ; i < this.value.length; i++ ){ if(this.value[i] !== _listValue){ _newValue.push( this.value[i] ); } } this.setValue( _newValue ); } }, /** = Description * Setter function for listItems and listImetViews. Destroys * the old ListCheckboxes before creating the new ones based on the * listItems given as an parameter. * * = Parameters * +_listItems+:: listItems is an array-packed array, where each index in the * surrounding array contains a [ value, label ] pair. * The value is mapped to the value of the HRadiobuttonList * instance when its HRadiobutton instance is selected. * **/ setListItems: function(_listItems){ _listItems = this._cleanListItems(_listItems); var _listItem, _value, _label, _checked, _checkbox, i = 0; for ( ; i < this.listItemViews.length; i++ ) { try { this.listItemViews[i].die(); } catch(e) { console.log('HCheckboxList, setListItems item destruction error: ',e); } } this.listItems = _listItems; this.listItemViews = []; for ( i = 0 ; i < _listItems.length; i++ ){ _listItem = _listItems[i]; _value = _listItem[0]; _label = _listItem[1]; _checked = !!~this.value.indexOf( _value ); _checkbox = this.ListCheckbox.nu( [ 4, (i*23)+4, null, 23, 4, null ], this, { label: _label, value: _checked, listValue: _value, enabled: this.enabled } ); this.listItemViews[i] = _checkbox; } this.refreshValue(); }, _listItemResponder: null, setListItemResponder: function(_listItemResponder){ this._listItemResponder = _listItemResponder; }, /** = Description * Sets listItems and ListItemViews to null and calls * the inherited destructor. * **/ die: function(){ if(this._listItemResponder){ this._listItemResponder.die(); this._listItemResponder = null; } this.listItems = null; this.listItemViews = null; this.base(); }, /** = Description * Checks whether there are listItemViews and if there are, * refreshes their state. * * = Returns * +self+ * **/ refreshValue: function(){ if(this.listItemViews.length === 0){ return this; } var _value = this.value, _listItems = this.listItems, _listItemValue, _selectedItems = [], i = 0, _isSelected; for( ; i < _listItems.length; i++ ){ _listItemValue = _listItems[i][0]; _isSelected = !!~_value.indexOf( _listItemValue ); this.listItemViews[i].setValue( _isSelected ); if(_isSelected){ _selectedItems.push( _listItemValue ); } } return this; } });