function Range() {
	this._value = 0;
	this._minimum = 0;
	this._maximum = 100;
	this._isChanging = false;
}

Range.prototype.setValue = function (value) {
	value = parseFloat(value);
	if (isNaN(value)) return;
	if (this._value != value) {
		if (value > this._maximum)
			this._value = this._minimum;
		else if (value < this._minimum)
			this._value = this._maximum;
		else
			this._value = value;
		if (!this._isChanging && typeof this.onchange == "function")
			 this.onchange();
	}
};

Range.prototype.getValue = function () {
	return this._value;
};

Range.prototype.setMinimum = function (minimum) {
	if (this._minimum != minimum) {
		var oldIsChanging = this._isChanging;
		this._isChanging = true;

		this._minimum = minimum;

		if (minimum > this._value)
			this.setValue(minimum);
		if (minimum > this._maximum) {
			this.setMaximum(minimum);
			this.setValue(minimum)
		}

		this._isChanging = oldIsChanging;
		if (!this._isChanging && typeof this.onchange == "function")
			this.onchange();
	}
};

Range.prototype.getMinimum = function () {
	return this._minimum;
};

Range.prototype.setMaximum = function (maximum) {
	if (this._maximum != maximum) {
		var oldIsChanging = this._isChanging;
		this._isChanging = true;

		this._maximum = maximum;

		if (maximum < this._value)
			this.setValue(maximum);
		if (maximum < this._minimum) {
			this.setMinimum(maximum);
			this.setValue(this._maximum);
		}

		this._isChanging = oldIsChanging;
		if (!this._isChanging && typeof this.onchange == "function")
			this.onchange();
	}
};

Range.prototype.getMaximum = function () {
	return this._maximum;
};
