Skip to content
Snippets Groups Projects
jquery.hotspot.responsive.js 3.66 KiB
Newer Older
/*
* rwdImageMaps jQuery plugin v1.6
*
* Allows image maps to be used in a responsive design by recalculating the area coordinates to match the actual image size on load and window.resize
*
* Copyright (c) 2016 Matt Stow
* https://github.com/stowball/jQuery-rwdImageMaps
* http://mattstow.com
* Licensed under the MIT license
*/
;(function($) {
	$.fn.rwdImageMaps = function(options) {
		var settings = $.extend({
			fillColor: 'bbbbbb',
			fillOpacity: 0.5,
			strokeColor: '6E6E6E',
			strokeOpacity: 1.0,
		}, options );

		var loaded = null;
		var windowWidth = 0;
		var hotSpotContainerWidth = 0;

		var rwdImageMap = function() {
			$img.each(function() {
				if (typeof($(this).attr('usemap')) == 'undefined')
					return;

				var recalculateMap = function(that, $that) {
					// Since WebKit doesn't know the height until after the image has loaded, perform everything in an onload copy
					$('<img />').on('load', function() {
						var attrW = 'width',
							attrH = 'height';
						
						if (!$that.data(attrW)) // size are backuped
							$that.data(attrW, $that.attr(attrW));
						if (!$that.data(attrH)) // size are backuped
							$that.data(attrH, $that.attr(attrH));
						
						var w = $that.data(attrW),
							h = $that.data(attrH);
	
						if (!w || !h) {
							var temp = new Image();
							temp.src = $that.attr('src');
							if (!w) {
								w = temp.width;
								$that.data(attrW, h);
							}
							if (!h) {
								h = temp.height;
								$that.data(attrH, h);
							}
						}
	
						var containerWidth = $that.closest(".o_oo_hotcontainer").width();
						
						var tw = $that.width(),
							th = $that.height();
						if(containerWidth < w) {
							var ratio = h / w;
							tw = containerWidth;
							th = ((containerWidth * ratio)|0);
							$that.width(tw);
							$that.height(th);
						} else if(tw == 0 && th == 0) {
							// image was hidden
							tw = w;
							th = h;
							$that.width(tw);
							$that.height(th);
						} 
						var wPercent = tw/100,
							hPercent = th/100,
							map = $that.attr('usemap').replace('#', ''),
							c = 'coords';
	
						$('map[name="' + map + '"]').find('area').each(function() {
							var $this = $(this);
							if (!$this.data(c)) // coords are backuped
								$this.data(c, $this.attr(c));
							
							var coords = $this.data(c).split(','),
								coordsPercent = new Array(coords.length);
	
							for (var i = 0; i < coordsPercent.length; ++i) {
								if (i % 2 === 0)
									coordsPercent[i] = parseInt(((coords[i]/w)*100)*wPercent);
								else
									coordsPercent[i] = parseInt(((coords[i]/h)*100)*hPercent);
							}
							$this.attr(c, coordsPercent.toString());
						});
						
						loaded = true;
						
						$that.maphilight({
							fillColor:  settings.fillColor,
							fillOpacity: settings.fillOpacity,
							strokeColor: settings.strokeColor,
							strokeOpacity: settings.strokeOpacity,
							strokeWidth: 3,
							alwaysOn: true
						});
						
					}).attr('src', $that.attr('src'));
				};
				
				var that = this,
					$that = $(that);
				var containerWidth = $that.closest(".o_oo_hotcontainer").width();

					if(windowWidth != window.innerWidth || hotSpotContainerWidth != containerWidth) {
						recalculateMap(that, $that);
						windowWidth = window.innerWidth;
						hotSpotContainerWidth = containerWidth
					}
				} else {
					windowWidth = window.innerWidth;
					hotSpotContainerWidth = containerWidth;
					recalculateMap(that, $that);
				}
			});
		};
		$(window).resize(rwdImageMap).trigger('resize');
		$($img).closest('.o_qti21_collapsable_solution').on('shown.bs.collapse', rwdImageMap);