﻿Sawbuck = window.Sawbuck || {}; Sawbuck.Slider = function(opts) { this._eventHandlers = []; this._isMoved = false; this._position = { 'left': 0, 'right': 0 }; this._positionNew = { 'left': 0, 'right': 0 }; this._index = { 'left': 0, 'right': 0 }; this._indexNew = { 'left': 0, 'right': 0 }; this._host = $j(opts.host); this._labelElements = { left: $j(opts.labelElements.left), right: $j(opts.labelElements.right) }; this._size = opts.size || { base: 160, thumb: 12 }; this._values = opts.values; this._leftMax = opts.leftMax || this._values[this._valueCount]; this._rightMin = opts.rightMin || this._values[0]; this._labels = opts.labels; this._resetFields = opts.resetFields; this._property = opts.property; this._base = $j("<div class='base'></div>"); this._host.append(this._base); this._thumbs = { left: $j("<a class='left'></a>"), right: $j("<a class='right'></a>") }; this._host.append(this._thumbs.left); this._host.append(this._thumbs.right); this._sliderSpace = this._size.base - this._size.thumb; this._valueCount = this._values.length - 1; this.resetThumbs(); this._mousemoveLeftHandler = Sawbuck.Utilities.createDelegate(this, this.mousemoveLeft); this._mousemoveRightHandler = Sawbuck.Utilities.createDelegate(this, this.mousemoveRight); this._mouseupLeftHandler = Sawbuck.Utilities.createDelegate(this, this.mouseupLeft); this._mouseupRightHandler = Sawbuck.Utilities.createDelegate(this, this.mouseupRight); this._thumbs.left.bind('mousedown', Sawbuck.Utilities.createDelegate(this, this.mousedownLeft)); this._thumbs.right.bind('mousedown', Sawbuck.Utilities.createDelegate(this, this.mousedownRight)); this._thumbs.left.bind('dblclick', Sawbuck.Utilities.createDelegate(this, this.doubleClickLeft)); this._thumbs.right.bind('dblclick', Sawbuck.Utilities.createDelegate(this, this.doubleClickRight)); this._base.bind('mousedown', Sawbuck.Utilities.createDelegate(this, this.mousedownBase)); }
Sawbuck.Slider.prototype = { updateLabels: function() { this._labelElements.left.text(this._labels[this._index.left]); this._labelElements.right.text(this._labels[this._index.right]); }, resetThumbs: function(values, bCallUpdate) {
	if (values) {
		if (values.left && values.left == this._leftMax) { this._index.left = this._valueCount; }
		else
			this._index.left = (values.left) ? this.getIndex(values.left) : 0; if (values.right !== undefined && values.right == this._rightMin) { this._index.right = 0; }
		else
			this._index.right = (values.right !== undefined) ? this.getIndex(values.right) : this._valueCount;
	}
	else { this._index.left = 0; this._index.right = this._valueCount; }
	this._position.left = Math.round(this._index.left * (this._sliderSpace / this._valueCount)); this._position.right = Math.round(this._index.right * (this._sliderSpace / this._valueCount)); if (this._index.left == this._index.right) { if (this._index.left == 0) { this._position.right += (this._size.thumb / 2); } else if (this._index.left == this._valueCount) { this._position.left -= (this._size.thumb / 2); } else { this._position.left -= Math.round(this._size.thumb / 4); this._position.right += Math.round(this._size.thumb / 4); } }
	this._thumbs.left.css('left', this._position.left + 'px'); this._thumbs.right.css('left', this._position.right + 'px'); this.updateLabels(); if (bCallUpdate) { this.raise(); } 
}, getIndex: function(value) { for (var x = 0; x <= this._valueCount; x++) { if (this._values[x] == value) { return x; } } }, load: function(args) { this.resetThumbs({ left: args.value[0], right: args.value[1] }); }, addHandler: function(eventHandler) { this._eventHandlers.push(eventHandler); }, raise: function(args) { var left = (this._index.left == this._valueCount && this._leftMax) ? this._leftMax : this._values[this._index.left]; var right = (this._index.right == 0 && this._rightMin) ? this._rightMin : this._values[this._index.right]; for (var i = 0; i < this._eventHandlers.length; i++) { this._eventHandlers[i]({ property: this._property, value: [left, right], resetFields: this._resetFields }); } }, mousedownLeft: function(e) { this._mouseOffset = e.clientX; this._positionNew.left = this._position.left; $j(document).bind('mousemove', this._mousemoveLeftHandler); $j(document).bind('mouseup', this._mouseupLeftHandler); return false; }, mousemoveLeft: function(e) {
	var delta = e.clientX - this._mouseOffset; this._isMoved = true; this._positionNew.left = this._position.left + delta; if (this._positionNew.left < 0) { this._positionNew.left = 0; }
	this._indexNew.left = Math.round(this._positionNew.left / (this._sliderSpace / this._valueCount)); this._positionNew.left = Math.round(this._indexNew.left * (this._sliderSpace / this._valueCount)); if (this._indexNew.left >= this._index.right) { this._indexNew.left = this._index.right; this._positionNew.left = this._position.right - (this._size.thumb / 2); }
	this._thumbs.left.css('left', this._positionNew.left + 'px'); this._labelElements.left.text(this._labels[this._indexNew.left]); return false;
}, mouseupLeft: function(e) {
	$j(document).unbind('mousemove', this._mousemoveLeftHandler); $j(document).unbind('mouseup', this._mouseupLeftHandler); if (this._isMoved) {
		this._position.left = this._positionNew.left; if (this._index.left !== this._indexNew.left) { this._index.left = this._indexNew.left; this.raise(); }
		this._isMoved = false;
	}
	return false;
}, doubleClickLeft: function(e) {
	if (this._index.left !== 0) { this.resetThumbs({ 'left': this._values[0], 'right': this._values[this._index.right] }, true); }
	return false;
}, mousedownRight: function(e) { this._mouseOffset = e.clientX; this._positionNew.right = this._position.right; $j(document).bind('mousemove', this._mousemoveRightHandler); $j(document).bind('mouseup', this._mouseupRightHandler); return false; }, mousemoveRight: function(e, args) {
	var delta = e.clientX - this._mouseOffset; this._isMoved = true; this._positionNew.right = this._position.right + delta; if (this._positionNew.right > this._sliderSpace) { this._positionNew.right = this._sliderSpace; }
	this._indexNew.right = Math.round(this._positionNew.right / (this._sliderSpace / this._valueCount)); this._positionNew.right = Math.round(this._indexNew.right * (this._sliderSpace / this._valueCount)); if (this._indexNew.right <= this._index.left) { this._indexNew.right = this._index.left; this._positionNew.right = this._position.left + (this._size.thumb / 2); }
	this._thumbs.right.css('left', this._positionNew.right + 'px'); this._labelElements.right.text(this._labels[this._indexNew.right]); return false;
}, mouseupRight: function(e) {
	$j(document).unbind('mousemove', this._mousemoveRightHandler); $j(document).unbind('mouseup', this._mouseupRightHandler); if (this._isMoved) {
		this._position.right = this._positionNew.right; if (this._index.right !== this._indexNew.right) { this._index.right = this._indexNew.right; this.raise(); }
		this._isMoved = false;
	}
	return false;
}, doubleClickRight: function(e, args) {
	if (this._index.right !== this._valueCount) { this.resetThumbs({ 'left': this._values[this._index.left], 'right': this._values[this._valueCount] }, true); }
	return false;
}, mousedownBase: function(e) {
	var clickX = e.clientX - this._base.offset().left + 1; var center = ((this._position.left + this._size.thumb) + (this._position.right + 1)) / 2; if (clickX < center) {
		this._positionNew.left = clickX - (this._size.thumb / 2); if (this._positionNew.left < 0) { this._positionNew.left = 0; }
		this._indexNew.left = Math.round(this._positionNew.left / (this._sliderSpace / this._valueCount)); this._positionNew.left = Math.round(this._indexNew.left * (this._sliderSpace / this._valueCount)); if (this._indexNew.left >= this._index.right) { this._indexNew.left = this._index.right; this._positionNew.left = this._position.right - (this._size.thumb / 2); }
		this._thumbs.left.css('left', this._positionNew.left + 'px'); this._labelElements.left.text(this._labels[this._indexNew.left]); this._position.left = this._positionNew.left; if (this._index.left !== this._indexNew.left) { this._index.left = this._indexNew.left; this.raise(); } 
	} else {
		this._positionNew.right = clickX - 6; if (this._positionNew.right > this._sliderSpace) { this._positionNew.right = this._sliderSpace; }
		this._indexNew.right = Math.round(this._positionNew.right / (this._sliderSpace / this._valueCount)); this._positionNew.right = Math.round(this._indexNew.right * (this._sliderSpace / this._valueCount)); if (this._indexNew.right <= this._index.left) { this._indexNew.right = this._index.left; this._positionNew.right = this._position.left + (this._size.thumb / 2); }
		this._thumbs.right.css('left', this._positionNew.right + 'px'); this._labelElements.right.text(this._labels[this._indexNew.right]); this._position.right = this._positionNew.right; if (this._index.right !== this._indexNew.right) { this._index.right = this._indexNew.right; this.raise(); } 
	}
	return false;
} 
}
