The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

// version: 2017-11-25
/**
* o--------------------------------------------------------------------------------o
* | This file is part of the RGraph package - you can learn more at: |
* | |
* | |
* | RGraph is licensed under the Open Source MIT license. That means that it's |
* | totally free to use and there are no restrictions on what you can do with it! |
* o--------------------------------------------------------------------------------o
*/
/**
* This is a library of a few functions that make it easier to do
* effects like fade-ins or eaxpansion.
*/
/**
* Initialise the various objects
*/
RGraph = window.RGraph || {isRGraph: true};
RGraph.SVG = RGraph.SVG || {};
RGraph.SVG.FX = RGraph.SVG.FX || {};
// Module pattern
(function (win, doc, undefined)
{
var RG = RGraph,
ua = navigator.userAgent,
ma = Math;
/**
* This functions adds the generic effects to thechart object
*
* @param object obj The chart object
*/
RG.SVG.FX.decorate = function (obj)
{
for (i in RG.SVG.FX) {
if (typeof RG.SVG.FX[i] === 'function') {
obj[i] = RG.SVG.FX[i];
}
}
};
/**
* fadeIn
*
* This function simply uses the CSS opacity property - initially set to zero and
* increasing to 1 over the period of 0.5 second
*/
RG.SVG.FX.fadein = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {};
// Initially the opacity should be zero
obj.svg.style.opacity = 0;
// Draw the chart
RG.SVG.redraw(this.svg);
// Now fade the chart in
for (var i=1; i<=frames; ++i) {
(function (index)
{
setTimeout(function ()
{
obj.svg.style.opacity = (index / frames);
if (index >= frames) {
callback(obj);
}
}, (index / frames) * duration);
})(i)
}
return this;
};
/**
* fadeOut
*
* This function is a reversal of the above function - fading out instead of in
*/
RG.SVG.FX.fadeout = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {};
//RG.SVG.redraw()
// Now fade the chart out
for (var i=1; i<=frames; ++i) {
(function (index)
{
setTimeout(function ()
{
obj.svg.style.opacity = 1 - (index / frames);
if (index >= frames) {
callback(obj);
}
}, (index / frames) * duration);
})(i)
}
return this;
};
/**
* fadeSlideIn
*
* This function fades the canvas in in a sliding motion
*/
RG.SVG.FX.fadeslidein = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
frame = 0,
pc = -20,
step = (120 - pc) / frames,
color = opt.color || 'white',
width = this.container.offsetWidth,
height = this.container.offsetHeight,
callback = opt.callback || function () {};
// Draw the chart
RG.SVG.redraw(this.svg);
// Create the cover
$('<div id="rgraph_fadeslide_cover_' + obj.id + '"></div>').css({
background: 'linear-gradient(135deg, rgba(255,255,255,0) ' + pc + '%, ' + color + ' ' + (pc + 20) + '%)',
width: width + 'px',
height: height + 'px',
top: 0,
left: 0,
position: 'absolute'
}).appendTo($(this.container));
function iterator ()
{
if (pc < 120) {
$('div#rgraph_fadeslide_cover_' + obj.id).css({
background: 'linear-gradient(135deg, rgba(255,255,255,0) ' + pc + '%, ' + color + ' ' + (pc + 20) + '%)'
});
pc += step;
RG.SVG.FX.update(iterator);
} else {
$('div#rgraph_fadeslide_cover_' + obj.id).remove();
callback(obj);
}
}
iterator();
return this;
};
//
// fadeSlideOut
//
// Fades the canvas out in a sliding motion. This function gets added
// to the chart object - so the this variable is the chart object
//
RG.SVG.FX.fadeslideout = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
frame = 0,
pc = -20,
step = (120 - pc) / frames,
canvasXY = RG.SVG.getSVGXY(obj.svg),
color = opt.color || 'white',
width = this.container.offsetWidth,
height = this.container.offsetHeight,
callback = opt.callback || function () {};
// Draw the chart
//RG.SVG.redraw(this.svg);
// Create the cover
$('<div id="rgraph_fadeslide_cover_' + obj.id + '"></div>').css({
background: 'linear-gradient(135deg, ' + color + ' ' + pc + '%, rgba(255,255,255,0) ' + (pc + 20) + '%)',
width: width + 'px',
height: height + 'px',
top: 0,
left: 0,
position: 'absolute'
}).appendTo($(obj.svg.parentNode));
function iterator ()
{
if (pc < 120) {
$('div#rgraph_fadeslide_cover_' + obj.id).css({
background: 'linear-gradient(135deg, ' + color + ' ' + pc + '%, rgba(255,255,255,0) ' + (pc + 20) + '%)'
});
pc += step;
RG.SVG.FX.update(iterator);
} else {
RG.SVG.clear(obj.svg);
$('div#rgraph_fadeslide_cover_' + obj.id).remove();
callback(obj);
}
}
iterator();
return this;
};
//
// fadeCircularIn
//
// This function uses radial CSS gradients to cover the canvas with a radial fade in effect
// (from the center outwards)
//
RG.SVG.FX.fadecircularinoutwards = function ()
{
// This function gets added to the chart object - so the 'this'
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
frame = 1,
radius = 0,
svgXY = RG.SVG.getSVGXY(obj.svg),
color = opt.color || 'white',
callback = opt.callback || function () {};
// Draw the chart
RG.SVG.redraw(this.svg);
// Create the cover
$('<div id="rgraph_fadecircularinoutwards_cover_' + obj.id + '"></div>').css({
background: 'radial-gradient(rgba(255,255,255,0) 0%, ' + color + ' ' + radius + '%)',
width: this.container.offsetWidth + 'px',
height: this.container.offsetHeight + 'px',
top: 0,
left: 0,
position: 'absolute'
}).appendTo($(obj.svg.parentNode));
function iterator ()
{
if (frame < frames) {
$('div#rgraph_fadecircularinoutwards_cover_' + obj.id).css({
background: 'radial-gradient(rgba(255,255,255,0) ' + ((frame++ / frames) * 100) + '%, ' + color + ' ' + ((frame++ / frames) * 150) + '%)'
});
RG.SVG.FX.update(iterator);
} else {
$('div#rgraph_fadecircularinoutwards_cover_' + obj.id).remove();
callback(obj);
}
}
iterator();
return this;
};
//
// fadecircularoutoutwards
//
// This function uses radial CSS gradients to cover the canvas with a radial fade out effect
// (from the center outwards)
//
RG.SVG.FX.fadecircularoutoutwards = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
frame = 0,
width = this.container.offsetWidth,
height = this.container.offsetHeight,
canvasXY = RG.SVG.getSVGXY(obj.svg),
color = opt.color || 'white',
callback = opt.callback || function () {};
// Draw the chart
//RG.SVG.redraw(this.svg);
// Create the cover
$('<div id="rgraph_fadeslide_cover_' + obj.id + '"></div>').css({
background: 'radial-gradient(rgba(255,255,255,0) 0%, transparent 0%)',
width: width + 'px',
height: height + 'px',
top: 0,
left: 0,
position: 'absolute'
}).appendTo($(obj.svg.parentNode));
function iterator ()
{
if (frame < frames) {
$('div#rgraph_fadeslide_cover_' + obj.id).css({
background: 'radial-gradient(' + color + ' ' + ((frame++ / frames) * 100) + '%, rgba(255,255,255,0) ' + ((frame++ / frames) * 150) + '%)'
});
RG.SVG.FX.update(iterator);
} else {
RG.SVG.clear(obj.svg);
$('div#rgraph_fadeslide_cover_' + obj.id).remove();
callback(obj);
}
}
iterator();
return this;
};
//
// fadeCircularInInwards
//
// This function gets added to the chart object - so the 'this'
// variable is the chart object
//
RG.SVG.FX.fadecircularininwards = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
frame = 0,
radius = ma.max(
obj.container.offsetWidth,
obj.container.offsetHeight
),
color = opt.color || 'white',
callback = opt.callback || function () {};
// Draw the chart
RG.SVG.redraw(this.svg);
// Create the cover
$('<div id="rgraph_fadeslide_cover_' + obj.id + '"></div>').css({
background: 'radial-gradient(rgba(255,255,255,0) 100%, rgba(255,255,255,0) 0%)',
width: this.container.offsetWidth + 'px',
height: this.container.offsetHeight + 'px',
top: 0,
left: 0,
position: 'absolute'
}).appendTo($(obj.svg.parentNode));
function iterator ()
{
if (frame < frames) {
$('div#rgraph_fadeslide_cover_' + obj.id).css({
background: 'radial-gradient(' + color + ' ' + (( (frames - frame++) / frames) * 100) + '%, rgba(255,255,255,0) ' + (( (frames - frame++) / frames) * 120) + '%)'
});
RG.SVG.FX.update(iterator);
} else {
$('div#rgraph_fadeslide_cover_' + obj.id).remove();
callback(obj);
}
}
iterator();
return this;
};
//
// fadecircularoutinwards
//
// This function gets added to the chart object - so the this
// variable is the chart object
//
RG.SVG.FX.fadecircularoutinwards = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
frame = 0,
radius = ma.max(
this.container.offsetWidth,
this.container.offsetHeight
),
color = opt.color || 'white',
callback = opt.callback || function () {};
// Draw the chart
//RG.SVG.redraw(this.svg);
// Create the cover
$('<div id="rgraph_fadeslide_cover_' + this.id + '"></div>').css({
background: 'radial-gradient(rgba(255,255,255,0) 0%, rgba(255,255,255,0) 0%)',
width: this.container.offsetWidth + 'px',
height: this.container.offsetHeight + 'px',
top: 0,
left: 0,
position: 'absolute'
}).appendTo($(obj.svg.parentNode));
function iterator ()
{
if (frame < frames) {
$('div#rgraph_fadeslide_cover_' + obj.id).css({
background: 'radial-gradient(rgba(255,255,255,0) ' + (( (frames - frame++) / frames) * 100) + '%, ' + color + ' ' + (( (frames - frame++) / frames) * 120) + '%)'
});
RG.SVG.FX.update(iterator);
} else {
RG.SVG.clear(obj.svg);
$('div#rgraph_fadeslide_cover_' + obj.id).remove();
callback(obj);
}
}
iterator();
return this;
};
//
// Reveal
//
// With this effect the chart is slowly revealed from the centre outwards. This
// function gets added to the chart object - so the 'this' variable is the chart
// object
//
// @param object Options for the effect. You can give frames here
// @param function An optional callback function
//
RG.SVG.FX.reveal = function ()
{
var obj = this,
opt = arguments[0] || {}
color = opt.color || 'white',
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
callback = opt.callback || function () {}
var divs = [
['rgraph_reveal_left_' + this.id, 0, 0, this.container.offsetWidth / 2, this.container.offsetHeight],
['rgraph_reveal_right_' + this.id,(this.container.offsetWidth / 2),0,(this.container.offsetWidth / 2),this.container.offsetHeight],
['rgraph_reveal_top_' + this.id,0,0,this.container.offsetWidth,(this.container.offsetHeight / 2)],
['rgraph_reveal_bottom_' + this.id,0,(this.container.offsetHeight / 2),this.container.offsetWidth,(this.container.offsetHeight / 2)]
];
for (var i=0,len=divs.length; i<len; ++i) {
var div = doc.createElement('DIV');
div.id = divs[i][0];
div.style.left = divs[i][1] + 'px';
div.style.top = divs[i][2] + 'px';
div.style.width = divs[i][3] + 'px';
div.style.height = divs[i][4] + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
}
// Redraw
RG.SVG.redraw(obj.svg);
// Animate the shrinking of the DIVs
jQuery('#rgraph_reveal_left_' + obj.id).animate({width: 0}, duration);
jQuery('#rgraph_reveal_right_' + obj.id).animate({left: '+=' + (this.container.offsetWidth / 2),width: 0}, duration);
jQuery('#rgraph_reveal_top_' + obj.id).animate({height: 0}, duration);
jQuery('#rgraph_reveal_bottom_' + obj.id).animate({top: '+=' + (this.container.offsetHeight / 2),height: 0}, duration);
// Remove the DIVs from the DOM 100ms after the animation ends
setTimeout(function ()
{
obj.container.removeChild(doc.getElementById("rgraph_reveal_top_" + obj.id));
obj.container.removeChild(doc.getElementById("rgraph_reveal_bottom_" + obj.id));
obj.container.removeChild(doc.getElementById("rgraph_reveal_left_" + obj.id));
obj.container.removeChild(doc.getElementById("rgraph_reveal_right_" + obj.id));
callback(obj);
}, duration);
return this;
};
//
// Conceal
//
// This effect is the reverse of the Reveal effect - instead of revealing
// the canvas it conceals it. Combined with the reveal effect would make
// for a nice wipe effect.
//
// @param object obj The chart object
///
RG.SVG.FX.conceal = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
callback = opt.callback || function () {},
color = opt.color || 'white',
duration = (frames / 60) * 1000,
frame = 0;
var divs = [
['rgraph_conceal_left_' + obj.id, 0, 0, 0, this.container.offsetHeight],
['rgraph_conceal_right_' + obj.id,this.container.offsetWidth,0,0,this.container.offsetHeight],
['rgraph_conceal_top_' + obj.id,0,0,this.container.offsetWidth,0],
['rgraph_conceal_bottom_' + obj.id,0,this.container.offsetHeight,this.container.offsetWidth,0]
];
for (var i=0,len=divs.length; i<len; ++i) {
var div = doc.createElement('DIV');
div.id = divs[i][0];
div.style.left = divs[i][1] + 'px';
div.style.top = divs[i][2] + 'px';
div.style.width = divs[i][3] + 'px';
div.style.height = divs[i][4] + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
}
jQuery('#rgraph_conceal_left_' + obj.id).animate({width: '+=' + (this.container.offsetWidth / 2)}, duration);
jQuery('#rgraph_conceal_right_' + obj.id).animate({left: '-=' + (this.container.offsetWidth / 2),width: (this.container.offsetWidth / 2)}, duration);
jQuery('#rgraph_conceal_top_' + obj.id).animate({height: '+=' + (this.container.offsetHeight / 2)}, duration);
jQuery('#rgraph_conceal_bottom_' + obj.id).animate({top: '-=' + (this.container.offsetHeight / 2),height: (this.container.offsetHeight / 2)}, duration);
// Remove the DIVs from the DOM 100ms after the animation ends
setTimeout(
function ()
{
obj.container.removeChild(doc.getElementById("rgraph_conceal_top_" + obj.id));
obj.container.removeChild(doc.getElementById("rgraph_conceal_bottom_" + obj.id));
obj.container.removeChild(doc.getElementById("rgraph_conceal_left_" + obj.id));
obj.container.removeChild(doc.getElementById("rgraph_conceal_right_" + obj.id));
RG.SVG.clear(obj.svg);
callback(obj);
},
duration
);
return this;
};
//
// Horizontal Blinds (open)
//
// @params object obj The graph object
//
RG.SVG.FX.hblindsopen = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
height = this.container.offsetHeight / 5;
//
// First draw the chart
//
RG.SVG.redraw(this.svg);
for (var i=0; i<5; ++i) {
var div = doc.createElement('DIV');
div.id = 'rgraph_hblinds_' + i + '_' + obj.id;
div.style.left = 0;
div.style.top = ((this.container.offsetHeight * (i / 5))) + 'px';
div.style.width = this.container.offsetWidth + 'px';
div.style.height = (this.container.offsetHeight / 5) + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
jQuery('#rgraph_hblinds_' + i + '_' + obj.id).animate({height: 0}, duration);
}
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_0_' + obj.id));}, duration);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_1_' + obj.id));}, duration);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_2_' + obj.id));}, duration);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_3_' + obj.id));}, duration);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_4_' + obj.id));}, duration);
setTimeout(function () {callback(obj);}, duration);
return this;
};
//
// Horizontal Blinds (close)
//
// This function gets added to the chart object - so the this
// variable is the chart object
//
// @params object obj The graph object
//
RG.SVG.FX.hblindsclose = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color = 'white',
height = this.container.offsetHeight / 5;
for (var i=0; i<5; ++i) {
var div = doc.createElement('DIV');
div.id = 'rgraph_hblinds_' + i + '_' + obj.id;
div.style.left = 0;
div.style.top = (this.container.offsetHeight * (i / 5)) + 'px';
div.style.width = this.container.offsetWidth + 'px';
div.style.height = 0;
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
jQuery('#rgraph_hblinds_' + i + '_' + obj.id)
.animate({
height: height + 'px'
}, duration);
}
setTimeout(function () {RG.SVG.clear(obj.svg);}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_0_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_1_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_2_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_3_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_hblinds_4_' + obj.id));}, duration + 100);
setTimeout(function () {callback(obj);}, duration + 100);
};
//
// Vertical Blinds (open)
//
// @params object obj The graph object
//
// This function gets added to the chart object - so the this
// variable is the chart object
RG.SVG.FX.vblindsopen = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
width = this.container.offsetWidth / 10;
//
// First draw the chart
//
RG.SVG.redraw(obj.svg);
for (var i=0; i<10; ++i) {
var div = doc.createElement('DIV');
div.id = 'rgraph_vblinds_' + i + '_' + obj.id;
div.style.width = width + 'px';
div.style.height = this.container.offsetHeight + 'px';
div.style.left = (this.container.offsetWidth * (i / 10)) + 'px';
div.style.top = 0;
div.style.position = 'absolute';
div.style.backgroundColor = color;
obj.container.appendChild(div);
jQuery('#rgraph_vblinds_' + i + '_' + obj.id).animate({width: 0}, duration);
}
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_0_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_1_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_2_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_3_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_4_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_5_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_6_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_7_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_8_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_9_' + obj.id));}, duration + 100);
setTimeout(function () {callback(obj);}, duration + 100);
return this;
};
//
// Vertical Blinds (close)
//
// This function gets added to the chart object - so the this
// variable is the chart object
//
// @params object obj The graph object
//
RG.SVG.FX.vblindsclose = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
width = this.container.offsetWidth / 10;
// Create the blinds
for (var i=0; i<10; ++i) {
var div = doc.createElement('DIV');
div.id = 'rgraph_vblinds_' + i + '_' + obj.id;
div.style.left = (this.container.offsetWidth * (i / 10)) + 'px';
div.style.top = 0;
div.style.width = 0;
div.style.height = this.container.offsetHeight + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
jQuery('#rgraph_vblinds_' + i + '_' + obj.id).animate({width: width}, duration);
}
setTimeout(function () {RG.SVG.clear(obj.svg);}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_0_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_1_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_2_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_3_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_4_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_5_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_6_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_7_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_8_' + obj.id));}, duration + 100);
setTimeout(function () {obj.container.removeChild(doc.getElementById('rgraph_vblinds_9_' + obj.id));}, duration + 100);
setTimeout(function () {callback(obj);}, duration + 100);
return this;
};
//
// Slide in
//
// This function is a wipe that can be used when switching the canvas to a
// new graph
//
// This function gets added to the chart object - so the this
// variable is the chart object
//
// @param object obj The graph object
//
RG.SVG.FX.slidein = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
width = this.container.offsetWidth / 10,
from = opt.from || 'left';
this.container.style.overflow = 'hidden';
RG.SVG.redraw(this.svg);
this.svg.style.position = 'relative';
if (from == 'left') {
this.svg.style.left = (0 - this.container.offsetWidth) + 'px';
this.svg.style.top = 0;
} else if (from == 'top') {
this.svg.style.left = 0;
this.svg.style.top = (0 - this.container.offsetHeight) + 'px';
} else if (from == 'bottom') {
this.svg.style.left = 0;
this.svg.style.top = this.container.offsetHeight + 'px';
} else {
this.svg.style.left = this.container.offsetWidth + 'px';
this.svg.style.top = 0;
}
jQuery(this.svg).animate({left:0,top:0}, duration, function ()
{
callback(obj);
});
return this;
};
//
// Slide out
//
// This function is a wipe that can be used when switching the canvas to a new graph
//
// @param object Optional object containing configuration.
// @param function Optional callback function
//
RG.SVG.FX.slideout = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var opt = arguments[0] || {},
frames = opt.frames || 90,
color = opt.color || 'white',
to = opt.to || 'left',
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
width = this.container.offetsWidth / 10;
this.container.style.overflow= 'hidden';
this.svg.style.position = 'relative';
this.svg.style.left = 0;
this.svg.style.top = 0;
if (to == 'left') {
jQuery(this.svg).animate({left: (0 - this.container.offsetWidth) + 'px'}, duration, function () {callback(this);});
} else if (to == 'top') {
jQuery(this.svg).animate({left: 0, top: (0 - this.container.offsetHeight) + 'px'}, duration, function () {callback(this);});
} else if (to == 'bottom') {
jQuery(this.svg).animate({top: (0 + this.container.offsetHeight) + 'px'}, duration, function () {callback(this);});
} else {
jQuery(this.svg).animate({left: (0 + this.container.offsetWidth) + 'px'}, duration, function () {callback(this);});
}
return this;
};
//
// Horizontal Scissors (open)
//
// This function gets added to the chart object - so the this
// variable is the chart object
//
// @param object Optional array of options
// @param function Optional callback function
//
//
RG.SVG.FX.hscissorsopen = function ()
{
var opt = arguments[0] || {},
obj = this,
frames = opt.frames || 90,
callback = opt.callback || function () {},
color = opt.color || 'white',
to = opt.to || 'left',
frame = 0,
duration = (frames / 60) * 1000,
width = this.container.offsetWidth / 10,
height = this.container.offsetHeight / 5;
//
// First draw the chart
//
RG.SVG.redraw(this.svg);
for (var i=0; i<5; ++i) {
var div = doc.getElementById("rgraph_hscissors_" + i + '_' + this.id)
if (!div) {
var div = doc.createElement('DIV');
div.id = 'rgraph_hscissors_' + i + '_' + this.id;
div.style.width = this.container.offsetWidth + 'px';
div.style.height = (this.container.offsetHeight / 5) + 'px';
div.style.left = 0;
div.style.top = (this.container.offsetHeight * (i / 5)) + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
}
if (i % 2 == 0) {
jQuery('#' + 'rgraph_hscissors_' + i + '_' + this.id).animate({left: this.container.offsetWidth + 'px', width: 0}, duration);
} else {
jQuery('#' + 'rgraph_hscissors_' + i + '_' + this.id).animate({width: 0}, duration);
}
}
setTimeout(function ()
{
obj.container.removeChild(doc.getElementById('rgraph_hscissors_0_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_hscissors_1_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_hscissors_2_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_hscissors_3_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_hscissors_4_' + obj.id));
callback(obj);
}, duration);
return this;
};
//
// Horizontal Scissors (Close)
//
// This function gets added to the chart object - so the this
// variable is the chart object
//
// @param @object Optional object of options
// @param function Optional callback function
//
//
RG.SVG.FX.hscissorsclose = function ()
{
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 60,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
height = this.container.offsetHeight / 5;
for (var i=0; i<5; ++i) {
var div = doc.createElement('DIV');
div.id = 'rgraph_hscissors_' + i + '_' + this.id;
div.style.width = 0;
div.style.height = height + 'px';
div.style.left = (i % 2 == 0 ? this.container.offsetWidth : 0) + 'px';
div.style.top = (this.container.offsetHeight * (i / 5)) + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
if (i % 2 == 0) {
jQuery('#' + 'rgraph_hscissors_' + i + '_' + this.id).animate({left: 0, width: this.container.offsetWidth + 'px'}, duration);
} else {
jQuery('#' + 'rgraph_hscissors_' + i + '_' + this.id).animate({width: this.container.offsetWidth + 'px'}, duration);
}
}
setTimeout(function ()
{
RG.SVG.clear(obj.svg);
jQuery('#' + 'rgraph_hscissors_' + 0 + '_' + obj.id).remove();
jQuery('#' + 'rgraph_hscissors_' + 1 + '_' + obj.id).remove();
jQuery('#' + 'rgraph_hscissors_' + 2 + '_' + obj.id).remove();
jQuery('#' + 'rgraph_hscissors_' + 3 + '_' + obj.id).remove();
jQuery('#' + 'rgraph_hscissors_' + 4 + '_' + obj.id).remove();
callback(obj);
}, duration);
return this;
};
//
// Vertical Scissors (open)
//
// @param @object Optional An object of options. It can consist of:
// o color - The color of the scissors. The default is white
// o frames - Number of animation frames in the effect. Default
// is 60
// o callback - A function that's called when the effect is
// finished
//
RG.SVG.FX.vscissorsopen = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
width = this.container.offsetWidth / 10;
//
// First (re)draw the chart
//
RG.SVG.redraw(this.svg);
for (var i=0; i<10; ++i) {
var div = doc.getElementById("rgraph_vscissors_" + i + '_' + this.id);
if (!div) {
var div = doc.createElement('DIV');
div.id = 'rgraph_vscissors_' + i + '_' + this.id;
div.style.width = width + 'px';
div.style.height = this.container.offsetHeight + 'px';
div.style.left = this.container.offsetWidth * (i / 10) + 'px';
div.style.top = 0;
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
}
if (i % 2 == 0) {
jQuery('#' + 'rgraph_vscissors_' + i + '_' + this.id).animate({top: this.container.offsetHeight + 'px', height: 0}, duration);
} else {
jQuery('#' + 'rgraph_vscissors_' + i + '_' + this.id).animate({height: 0}, duration);
}
}
setTimeout(function ()
{
obj.container.removeChild(doc.getElementById('rgraph_vscissors_0' + '_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_vscissors_1' + '_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_vscissors_2' + '_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_vscissors_3' + '_' + obj.id));
obj.container.removeChild(doc.getElementById('rgraph_vscissors_4' + '_' + obj.id));
callback(obj);
}, duration);
return this;
};
//
// Vertical Scissors (close)
//
RG.SVG.FX.vscissorsclose = function ()
{
// This function gets added to the chart object - so the this
// variable is the chart object
var obj = this,
opt = arguments[0] || {},
frames = opt.frames || 90,
duration = (frames / 60) * 1000,
frame = 0,
callback = opt.callback || function () {},
color = opt.color || 'white',
width = this.container.offsetWidth / 10;
for (var i=0; i<10; ++i) {
var div = doc.getElementById("rgraph_vscissors_" + i + '_' + this.id)
if (!div) {
var div = doc.createElement('DIV');
div.id = 'rgraph_vscissors_' + i + '_' + this.id;
div.style.width = width + 'px';
div.style.height = 0;
div.style.left = (width * i) + 'px';
div.style.top = (i % 2 == 0 ? this.container.offsetHeight : 0) + 'px';
div.style.position = 'absolute';
div.style.backgroundColor = color;
this.container.appendChild(div);
}
if (i % 2 == 0) {
jQuery('#' + 'rgraph_vscissors_' + i + '_' + this.id).animate({top: 0, height: this.container.offsetHeight + 'px'}, duration);
} else {
jQuery('#' + 'rgraph_vscissors_' + i + '_' + this.id).animate({height: this.container.offsetHeight + 'px'}, duration);
}
}
setTimeout(function ()
{
RG.SVG.clear(obj.svg);
for (var i=0; i<10; i++) {
jQuery('#rgraph_vscissors_' + i + '_' + obj.id).remove();
}
callback(obj);
}, duration);
return this;
};
// End Module pattern
})(window, document);