mirror of https://github.com/ColorlibHQ/gentelella
244 lines
6.3 KiB
JavaScript
244 lines
6.3 KiB
JavaScript
![]() |
var JQVMap = function (params) {
|
||
|
params = params || {};
|
||
|
var map = this;
|
||
|
var mapData = JQVMap.maps[params.map];
|
||
|
var mapPins;
|
||
|
|
||
|
if( !mapData){
|
||
|
throw new Error('Invalid "' + params.map + '" map parameter. Please make sure you have loaded this map file in your HTML.');
|
||
|
}
|
||
|
|
||
|
this.selectedRegions = [];
|
||
|
this.multiSelectRegion = params.multiSelectRegion;
|
||
|
|
||
|
this.container = params.container;
|
||
|
|
||
|
this.defaultWidth = mapData.width;
|
||
|
this.defaultHeight = mapData.height;
|
||
|
|
||
|
this.color = params.color;
|
||
|
this.selectedColor = params.selectedColor;
|
||
|
this.hoverColor = params.hoverColor;
|
||
|
this.hoverColors = params.hoverColors;
|
||
|
this.hoverOpacity = params.hoverOpacity;
|
||
|
this.setBackgroundColor(params.backgroundColor);
|
||
|
|
||
|
this.width = params.container.width();
|
||
|
this.height = params.container.height();
|
||
|
|
||
|
this.resize();
|
||
|
|
||
|
jQuery(window).resize(function () {
|
||
|
var newWidth = params.container.width();
|
||
|
var newHeight = params.container.height();
|
||
|
|
||
|
if(newWidth && newHeight){
|
||
|
map.width = newWidth;
|
||
|
map.height = newHeight;
|
||
|
map.resize();
|
||
|
map.canvas.setSize(map.width, map.height);
|
||
|
map.applyTransform();
|
||
|
|
||
|
var resizeEvent = jQuery.Event('resize.jqvmap');
|
||
|
jQuery(params.container).trigger(resizeEvent, [newWidth, newHeight]);
|
||
|
|
||
|
if(mapPins){
|
||
|
jQuery('.jqvmap-pin').remove();
|
||
|
map.pinHandlers = false;
|
||
|
map.placePins(mapPins.pins, mapPins.mode);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
this.canvas = new VectorCanvas(this.width, this.height, params);
|
||
|
params.container.append(this.canvas.canvas);
|
||
|
|
||
|
this.makeDraggable();
|
||
|
|
||
|
this.rootGroup = this.canvas.createGroup(true);
|
||
|
|
||
|
this.index = JQVMap.mapIndex;
|
||
|
this.label = jQuery('<div/>').addClass('jqvmap-label').appendTo(jQuery('body')).hide();
|
||
|
|
||
|
if (params.enableZoom) {
|
||
|
jQuery('<div/>').addClass('jqvmap-zoomin').text('+').appendTo(params.container);
|
||
|
jQuery('<div/>').addClass('jqvmap-zoomout').html('−').appendTo(params.container);
|
||
|
}
|
||
|
|
||
|
map.countries = [];
|
||
|
|
||
|
for (var key in mapData.paths) {
|
||
|
var path = this.canvas.createPath({
|
||
|
path: mapData.paths[key].path
|
||
|
});
|
||
|
|
||
|
path.setFill(this.color);
|
||
|
path.id = map.getCountryId(key);
|
||
|
map.countries[key] = path;
|
||
|
|
||
|
if (this.canvas.mode === 'svg') {
|
||
|
path.setAttribute('class', 'jqvmap-region');
|
||
|
} else {
|
||
|
jQuery(path).addClass('jqvmap-region');
|
||
|
}
|
||
|
|
||
|
jQuery(this.rootGroup).append(path);
|
||
|
}
|
||
|
|
||
|
jQuery(params.container).delegate(this.canvas.mode === 'svg' ? 'path' : 'shape', 'mouseover mouseout', function (e) {
|
||
|
var containerPath = e.target,
|
||
|
code = e.target.id.split('_').pop(),
|
||
|
labelShowEvent = jQuery.Event('labelShow.jqvmap'),
|
||
|
regionMouseOverEvent = jQuery.Event('regionMouseOver.jqvmap');
|
||
|
|
||
|
code = code.toLowerCase();
|
||
|
|
||
|
if (e.type === 'mouseover') {
|
||
|
jQuery(params.container).trigger(regionMouseOverEvent, [code, mapData.paths[code].name]);
|
||
|
if (!regionMouseOverEvent.isDefaultPrevented()) {
|
||
|
map.highlight(code, containerPath);
|
||
|
}
|
||
|
if (params.showTooltip) {
|
||
|
map.label.text(mapData.paths[code].name);
|
||
|
jQuery(params.container).trigger(labelShowEvent, [map.label, code]);
|
||
|
|
||
|
if (!labelShowEvent.isDefaultPrevented()) {
|
||
|
map.label.show();
|
||
|
map.labelWidth = map.label.width();
|
||
|
map.labelHeight = map.label.height();
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
map.unhighlight(code, containerPath);
|
||
|
|
||
|
map.label.hide();
|
||
|
jQuery(params.container).trigger('regionMouseOut.jqvmap', [code, mapData.paths[code].name]);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
jQuery(params.container).delegate(this.canvas.mode === 'svg' ? 'path' : 'shape', 'click', function (regionClickEvent) {
|
||
|
|
||
|
var targetPath = regionClickEvent.target;
|
||
|
var code = regionClickEvent.target.id.split('_').pop();
|
||
|
var mapClickEvent = jQuery.Event('regionClick.jqvmap');
|
||
|
|
||
|
code = code.toLowerCase();
|
||
|
|
||
|
jQuery(params.container).trigger(mapClickEvent, [code, mapData.paths[code].name]);
|
||
|
|
||
|
if ( !params.multiSelectRegion && !mapClickEvent.isDefaultPrevented()) {
|
||
|
for (var keyPath in mapData.paths) {
|
||
|
map.countries[keyPath].currentFillColor = map.countries[keyPath].getOriginalFill();
|
||
|
map.countries[keyPath].setFill(map.countries[keyPath].getOriginalFill());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( !mapClickEvent.isDefaultPrevented()) {
|
||
|
if (map.isSelected(code)) {
|
||
|
map.deselect(code, targetPath);
|
||
|
} else {
|
||
|
map.select(code, targetPath);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (params.showTooltip) {
|
||
|
params.container.mousemove(function (e) {
|
||
|
if (map.label.is(':visible')) {
|
||
|
var left = e.pageX - 15 - map.labelWidth;
|
||
|
var top = e.pageY - 15 - map.labelHeight;
|
||
|
|
||
|
if(left < 0) {
|
||
|
left = e.pageX + 15;
|
||
|
}
|
||
|
if(top < 0) {
|
||
|
top = e.pageY + 15;
|
||
|
}
|
||
|
|
||
|
map.label.css({
|
||
|
left: left,
|
||
|
top: top
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
this.setColors(params.colors);
|
||
|
|
||
|
this.canvas.canvas.appendChild(this.rootGroup);
|
||
|
|
||
|
this.applyTransform();
|
||
|
|
||
|
this.colorScale = new ColorScale(params.scaleColors, params.normalizeFunction, params.valueMin, params.valueMax);
|
||
|
|
||
|
if (params.values) {
|
||
|
this.values = params.values;
|
||
|
this.setValues(params.values);
|
||
|
}
|
||
|
|
||
|
if (params.selectedRegions) {
|
||
|
if (params.selectedRegions instanceof Array) {
|
||
|
for(var k in params.selectedRegions) {
|
||
|
this.select(params.selectedRegions[k].toLowerCase());
|
||
|
}
|
||
|
} else {
|
||
|
this.select(params.selectedRegions.toLowerCase());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.bindZoomButtons();
|
||
|
|
||
|
if(params.pins) {
|
||
|
mapPins = {
|
||
|
pins: params.pins,
|
||
|
mode: params.pinMode
|
||
|
};
|
||
|
|
||
|
this.pinHandlers = false;
|
||
|
this.placePins(params.pins, params.pinMode);
|
||
|
}
|
||
|
|
||
|
if(params.showLabels){
|
||
|
this.pinHandlers = false;
|
||
|
|
||
|
var pins = {};
|
||
|
for (key in map.countries){
|
||
|
if (typeof map.countries[key] !== 'function') {
|
||
|
if( !params.pins || !params.pins[key] ){
|
||
|
pins[key] = key.toUpperCase();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
mapPins = {
|
||
|
pins: pins,
|
||
|
mode: 'content'
|
||
|
};
|
||
|
|
||
|
this.placePins(pins, 'content');
|
||
|
}
|
||
|
|
||
|
JQVMap.mapIndex++;
|
||
|
};
|
||
|
|
||
|
JQVMap.prototype = {
|
||
|
transX: 0,
|
||
|
transY: 0,
|
||
|
scale: 1,
|
||
|
baseTransX: 0,
|
||
|
baseTransY: 0,
|
||
|
baseScale: 1,
|
||
|
width: 0,
|
||
|
height: 0,
|
||
|
countries: {},
|
||
|
countriesColors: {},
|
||
|
countriesData: {},
|
||
|
zoomStep: 1.4,
|
||
|
zoomMaxStep: 4,
|
||
|
zoomCurStep: 1
|
||
|
};
|
||
|
|
||
|
JQVMap.xlink = 'http://www.w3.org/1999/xlink';
|
||
|
JQVMap.mapIndex = 1;
|
||
|
JQVMap.maps = {};
|