%PDF- %PDF-
| Direktori : /home/riacommer/public_html/admin/vendor/rickshaw/src/js/ |
| Current File : /home/riacommer/public_html/admin/vendor/rickshaw/src/js/Rickshaw.Graph.RangeSlider.Preview.js |
Rickshaw.namespace('Rickshaw.Graph.RangeSlider.Preview');
Rickshaw.Graph.RangeSlider.Preview = Rickshaw.Class.create({
initialize: function(args) {
if (!args.element) throw "Rickshaw.Graph.RangeSlider.Preview needs a reference to an element";
if (!args.graph && !args.graphs) throw "Rickshaw.Graph.RangeSlider.Preview needs a reference to an graph or an array of graphs";
this.element = args.element;
this.element.style.position = 'relative';
this.graphs = args.graph ? [ args.graph ] : args.graphs;
this.defaults = {
height: 75,
width: 400,
gripperColor: undefined,
frameTopThickness: 3,
frameHandleThickness: 10,
frameColor: "#d4d4d4",
frameOpacity: 1,
minimumFrameWidth: 0,
heightRatio: 0.2
};
this.heightRatio = args.heightRatio || this.defaults.heightRatio;
this.defaults.gripperColor = d3.rgb(this.defaults.frameColor).darker().toString();
this.configureCallbacks = [];
this.slideCallbacks = [];
this.previews = [];
if (!args.width) this.widthFromGraph = true;
if (!args.height) this.heightFromGraph = true;
if (this.widthFromGraph || this.heightFromGraph) {
this.graphs[0].onConfigure(function () {
this.configure(args); this.render();
}.bind(this));
}
args.width = args.width || this.graphs[0].width || this.defaults.width;
args.height = args.height || this.graphs[0].height * this.heightRatio || this.defaults.height;
this.configure(args);
this.render();
},
onSlide: function(callback) {
this.slideCallbacks.push(callback);
},
onConfigure: function(callback) {
this.configureCallbacks.push(callback);
},
configure: function(args) {
this.config = this.config || {};
this.configureCallbacks.forEach(function(callback) {
callback(args);
});
Rickshaw.keys(this.defaults).forEach(function(k) {
this.config[k] = k in args ? args[k]
: k in this.config ? this.config[k]
: this.defaults[k];
}, this);
if ('width' in args || 'height' in args) {
if (this.widthFromGraph) {
this.config.width = this.graphs[0].width;
}
if (this.heightFromGraph) {
this.config.height = this.graphs[0].height * this.heightRatio;
this.previewHeight = this.config.height;
}
this.previews.forEach(function(preview) {
var height = this.previewHeight / this.graphs.length - this.config.frameTopThickness * 2;
var width = this.config.width - this.config.frameHandleThickness * 2;
preview.setSize({ width: width, height: height });
if (this.svg) {
var svgHeight = height + this.config.frameHandleThickness * 2;
var svgWidth = width + this.config.frameHandleThickness * 2;
this.svg.style("width", svgWidth + "px");
this.svg.style("height", svgHeight + "px");
}
}, this);
}
},
render: function() {
var self = this;
this.svg = d3.select(this.element)
.selectAll("svg.rickshaw_range_slider_preview")
.data([null]);
this.previewHeight = this.config.height - (this.config.frameTopThickness * 2);
this.previewWidth = this.config.width - (this.config.frameHandleThickness * 2);
this.currentFrame = [0, this.previewWidth];
var buildGraph = function(parent, index) {
var graphArgs = Rickshaw.extend({}, parent.config);
var height = self.previewHeight / self.graphs.length;
var renderer = parent.renderer.name;
Rickshaw.extend(graphArgs, {
element: this.appendChild(document.createElement("div")),
height: height,
width: self.previewWidth,
series: parent.series,
renderer: renderer
});
var graph = new Rickshaw.Graph(graphArgs);
self.previews.push(graph);
parent.onUpdate(function() { graph.render(); self.render() });
parent.onConfigure(function(args) {
// don't propagate height
delete args.height;
args.width = args.width - self.config.frameHandleThickness * 2;
graph.configure(args);
graph.render();
});
graph.render();
};
var graphContainer = d3.select(this.element)
.selectAll("div.rickshaw_range_slider_preview_container")
.data(this.graphs);
var translateCommand = "translate(" +
this.config.frameHandleThickness + "px, " +
this.config.frameTopThickness + "px)";
graphContainer.enter()
.append("div")
.classed("rickshaw_range_slider_preview_container", true)
.style("-webkit-transform", translateCommand)
.style("-moz-transform", translateCommand)
.style("-ms-transform", translateCommand)
.style("transform", translateCommand)
.each(buildGraph);
graphContainer.exit()
.remove();
// Use the first graph as the "master" for the frame state
var masterGraph = this.graphs[0];
var domainScale = d3.scale.linear()
.domain([0, this.previewWidth])
.range(masterGraph.dataDomain());
var currentWindow = [masterGraph.window.xMin, masterGraph.window.xMax];
this.currentFrame[0] = currentWindow[0] === undefined ?
0 : Math.round(domainScale.invert(currentWindow[0]));
if (this.currentFrame[0] < 0) this.currentFrame[0] = 0;
this.currentFrame[1] = currentWindow[1] === undefined ?
this.previewWidth : domainScale.invert(currentWindow[1]);
if (this.currentFrame[1] - this.currentFrame[0] < self.config.minimumFrameWidth) {
this.currentFrame[1] = (this.currentFrame[0] || 0) + self.config.minimumFrameWidth;
}
this.svg.enter()
.append("svg")
.classed("rickshaw_range_slider_preview", true)
.style("height", this.config.height + "px")
.style("width", this.config.width + "px")
.style("position", "absolute")
.style("top", 0);
this._renderDimming();
this._renderFrame();
this._renderGrippers();
this._renderHandles();
this._renderMiddle();
this._registerMouseEvents();
},
_renderDimming: function() {
var element = this.svg
.selectAll("path.dimming")
.data([null]);
element.enter()
.append("path")
.attr("fill", "white")
.attr("fill-opacity", "0.7")
.attr("fill-rule", "evenodd")
.classed("dimming", true);
var path = "";
path += " M " + this.config.frameHandleThickness + " " + this.config.frameTopThickness;
path += " h " + this.previewWidth;
path += " v " + this.previewHeight;
path += " h " + -this.previewWidth;
path += " z ";
path += " M " + Math.max(this.currentFrame[0], this.config.frameHandleThickness) + " " + this.config.frameTopThickness;
path += " H " + Math.min(this.currentFrame[1] + this.config.frameHandleThickness * 2, this.previewWidth + this.config.frameHandleThickness);
path += " v " + this.previewHeight;
path += " H " + Math.max(this.currentFrame[0], this.config.frameHandleThickness);
path += " z";
element.attr("d", path);
},
_renderFrame: function() {
var element = this.svg
.selectAll("path.frame")
.data([null]);
element.enter()
.append("path")
.attr("stroke", "white")
.attr("stroke-width", "1px")
.attr("stroke-linejoin", "round")
.attr("fill", this.config.frameColor)
.attr("fill-opacity", this.config.frameOpacity)
.attr("fill-rule", "evenodd")
.classed("frame", true);
var path = "";
path += " M " + this.currentFrame[0] + " 0";
path += " H " + (this.currentFrame[1] + (this.config.frameHandleThickness * 2));
path += " V " + this.config.height;
path += " H " + (this.currentFrame[0]);
path += " z";
path += " M " + (this.currentFrame[0] + this.config.frameHandleThickness) + " " + this.config.frameTopThickness;
path += " H " + (this.currentFrame[1] + this.config.frameHandleThickness);
path += " v " + this.previewHeight;
path += " H " + (this.currentFrame[0] + this.config.frameHandleThickness);
path += " z";
element.attr("d", path);
},
_renderGrippers: function() {
var gripper = this.svg.selectAll("path.gripper")
.data([null]);
gripper.enter()
.append("path")
.attr("stroke", this.config.gripperColor)
.classed("gripper", true);
var path = "";
[0.4, 0.6].forEach(function(spacing) {
path += " M " + Math.round((this.currentFrame[0] + (this.config.frameHandleThickness * spacing))) + " " + Math.round(this.config.height * 0.3);
path += " V " + Math.round(this.config.height * 0.7);
path += " M " + Math.round((this.currentFrame[1] + (this.config.frameHandleThickness * (1 + spacing)))) + " " + Math.round(this.config.height * 0.3);
path += " V " + Math.round(this.config.height * 0.7);
}.bind(this));
gripper.attr("d", path);
},
_renderHandles: function() {
var leftHandle = this.svg.selectAll("rect.left_handle")
.data([null]);
leftHandle.enter()
.append("rect")
.attr('width', this.config.frameHandleThickness)
.style("cursor", "ew-resize")
.style("fill-opacity", "0")
.classed("left_handle", true);
leftHandle
.attr('x', this.currentFrame[0])
.attr('height', this.config.height);
var rightHandle = this.svg.selectAll("rect.right_handle")
.data([null]);
rightHandle.enter()
.append("rect")
.attr('width', this.config.frameHandleThickness)
.style("cursor", "ew-resize")
.style("fill-opacity", "0")
.classed("right_handle", true);
rightHandle
.attr('x', this.currentFrame[1] + this.config.frameHandleThickness)
.attr('height', this.config.height);
},
_renderMiddle: function() {
var middleHandle = this.svg.selectAll("rect.middle_handle")
.data([null]);
middleHandle.enter()
.append("rect")
.style("cursor", "move")
.style("fill-opacity", "0")
.classed("middle_handle", true);
middleHandle
.attr('width', Math.max(0, this.currentFrame[1] - this.currentFrame[0]))
.attr('x', this.currentFrame[0] + this.config.frameHandleThickness)
.attr('height', this.config.height);
},
_registerMouseEvents: function() {
var element = d3.select(this.element);
var drag = {
target: null,
start: null,
stop: null,
left: false,
right: false,
rigid: false
};
var self = this;
function onMousemove(datum, index) {
drag.stop = self._getClientXFromEvent(d3.event, drag);
var distanceTraveled = drag.stop - drag.start;
var frameAfterDrag = self.frameBeforeDrag.slice(0);
var minimumFrameWidth = self.config.minimumFrameWidth;
if (drag.rigid) {
minimumFrameWidth = self.frameBeforeDrag[1] - self.frameBeforeDrag[0];
}
if (drag.left) {
frameAfterDrag[0] = Math.max(frameAfterDrag[0] + distanceTraveled, 0);
}
if (drag.right) {
frameAfterDrag[1] = Math.min(frameAfterDrag[1] + distanceTraveled, self.previewWidth);
}
var currentFrameWidth = frameAfterDrag[1] - frameAfterDrag[0];
if (currentFrameWidth <= minimumFrameWidth) {
if (drag.left) {
frameAfterDrag[0] = frameAfterDrag[1] - minimumFrameWidth;
}
if (drag.right) {
frameAfterDrag[1] = frameAfterDrag[0] + minimumFrameWidth;
}
if (frameAfterDrag[0] <= 0) {
frameAfterDrag[1] -= frameAfterDrag[0];
frameAfterDrag[0] = 0;
}
if (frameAfterDrag[1] >= self.previewWidth) {
frameAfterDrag[0] -= (frameAfterDrag[1] - self.previewWidth);
frameAfterDrag[1] = self.previewWidth;
}
}
self.graphs.forEach(function(graph) {
var domainScale = d3.scale.linear()
.interpolate(d3.interpolateNumber)
.domain([0, self.previewWidth])
.range(graph.dataDomain());
var windowAfterDrag = [
domainScale(frameAfterDrag[0]),
domainScale(frameAfterDrag[1])
];
self.slideCallbacks.forEach(function(callback) {
callback(graph, windowAfterDrag[0], windowAfterDrag[1]);
});
if (frameAfterDrag[0] === 0) {
windowAfterDrag[0] = undefined;
}
if (frameAfterDrag[1] === self.previewWidth) {
windowAfterDrag[1] = undefined;
}
graph.window.xMin = windowAfterDrag[0];
graph.window.xMax = windowAfterDrag[1];
graph.update();
});
}
function onMousedown() {
drag.target = d3.event.target;
drag.start = self._getClientXFromEvent(d3.event, drag);
self.frameBeforeDrag = self.currentFrame.slice();
d3.event.preventDefault ? d3.event.preventDefault() : d3.event.returnValue = false;
d3.select(document).on("mousemove.rickshaw_range_slider_preview", onMousemove);
d3.select(document).on("mouseup.rickshaw_range_slider_preview", onMouseup);
d3.select(document).on("touchmove.rickshaw_range_slider_preview", onMousemove);
d3.select(document).on("touchend.rickshaw_range_slider_preview", onMouseup);
d3.select(document).on("touchcancel.rickshaw_range_slider_preview", onMouseup);
}
function onMousedownLeftHandle(datum, index) {
drag.left = true;
onMousedown();
}
function onMousedownRightHandle(datum, index) {
drag.right = true;
onMousedown();
}
function onMousedownMiddleHandle(datum, index) {
drag.left = true;
drag.right = true;
drag.rigid = true;
onMousedown();
}
function onMouseup(datum, index) {
d3.select(document).on("mousemove.rickshaw_range_slider_preview", null);
d3.select(document).on("mouseup.rickshaw_range_slider_preview", null);
d3.select(document).on("touchmove.rickshaw_range_slider_preview", null);
d3.select(document).on("touchend.rickshaw_range_slider_preview", null);
d3.select(document).on("touchcancel.rickshaw_range_slider_preview", null);
delete self.frameBeforeDrag;
drag.left = false;
drag.right = false;
drag.rigid = false;
}
element.select("rect.left_handle").on("mousedown", onMousedownLeftHandle);
element.select("rect.right_handle").on("mousedown", onMousedownRightHandle);
element.select("rect.middle_handle").on("mousedown", onMousedownMiddleHandle);
element.select("rect.left_handle").on("touchstart", onMousedownLeftHandle);
element.select("rect.right_handle").on("touchstart", onMousedownRightHandle);
element.select("rect.middle_handle").on("touchstart", onMousedownMiddleHandle);
},
_getClientXFromEvent: function(event, drag) {
switch (event.type) {
case 'touchstart':
case 'touchmove':
var touchList = event.changedTouches;
var touch = null;
for (var touchIndex = 0; touchIndex < touchList.length; touchIndex++) {
if (touchList[touchIndex].target === drag.target) {
touch = touchList[touchIndex];
break;
}
}
return touch !== null ? touch.clientX : undefined;
default:
return event.clientX;
}
}
});