/** @constructor */ hui.ui.Picker = function(options) { options = this.options = hui.override({itemWidth:100,itemHeight:150,itemsVisible:null,shadow:true,valueProperty:'value'},options); this.element = hui.get(options.element); this.name = options.name; this.container = hui.get.firstByClass(this.element,'hui_picker_container'); this.content = hui.get.firstByClass(this.element,'hui_picker_content'); this.title = hui.get.firstByClass(this.element,'hui_picker_title'); this.pages = []; this.objects = []; this.selected = null; this.value = null; this._addBehavior(); hui.ui.extend(this); }; hui.ui.Picker.create = function(options) { options = hui.override({shadow:true},options); options.element = hui.build('div',{ 'class' : 'hui_picker', html : hui.when(options.title,'<div class="hui_picker_title">'+options.title+'</div>')+ '<div class="hui_picker_container"><div class="hui_picker_content"></div></div>'+ '<div class="hui_picker_pages"></div>' }); if (options.shadow) { hui.cls.add(options.element,'hui_picker_shadow'); } return new hui.ui.Picker(options); }; hui.ui.Picker.prototype = { _addBehavior : function() { hui.drag.register({ element : this.element, onBeforeMove : this._onBeforeMove.bind(this), onMove : this._onMove.bind(this), onAfterMove : this._onAfterMove.bind(this) }); hui.listen(this.element,'click',this._onClick.bind(this)); }, _onClick : function(e) { if (this.dragging) { return; } e = hui.event(e); var page = e.findByClass('hui_picker_page'); if (page) { this.goToPage(parseInt(page.getAttribute('data-index'))); } }, goToPage : function(index) { var pos = Math.round(this.container.clientWidth*index); pos = Math.min(pos,this.content.clientWidth-this.container.clientWidth); this._scrollTo(pos,hui.ease.fastSlow); }, setObjects : function(objects) { this.selected = null; this.objects = objects || []; this._updateUI(); }, setValue : function(value) { this.value = value; this._updateSelection(); }, getValue : function() { return this.value; }, reset : function() { this.value = null; this._updateSelection(); }, _updateUI : function() { var self = this, width; this.content.innerHTML = ''; this.container.scrollLeft = 0; if (this.options.itemsVisible) { width = this.options.itemsVisible*(this.options.itemWidth+14); } else { width = this.container.clientWidth; } hui.style.set(this.container,{ width : width+'px', height : (this.options.itemHeight+14)+'px' }); hui.style.set(this.content,{ width : (this.objects.length*(this.options.itemWidth+14))+'px', height : (this.options.itemHeight+14)+'px' }); hui.each(this.objects,function(object,i) { var item = hui.build('div',{ 'class' : 'hui_picker_item', title : object.title, html : '<div style="width:'+self.options.itemWidth+'px;height:'+self.options.itemHeight+'px; overflow: hidden; background-image:url(\''+object.image+'\')"><strong>'+hui.string.escape(object.title)+'</strong></div>', parent : self.content }); if (self.value !== null && object[self.options.valueProperty]==self.value) { hui.cls.add(item,'hui_picker_item_selected'); } hui.listen(item,'mouseup',function() { self._onItemClick(object[self.options.valueProperty]); }); }); this._updatePages(); }, _updatePages : function() { var cw = this.container.clientWidth; if (!cw) { return; } var pageCount = Math.ceil(this.content.clientWidth / cw); var pages = hui.get.firstByClass(this.element,'hui_picker_pages'); hui.dom.clear(pages); if (pageCount<2) {return;} for (var i=1; i <= pageCount; i++) { hui.build('a',{ parent : pages, text : i, className : 'hui_picker_page'+hui.when(i==1,' hui_picker_page_selected'), 'data-index' : i-1 }); } }, _updateSelection : function() { var children = this.content.childNodes; for (var i=0; i < children.length; i++) { hui.cls.set(children[i],'hui_picker_item_selected',this.value!==null && this.objects[i][this.options.valueProperty]==this.value); } }, _onItemClick : function(value) { if (this.dragging) return; if (this.value==value) return; this.value = value; this._updateSelection(); this.fire('select',value); }, _onBeforeMove : function(e) { this.dragX = e.getLeft(); this.dragScroll = this.container.scrollLeft; this.dragging = true; }, _onMove : function(e) { this.container.scrollLeft = this.dragX-e.getLeft()+this.dragScroll; }, _onAfterMove : function(e) { var size = this.options.itemWidth+14; var pos = Math.round(this.container.scrollLeft/size)*size; this._scrollTo(pos); this.dragging = false; }, _scrollTo : function(pos,ease) { ease = ease || hui.ease.bounceOut; hui.animate(this.container,'scrollLeft',pos,500,{ease : ease,onComplete : this._updatePager.bind(this)}); }, _updatePager : function() { var page = Math.ceil(this.container.scrollLeft / this.container.clientWidth); var pages = hui.get.byClass(this.element,'hui_picker_page'); for (var i=0; i < pages.length; i++) { hui.cls.set(pages[i],'hui_picker_page_selected',page==i); } }, $visibilityChanged : function() { if (!hui.dom.isVisible(this.element)) {return;} this.container.style.display='none'; var width; if (this.options.itemsVisible) { width = this.options.itemsVisible*(this.options.itemWidth+14); } else { width = this.container.parentNode.clientWidth; } width = Math.max(width,0); hui.style.set(this.container,{width:width+'px',display:'block'}); this._updatePages(); } };