/**
* A number field
* @constructor
*/
hui.ui.NumberInput = function(o) {
this.options = hui.override({min:0,max:undefined,value:null,tickSize:1,decimals:0,allowNull:false},o);
this.name = o.name;
var e = this.element = hui.get(o.element);
this.input = hui.get.firstByTag(e,'input');
this.up = hui.get.firstByClass(e,'hui_numberinput_up');
this.down = hui.get.firstByClass(e,'hui_numberinput_down');
if (hui.isString(this.options.value)) {
this.value = parseInt(this.options.value,10);
} else {
this.value = this.options.value;
}
if (isNaN(this.value)) {
this.value = null;
}
hui.ui.extend(this);
this._addBehavior();
};
/** Creates a new number field */
hui.ui.NumberInput.create = function(o) {
o.element = hui.build('span',{
'class':'hui_numberinput',
html:'<input class="hui_textinput" type="text" value="'+(o.value!==undefined ? o.value : '0')+'"/><a class="hui_numberinput_up"></a><a class="hui_numberinput_down"></a>'
});
return new hui.ui.NumberInput(o);
};
hui.ui.NumberInput.prototype = {
_addBehavior : function() {
var e = this.element;
hui.listen(this.input,'focus',this._onFocus.bind(this));
hui.listen(this.input,'blur',this._onBlur.bind(this));
hui.listen(this.input,'keyup',this._onKey.bind(this));
hui.listen(this.up,'mousedown',this.upEvent.bind(this));
//hui.listen(this.up,'dblclick',this.upEvent.bind(this));
hui.listen(this.down,'mousedown',this.downEvent.bind(this));
//hui.listen(this.down,'dblclick',this.upEvent.bind(this));
},
_onBlur : function() {
this._updateField();
if (this.sliderPanel) {
this.sliderPanel.hide();
}
},
_onFocus : function() {
this._showSlider();
this._updateSlider();
},
_onKey : function(e) {
e = e || window.event;
if (e.keyCode == 38) {
hui.stop(e);
this.upEvent();
} else if (e.keyCode == 40) {
this.downEvent();
} else {
var parsed = parseFloat(this.input.value,10);
if (!isNaN(parsed)) {
this._setLocalValue(parsed,true);
} else {
this._setLocalValue(null,true);
}
}
},
/** @private */
downEvent : function(e) {
hui.stop(e);
if (this.value===null) {
this._setLocalValue(this.options.min,true);
} else {
this._setLocalValue(this.value-this.options.tickSize,true);
}
this._updateField();
},
/** @private */
upEvent : function(e) {
hui.stop(e);
this._setLocalValue(this.value+this.options.tickSize,true);
this._updateField();
},
/** Sets focus */
focus : function() {
try {
this.input.focus();
} catch (e) {}
},
/** Gets the value */
getValue : function() {
return this.value;
},
/** Sets the value */
setValue : function(value) {
if (value===null || value===undefined) {
this._setLocalValue(null,false);
} else {
value = parseFloat(value,10);
if (!isNaN(value)) {
this._setLocalValue(value,false);
}
}
this._updateField();
},
_updateField : function() {
this.input.value = this.value===null || this.value===undefined ? '' : this.value;
},
_setLocalValue : function(value,fire) {
var orig = this.value;
if (value===null || value===undefined && this.options.allowNull) {
this.value = null;
} else {
value = this._getValueWithinRange(value);
this.value = this._round(value);
}
if (fire && orig!==this.value) {
this.fireValueChange();
}
this._updateSlider();
},
_round : function(value) {
if (this.options.decimals!==undefined) {
var x = Math.pow(10,this.options.decimals);
value = Math.round(value * x) / x;
}
return value;
},
/** Resets the field */
reset : function() {
if (this.options.allowNull) {
this.value = null;
} else {
this.value = this._getValueWithinRange(0);
}
this._updateField();
},
_getValueWithinRange : function(value) {
if (hui.isDefined(this.options.min)) {
value = Math.max(value,this.options.min);
}
if (hui.isDefined(this.options.max)) {
value = Math.min(value,this.options.max);
}
return value;
},
_onSliderChange : function(value) {
var conv = this.options.min+(this.options.max-this.options.min)*value;
this._setLocalValue(conv,true);
this._updateField();
},
_showSlider : function() {
if (this.options.min===undefined || this.options.max===undefined) {
return;
}
if (!this.sliderPanel) {
this.sliderPanel = hui.ui.BoundPanel.create({variant:'light'});
this.slider = hui.ui.Slider.create({width:200});
this.slider.element.style.margin='0 3px';
this.slider.listen({$valueChanged : this._onSliderChange.bind(this)});
this.sliderPanel.add(this.slider);
}
this.sliderPanel.position({element:this.element,position:'vertical'});
this.sliderPanel.show();
},
_updateSlider : function() {
if (this.slider) {
this.slider.setValue((this.value -this.options.min) / (this.options.max-this.options.min));
}
},
/** @private */
$$parentMoved : function() {
if (this.sliderPanel && this.sliderPanel.isVisible()) {
this.sliderPanel.position({element:this.element,position:'vertical'});
this.sliderPanel.show();
}
}
};