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 = {};
|