/* http://keith-wood.name/gChart.html
Google Chart icons extension for jQuery v1.4.3.
See API details at http://code.google.com/apis/chart/.
Written by Keith Wood (kbwood{at}iinet.com.au) September 2008.
Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
Please attribute the author if you use it. */
(function($) { // Hide scope, no $ conflict
/* Mapping from marker placement names to chart drawing placement codes. */
var PLACEMENTS = {center: 'h', centre: 'h', left: 'l', right: 'r', h: 'h', l: 'l', r: 'r'};
/* Mapping from icon tail names to chart tail codes. */
var TAILS = {bottomLeft: 'bb', topLeft: 'bbtl', topRight: 'bbtr', bottomRight: 'bbbr', none: 'bbT',
bb: 'bb', bbtl: 'bbtl', bbtr: 'bbtr', bbbr: 'bbbr', bbT: 'bbT',
edgeBottomLeft: 'edge_bl', edgeBottomCenter: 'edge_bc', edgeBottomRight: 'edge_br',
edgeTopLeft: 'edge_tl', edgeTopCenter: 'edge_tc', edgeTopRight: 'edge_tr',
edgeLeftTop: 'edge_lt', edgeLeftCenter: 'edge_lc', edgeLeftBottom: 'edge_lb',
edgeRightTop: 'edge_rt', edgeRightCenter: 'edge_rc', edgeRightBottom: 'edge_rb',
edgeBL: 'edge_bl', edgeBC: 'edge_bc', edgeBR: 'edge_br',
edgeTL: 'edge_tl', edgeTC: 'edge_tc', edgeTR: 'edge_tr',
edgeLT: 'edge_lt', edgeLC: 'edge_lc', edgeLB: 'edge_lb',
edgeRT: 'edge_rt', edgeRC: 'edge_rc', edgeRB: 'edge_rb'};
/* Mapping from icon map pin style names to chart map pin style codes. */
var PIN_STYLES = {none: 'pin', star: 'pin_star', left: 'pin_sleft', right: 'pin_sright'};
/* Mapping from icon shadow names to chart icon shadow codes. */
var SHADOWS = {no: '', yes: '_withshadow', only: '_shadow'};
/* Mapping from icon note types to chart icon note codes. */
var NOTES = {arrow: 'arrow_d', balloon: 'balloon', pinned: 'pinned_c',
sticky: 'sticky_y', taped: 'taped_y', thought: 'thought'};
/* Mapping from contextual alignment names to chart drawing alignment codes. */
var ALIGNMENTS = {topLeft: 'lt', top: 'ht', topRight: 'rt', left: 'lv', center: 'hv', centre: 'hv',
right: 'rv', bottomLeft: 'lb', bottom: 'hb', bottomRight: 'rb',
tl: 'lt', lt: 'lt', t: 'ht', ht: 'ht', tr: 'rt', rt: 'rt', l: 'l', lv: 'lv', c: 'hv', hc: 'hv',
hv: 'hv', r: 'rv', rv: 'rv', bl: 'lb', lb: 'lb', b: 'hb', hb: 'hb', br: 'rb', rb: 'rb'};
/* Allowed sizes of icons. */
var SIZES = {12: 12, 16: 16, 24: 24};
/* Mapping from embedded chart alignment names to chart drawing alignment codes. */
var EMBEDDED_ALIGNMENTS = {topLeft: 'tl', top: 'ht', topRight: 'tr', left: 'vl', center: 'hv', centre: 'hv',
right: 'vr', bottomLeft: 'lb', bottom: 'hb', bottomRight: 'rb',
tl: 'tl', t: 'ht', ht: 'ht', tr: 'tr', l: 'vl', vl: 'vl', c: 'hv',
hv: 'hv', r: 'vr', vr: 'vr', bl: 'lb', lb: 'lb', b: 'hb', hb: 'hb', br: 'rb', rb: 'rb'};
$.extend($.gchart._defaults, {
icons: [] // Definitions of dynamic icons for the chart, each entry is an object with
// name (string), data (string), series (number), item (number), zIndex (number),
// position (number[2]), offsets (number[2])
});
$.gchart._chartOptions = $.gchart._chartOptions.join().replace(/Markers/, 'Markers,Icons').split(',');
$.extend($.gchart._prototype.prototype, {
/* Create a dynamic icon definition.
@param name (string) the name of the icon to use
@param data (string) the icon's encoded parameters
@param series (number, optional) the series to which the icon applies, -1 for freestanding
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
icon: function(name, data, series, item, zIndex, position, offsets) {
if ($.isArray(series)) {
offsets = item;
position = series;
zIndex = null;
item = null;
series = null;
}
if ($.isArray(zIndex)) {
offsets = position;
position = zIndex;
zIndex = null;
}
return {name: name, data: data, series: series || 0, item: (item || item == 0 ? item : 'all'),
zIndex: zIndex, position: position, offsets: offsets};
},
/* Create a bubble icon definition.
@param text (string) the text content, use '|' for line breaks
@param image (string, optional) the name of an inset image
@param tail (string, optional) the type of tail to use
@param large (boolean, optional) true if a large bubble is required
@param shadow (string, optional) 'no', 'yes', 'only'
@param bgColour (string, optional) the icon background's colour
@param colour (string, optional) the icon text's colour
@param series (number, optional) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
bubbleIcon: function(text, image, tail, large, shadow, bgColour, colour,
series, item, zIndex, position, offsets) {
if (typeof image == 'boolean') {
offsets = zIndex;
position = item;
zIndex = series;
item = colour;
series = bgColour;
colour = shadow;
bgColour = large;
shadow = tail;
large = image;
tail = null;
image = null;
}
else if (typeof image == 'number') {
offsets = bgColour;
position = shadow;
zIndex = large;
item = tail;
series = image;
colour = null;
bgColour = null;
shadow = null;
large = null;
tail = null;
image = null;
}
if (typeof tail == 'boolean') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = colour;
colour = bgColour;
bgColour = shadow;
shadow = large;
large = tail;
tail = null;
}
else if (typeof tail == 'number') {
offsets = colour;
position = bgColour;
zIndex = shadow;
item = large;
series = tail;
colour = null;
bgColour = null;
shadow = null;
large = null;
tail = null;
}
if (typeof large == 'number') {
offsets = series;
position = colour;
zIndex = bgColour;
item = shadow;
series = large;
colour = null;
bgColour = null;
shadow = null;
large = null;
}
if (typeof shadow == 'number') {
offsets = item;
position = series;
zIndex = colour;
item = bgColour;
series = shadow;
colour = null;
bgColour = null;
shadow = null;
}
if (typeof bgColour == 'number') {
offsets = zIndex;
position = item;
zIndex = series;
item = colour;
series = bgColour;
colour = null;
bgColour = null;
}
if (typeof colour == 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = colour;
colour = null;
}
var multiline = text.match(/\|/);
var colours = this.color(bgColour || 'white') + ',' + this.color(colour || 'black');
var data = (image ? image + ',' : '') + (TAILS[tail] || 'bb') + ',' +
(multiline ? colours + ',' : '') + this._escapeIconText(text) +
(multiline ? '' : ',' + colours);
return this.icon('bubble' + (image ? '_icon' : '') +
(multiline || (!image && large) ? '_texts' : '_text') +
(large || multiline ? '_big' : '_small') + SHADOWS[shadow || 'yes'],
data, series, item, zIndex, position, offsets);
},
/* Create a map pin icon definition.
@param letter (string) the single letter to show
@param image (string, optional) the name of an inset image
@param style (string, optional) '' or 'none', 'star', 'left', 'right'
@param shadow (string, optional) 'no', 'yes', 'only'
@param bgColour (string, optional) the icon background's colour
@param colour (string, optional) the icon text's colour
@param series (number, optional) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
mapPinIcon: function(letter, image, style, shadow, bgColour, colour,
series, item, zIndex, position, offsets) {
if (typeof image == 'number') {
offsets = colour;
position = bgColour;
zIndex = shadow;
item = style;
series = image;
colour = null;
bgColour = null;
shadow = null;
style = null;
image = null;
}
if (typeof style == 'number') {
offsets = series;
position = colour;
zIndex = bgColour;
item = shadow;
series = style;
colour = null;
bgColour = null;
shadow = null;
style = null;
}
if (typeof shadow == 'number') {
offsets = item;
position = series;
zIndex = colour;
item = bgColour;
series = shadow;
colour = null;
bgColour = null;
shadow = null;
}
if (typeof bgColour == 'number') {
offsets = zIndex;
position = item;
zIndex = series;
item = colour;
series = bgColour;
colour = null;
bgColour = null;
}
if (typeof colour == 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = colour;
colour = null;
}
var data = (style ? (PIN_STYLES[style] || 'pin') + ',' : '') +
(image ? image : this._escapeIconText(letter)) + ',' + this.color(bgColour || 'white') +
(image ? '' : ',' + this.color(colour || 'black'));
return this.icon('map_' + (style ? 'x' : '') + 'pin' + (image ? '_icon' : '_letter') +
SHADOWS[shadow || 'yes'], data, series, item, zIndex, position, offsets);
},
/* Create a fun note icon definition.
@param title (string) the note title
@param text (string, optional) the text content, use '|' for line breaks
@param type (string, optional) the type of note to display
@param large (boolean, optional) true if a large note is required
@param alignment (string, optional) 'left', 'right', 'center'
@param colour (string, optional) the icon text's colour
@param series (number, optional) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
noteIcon: function(title, text, type, large, alignment, colour,
series, item, zIndex, position, offsets) {
if (typeof text == 'boolean') {
offsets = zIndex;
position = item;
zIndex = series;
item = colour;
series = alignment;
colour = large;
alignment = type;
large = text;
type = null;
text = null;
}
else if (typeof text == 'number') {
offsets = colour;
position = alignment;
zIndex = large;
item = type;
series = text;
colour = null;
alignment = null;
large = null;
type = null;
text = null;
}
if (typeof type == 'boolean') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = colour;
colour = alignment;
alignment = large;
large = type;
type = null;
}
else if (typeof type == 'number') {
offsets = series;
position = colour;
zIndex = alignment;
item = large;
series = type;
colour = null;
alignment = null;
large = null;
type = null;
}
if (typeof large == 'number') {
offsets = item;
position = series;
zIndex = colour;
item = alignment;
series = large;
colour = null;
alignment = null;
large = null;
}
if (typeof alignment == 'number') {
offsets = zIndex;
position = item;
zIndex = series;
item = colour;
series = alignment;
colour = null;
alignment = null;
}
if (typeof colour == 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = colour;
colour = null;
}
var data = (NOTES[type] || 'sticky_y') + ',' + (large ? '1' : '2') + ',' +
this.color(colour || 'black') + ',' + (PLACEMENTS[alignment] || 'h') + ',' +
(title ? this._escapeIconText(title) + ',' : '') + this._escapeIconText(text || '');
return this.icon('fnote' + (title ? '_title' : ''),
data, series, item, zIndex, position, offsets);
},
/* Create a weather icon definition.
@param title (string) the note title
@param text (string, optional) the text content, use '|' for line breaks
@param type (string, optional) the type of note to display
@param image (string, optional) the name of an inset image
@param series (number, optional) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
weatherIcon: function(title, text, type, image, series, item, zIndex, position, offsets) {
if (typeof text == 'number') {
offsets = item;
position = series;
zIndex = image;
item = type;
series = text;
image = null;
type = null;
text = null;
}
if (typeof type == 'number') {
offsets = zIndex;
position = item;
zIndex = series;
item = image;
series = type;
image = null;
type = null;
}
if (typeof image == 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = image;
image = null;
}
var data = (NOTES[type] || 'sticky_y') + ',' + (image || 'sunny') + ',' +
this._escapeIconText(title || '') + (text ? ',' + this._escapeIconText(text) : '');
return this.icon('weather', data, series, item, zIndex, position, offsets);
},
/* Create a text outline icon definition.
@param text (string) the text content, use '|' for line breaks
@param size (number, optional) the text size in pixels
@param bold (boolean, optional) true for bold
@param alignment (string, optional) 'left', 'right', 'center'
@param colour (string, optional) the icon text's fill colour
@param outline (string, optional) the icon text's outline colour
@param series (number, optional) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
outlineIcon: function(text, size, bold, alignment, colour, outline,
series, item, zIndex, position, offsets) {
if (typeof size == 'boolean') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = outline;
outline = colour;
colour = alignment;
alignment = bold;
bold = size;
size = null;
}
if (typeof size == 'string') {
offsets = zIndex;
position = item;
zIndex = series;
item = outline;
series = colour;
outline = alignment;
colour = bold;
alignment = size;
bold = null;
size = null;
}
if (typeof bold == 'number') {
offsets = series;
position = outline;
zIndex = colour;
item = alignment;
series = bold;
outline = null;
colour = null;
alignment = null;
bold = null;
}
if (typeof alignment == 'number') {
offsets = item;
position = series;
zIndex = outline;
item = colour;
series = alignment;
outline = null;
colour = null;
alignment = null;
}
if (typeof colour == 'number') {
offsets = zIndex;
position = item;
zIndex = series;
item = outline;
series = colour;
outline = null;
colour = null;
}
if (typeof outline == 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = outline;
outline = null;
}
var data = this.color(colour || 'white') + ',' + (size || 10) + ',' +
(PLACEMENTS[alignment] || 'h') + ',' + this.color(outline || 'black') + ',' +
(bold ? 'b' : '_') + ',' + this._escapeIconText(text);
return this.icon('text_outline', data, series, item, zIndex, position, offsets);
},
/* Create a colour varying icon definition.
@param image (string) the name of the icon to use
@param colourSeries (number) the series from which colour data is taken
@param colourLow (string[3] or string, optional) the icons' fill colour(s) (default 'green')
@param colourMiddle (string, optional) the icons' middle fill colour (default 'yellow')
@param colourHigh (string, optional) the icons' high fill colour (default 'red')
@param size (number, optional) the icon size in pixels - 12, 16, 24 (default 12)
@param outline (string, optional) the icons' outline colour (default 'black')
@param alignment (string, optional) result of contextualAlignment(...) (default 'hb')
@param series (number) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
colourVaryIcon: function(image, colourSeries, colourLow, colourMiddle, colourHigh, size, outline, alignment,
series, item, zIndex, position, offsets) {
if ($.isArray(colourLow)) {
offsets = zIndex;
position = item;
zIndex = series;
item = alignment;
series = outline;
alignment = size;
outline = colourHigh;
size = colourMiddle;
colourHigh = colourLow[2];
colourMiddle = colourLow[1];
colourLow = colourLow[0];
}
else if (typeof colourLow != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = size;
size = colourHigh;
colourHigh = colourMiddle;
colourMiddle = colourLow;
colourLow = null;
}
if (typeof colourMiddle != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = size;
size = colourHigh;
colourHigh = colourMiddle;
colourMiddle = null;
}
if (typeof colourHigh != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = size;
size = colourHigh;
colourHigh = null;
}
if (typeof size != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = size;
size = null;
}
if (typeof outline != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = null;
}
if (typeof alignment != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = null;
}
var data = image + ',' + (colourSeries || 0) + ',' + this.color(colourLow || 'green') + ',' +
this.color(colourMiddle || 'yellow') + ',' + this.color(colourHigh || 'red') + ',' +
(SIZES[size] || 12) + ',' + this.color(outline || 'black') + ',' + (alignment || 'hb-0-0');
return this.icon('cm_color', data, series, item, zIndex, position, offsets);
},
/* Create a size varying icon definition.
@param image (string) the name of the icon to use
@param sizeSeries (number) the series from which size data is taken
@param zeroSize (number[3] or number, optional) the icons' size at minimum data value (default 4),
or array of this and next two values
@param sizeMultiplier (number, optional) the size scaling factor (default 10)
@param minSize (number, optional) the minimum size for any icon in pixels (default 4)
@param colour (string, optional) the icons' fill colour (default '#88ff88')
@param outline (string, optional) the icons' outline colour (default 'black')
@param alignment (string, optional) result of contextualAlignment(...) (default 'hb')
@param series (number) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
sizeVaryIcon: function(image, sizeSeries, zeroSize, sizeMultiplier, minSize, colour, outline, alignment,
series, item, zIndex, position, offsets) {
if ($.isArray(zeroSize)) {
offsets = zIndex;
position = item;
zIndex = series;
item = alignment;
series = outline;
alignment = colour;
outline = minSize;
colour = sizeMultiplier;
minSize = zeroSize[2];
sizeMultiplier = zeroSize[1];
zeroSize = zeroSize[0];
}
else if (typeof zeroSize != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = colour;
colour = minSize;
minSize = sizeMultiplier;
sizeMultiplier = zeroSize;
zeroSize = null;
}
if (typeof sizeMultiplier != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = colour;
colour = minSize;
minSize = sizeMultiplier;
sizeMultiplier = null;
}
if (typeof minSize != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = colour;
colour = minSize;
minSize = null;
}
if (typeof colour != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = colour;
colour = null;
}
if (typeof outline != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = null;
}
if (typeof alignment != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = null;
}
var data = image + ',' + (sizeSeries || 0) + ',' + (zeroSize || 4) + ',' +
(sizeMultiplier || 10) + ',' + (minSize || 4) + ',' + this.color(outline || 'black') + ',' +
this.color(colour || '#88ff88') + ',' + (alignment || 'hb-0-0');
return this.icon('cm_size', data, series, item, zIndex, position, offsets);
},
/* Create a colour and size varying icon definition.
@param image (string) the name of the icon to use
@param colourSeries (number) the series from which colour data is taken
@param colourLow (string[3] or string, optional) the icons' fill colour(s) (default 'green')
@param colourMiddle (string, optional) the icons' middle fill colour (default 'yellow')
@param colourHigh (string, optional) the icons' high fill colour (default 'red')
@param sizeSeries (number) the series from which size data is taken
@param zeroSize (number[3] or number, optional) the icons' size at minimum data value (default 4),
or array of this and next two values
@param sizeMultiplier (number, optional) the size scaling factor (default 10)
@param minSize (number, optional) the minimum size for any icon in pixels (default 4)
@param outline (string, optional) the icons' outline colour (default 'black')
@param alignment (string, optional) result of contextualAlignment(...) (default 'hb')
@param series (number) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
colourSizeVaryIcon: function(image, colourSeries, colourLow, colourMiddle, colourHigh,
sizeSeries, zeroSize, sizeMultiplier, minSize, outline, alignment,
series, item, zIndex, position, offsets) {
if ($.isArray(colourLow)) {
offsets = zIndex;
position = item;
zIndex = series;
item = alignment;
series = outline;
alignment = minSize;
outline = sizeMultiplier;
minSize = zeroSize;
sizeMultiplier = sizeSeries;
zeroSize = colourHigh;
sizeSeries = colourMiddle;
colourHigh = colourLow[2];
colourMiddle = colourLow[1];
colourLow = colourLow[0];
}
else if (typeof colourLow != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = minSize;
minSize = sizeMultiplier;
sizeMultiplier = zeroSize;
zeroSize = sizeSeries;
sizeSeries = colourHigh;
colourHigh = colourMiddle;
colourMiddle = colourLow;
colourLow = null;
}
if (typeof colourMiddle != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = minSize;
minSize = sizeMultiplier;
sizeMultiplier = zeroSize;
zeroSize = sizeSeries;
sizeSeries = colourHigh;
colourHigh = colourMiddle;
colourMiddle = null;
}
if (typeof colourHigh != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = minSize;
minSize = sizeMultiplier;
sizeMultiplier = zeroSize;
zeroSize = sizeSeries;
sizeSeries = colourHigh;
colourHigh = null;
}
if ($.isArray(zeroSize)) {
offsets = zIndex;
position = item;
zIndex = series;
item = alignment;
series = outline;
alignment = minSize;
outline = sizeMultiplier;
minSize = zeroSize[2];
sizeMultiplier = zeroSize[1];
zeroSize = zeroSize[0];
}
else if (typeof zeroSize != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = minSize;
minSize = sizeMultiplier;
sizeMultiplier = zeroSize;
zeroSize = null;
}
if (typeof sizeMultiplier != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = minSize;
minSize = sizeMultiplier;
sizeMultiplier = null;
}
if (typeof minSize != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = minSize;
minSize = null;
}
if (typeof outline != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = outline;
outline = null;
}
if (typeof alignment != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = null;
}
var data = image + ',' + (colourSeries || 0) + ',' + this.color(colourLow || 'green') + ',' +
this.color(colourMiddle || 'yellow') + ',' + this.color(colourHigh || 'red') + ',' +
(sizeSeries || 0) + ',' + (zeroSize || 4) + ',' + (sizeMultiplier || 10) + ',' + (minSize || 4) + ',' +
this.color(outline || 'black') + ',' + (alignment || 'hb-0-0');
return this.icon('cm_color_size', data, series, item, zIndex, position, offsets);
},
/* Create a stacking icon definition.
@param image (string) the name of the icon to use
@param repeatSeries (number) the series from which repeat data is taken
@param scalingFactor (number, optional) the data value scaling factor (default 10)
@param horizontal (boolean, optional) true if stacking horizontally (default false)
@param size (number, optional) the icons' size - 12, 16, 24 (default 12)
@param colour (string, optional) the icons' fill colour (default '#88f88')
@param outline (string, optional) the icons' outline colour (default 'black')
@param spacing (number, optional) spacing between icons in pixels (default 0)
@param alignment (string, optional) result of contextualAlignment(...) (default 'hb')
@param series (number) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
stackingIcon: function(image, repeatSeries, scalingFactor, horizontal, size, colour, outline,
spacing, alignment, series, item, zIndex, position, offsets) {
if (typeof scalingFactor != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colour;
colour = size;
size = horizontal;
horizontal = scalingFactor;
scalingFactor = null;
}
if (typeof horizontal != 'boolean') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colour;
colour = size;
size = horizontal;
horizontal = null;
}
if (typeof size != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colour;
colour = size;
size = null;
}
if (typeof colour != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colour;
colour = null;
}
if (typeof outline != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = null;
}
if (typeof spacing != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = null;
}
if (typeof alignment != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = null;
}
var data = image + ',' + (repeatSeries || 0) + ',' + (scalingFactor || 10) + ',' +
(horizontal ? 'h' : 'V') + ',' + (SIZES[size] || 12) + ',' + this.color(colour || '#88ff88') + ',' +
this.color(outline || 'black') + ',' + (spacing || 0) + ',' + (alignment || 'hb-0-0');
return this.icon('cm_repeat', data, series, item, zIndex, position, offsets);
},
/* Create a stacking with colour varying icon definition.
@param image (string) the name of the icon to use
@param repeatSeries (number) the series from which repeat data is taken
@param scalingFactor (number, optional) the data value scaling factor (default 10)
@param horizontal (boolean, optional) true if stacking horizontally (default false)
@param size (number, optional) the icons' size - 12, 16, 24 (default 12)
@param colourSeries (number) the series from which colour data is taken
@param colourLow (string[3] or string) the icons' fill colour(s) (default 'green')
@param colourMiddle (string, optional) the icons' middle fill colour (default 'yellow')
@param colourHigh (string, optional) the icons' high fill colour (default 'red')
@param outline (string, optional) the icons' outline colour (default 'black')
@param spacing (number, optional) spacing between icons in pixels (default 0)
@param alignment (string, optional) result of contextualAlignment(...) (default 'hb')
@param series (number) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
stackingColourVaryIcon: function(image, repeatSeries, scalingFactor, horizontal, size,
colourSeries, colourLow, colourMiddle, colourHigh, outline,
spacing, alignment, series, item, zIndex, position, offsets) {
if (typeof scalingFactor != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colourHigh;
colourHigh = colourMiddle;
colourMiddle = colourLow;
colourLow = colourSeries;
colourSeries = size;
size = horizontal;
horizontal = scalingFactor;
scalingFactor = null;
}
if (typeof horizontal != 'boolean') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colourHigh;
colourHigh = colourMiddle;
colourMiddle = colourLow;
colourLow = colourSeries;
colourSeries = size;
size = horizontal;
horizontal = null;
}
if (typeof size != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colourHigh;
colourHigh = colourMiddle;
colourMiddle = colourLow;
colourLow = colourSeries;
colourSeries = size;
size = null;
}
if ($.isArray(colourLow)) {
offsets = zIndex;
position = item;
zIndex = series;
item = alignment;
series = spacing;
alignment = outline;
spacing = colourHigh;
outline = colourMiddle;
colourHigh = colourLow[2];
colourMiddle = colourLow[1];
colourLow = colourLow[0];
}
else if (typeof colourLow != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colourHigh;
colourHigh = colourMiddle;
colourMiddle = colourLow;
colourLow = null;
}
if (typeof colourMiddle != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colourHigh;
colourHigh = colourMiddle;
colourMiddle = null;
}
if (typeof colourHigh != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = colourHigh;
colourHigh = null;
}
if (typeof outline != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = outline;
outline = null;
}
if (typeof spacing != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = spacing;
spacing = null;
}
if (typeof alignment != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = alignment;
alignment = null;
}
var data = image + ',' + (repeatSeries || 0) + ',' + (scalingFactor || 10) + ',' +
(horizontal ? 'h' : 'V') + ',' + (SIZES[size] || 12) + ',' + (colourSeries || 0) + ',' +
this.color(colourLow || 'green') + ',' + this.color(colourMiddle || 'yellow') + ',' +
this.color(colourHigh || 'red') + ',' + this.color(outline || 'black') + ',' +
(spacing || 0) + ',' + (alignment || 'hb-0-0');
return this.icon('cm_repeat_color', data, series, item, zIndex, position, offsets);
},
/* Generate a contextual alignment value.
@param position (string) the anchor point, e.g. 'topLeft', 'center', ...
@param hOffset (number, optional) a horizontal offset (pixels)
@param vOffset (number, optional) a vertical offset (pixels)
@return (string) the alignment property */
contextualAlignment: function(position, hOffset, vOffset) {
hOffset = hOffset || 0;
vOffset = vOffset || 0;
return (ALIGNMENTS[position] || 'hv') +
(hOffset == 0 ? '-0' : (hOffset > 0 ? '%20' + hOffset : hOffset)) +
(vOffset == 0 ? '-0' : (vOffset > 0 ? '%20' + vOffset : vOffset));
},
/* Generate an embedded chart icon.
@param embeddedOptions (object) the options for the embedded chart
@param bubble (boolean, optional) true if embedded in a bubble (default false)
@param alignment (string, optional) the type of tail to use for a bubble (default 'bottomLeft'),
or the alignment of a non-bubble icon (default 'bottomLeft')
@param padding (number, optional) the padding inside the bubble in pixels (default 4)
@param frameColour (string, optional) the colour of the frame border (default #00d0d0)
@param fillColour (string, optional) the colour of the frame background (default #80ffff)
@param series (number, optional) the series to which the icon applies
@param item (number or string or number[2 or 3], optional)
the item in the series to which it applies or 'all' (default)
or 'everyn' or [start, end, every]
@param zIndex (number, optional) the z-index (-1.0 to 1.0)
@param position (number[2], optional) an absolute chart position (0.0 to 1.0)
@param offsets (number[2], optional) pixel offsets
@return (object) the icon definition */
embeddedChart: function(embeddedOptions, bubble, alignment, padding, frameColour, fillColour,
series, item, zIndex, position, offsets) {
if (typeof bubble != 'boolean') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = fillColour;
fillColour = frameColour;
frameColour = padding;
padding = alignment;
alignment = bubble;
bubble = false;
}
if (typeof alignment != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = fillColour;
fillColour = frameColour;
frameColour = padding;
padding = alignment;
alignment = null;
}
if (!bubble) {
offsets = item;
position = series;
zIndex = fillColour;
item = frameColour;
series = padding;
fillColour = null;
frameColour = null;
padding = null;
}
else {
if (typeof padding != 'number') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = fillColour;
fillColour = frameColour;
frameColour = padding;
padding = null;
}
if (typeof frameColour != 'string') {
offsets = zIndex;
position = item;
zIndex = series;
item = fillColour;
series = frameColour;
fillColour = null;
frameColour = null;
}
else if (typeof fillColour != 'string') {
offsets = position;
position = zIndex;
zIndex = item;
item = series;
series = fillColour;
fillColour = null;
}
}
var encodeEmbedded = function(value) {
return value.replace(/%7c/ig, '|').replace(/@/g, '@@').replace(/%/g, '%25').
replace(/,/g, '@,').replace(/\|/g, '@|').replace(/;/g, '@;').
replace(/&/g, '%26').replace(/=/g, '%3D');
};
var allOptions = $.extend({}, $.gchart._defaults, {width: 120, height: 60}, embeddedOptions);
var embedded = $.gchart._generateChart(allOptions);
embedded = embedded.replace(/^[^\?]+\?/, '').split('&');
embedded = $.map(embedded, function(value) {
value = value.split('=');
return encodeEmbedded(value[0]) + ',' + encodeEmbedded(value[1]);
});
var data = (bubble ? (TAILS[alignment] || 'bb') + ',' + (padding == null ? 4 : padding) + ',' +
this.color(frameColour || '#00d0d0') + ',' + this.color(fillColour || '#80ffff') :
(EMBEDDED_ALIGNMENTS[alignment] || 'lb')) + ',' + embedded.join(',');
return this.icon('ec' + (bubble ? 'b' : ''), data, series, item, zIndex, position, offsets);
},
/* Generate dynamic icon parameters.
@param type (string) the encoded chart type
@param options (object) the current instance settings
@return (string) the icons parameters */
addIcons: function(type, options) {
var decodeItem = function(item) {
if (item == 'all') {
return item;
}
if (typeof item == 'string') {
if (/^every(\d+)$/.exec(item)) {
return item.replace(/every/, 'every,');
}
}
if ($.isArray(item)) {
return 'range,' + item.join(',');
}
return item;
};
var icons = '';
var freeIcon = '';
for (var i = 0; i < options.icons.length; i++) {
var icon = options.icons[i];
if (icon.series == -1) {
freeIcon = '&chst=d_' + icon.name + '&chld=' + icon.data.replace(/,/g, '|');
}
else {
icons += '|y;s=' + icon.name + ';d=' + icon.data +
(icon.position ? '' : ';ds=' + icon.series + ';dp=' + decodeItem(icon.item)) +
(icon.zIndex ? ';py=' + icon.zIndex : '') +
(icon.position ? ';po=' + icon.position.join(',') : '') +
(icon.offsets ? ';of=' + icon.offsets.join(',') : '');
}
}
return (icons ? '&chem=' + icons.substr(1) : '') + freeIcon;
},
/* Escape reserved characters in icon text.
@param value (string) the text to escape
@return (string) the escaped text */
_escapeIconText: function(value) {
return value.replace(/([@=,;])/g, '@$1').replace(/\|/g, ',');
}
});
$.extend($.gchart._prototype.prototype, {
colorVaryIcon: $.gchart._prototype.prototype.colourVaryIcon,
colorSizeVaryIcon: $.gchart._prototype.prototype.colourSizeVaryIcon,
stackingColorVaryIcon: $.gchart._prototype.prototype.stackingColourVaryIcon
});
})(jQuery);