{"version":3,"file":"jquery.imagemapster.js","names":["factory","define","amd","module","exports","root","jQuery","undefined","window","require","$","event","special","supportsPassive","opts","Object","defineProperty","get","addEventListener","removeEventListener","e","setupListener","ns","type","listener","includes","this","passive","touchstart","setup","_","call","touchend","setupPassiveListeners","fn","addBack","andSelf","extend","actual","method","options","fix","restore","configs","absolute","clone","includeMargin","display","$target","eq","attr","appendTo","remove","$hidden","tmp","style","parents","filter","each","$this","thisStyle","push","i","_tmp","removeAttr","test","mapster_version","elements","lastKey","fade_func","mapster","m","impl","utils","isFunction","apply","Array","prototype","slice","arguments","error","bind","version","render_defaults","isSelectable","isDeselectable","fade","fadeDuration","fill","fillColor","fillColorMask","fillOpacity","highlight","stroke","strokeColor","strokeOpacity","strokeWidth","includeKeys","altImage","altImageId","altImages","altImageOpacity","defaults","clickNavigate","navigateMode","wrapClass","wrapCss","onGetList","sortList","mapKey","mapValue","singleSelect","listKey","listSelectedAttribute","listSelectedClass","onClick","onMouseover","onMouseout","mouseoutDelay","onStateChange","boundList","onConfigured","configTimeout","noHrefIsMask","scaleMap","enableAutoResizeSupport","autoResize","autoResizeDelay","autoResizeDuration","onAutoResize","areas","shared_defaults","render_highlight","render_select","staticState","selected","area_defaults","isMask","canvas_style","position","left","top","padding","border","hasCanvas","map_cache","hooks","addHook","name","callback","callHooks","context","when","all","deferredArray","Promise","defer","promise","resolve","reject","then","catch","subclass","BaseClass","constr","Subclass","me","args","base","init","constructor","asArray","obj","split","text","cb","el","arr","length","trim","splice","updateProps","_target","_template","onlyProps","target","template","isEmptyObject","prop","src","inArray","p","isPlainObject","isElement","o","HTMLElement","nodeType","nodeName","indexOf","indexOfProp","val","result","boolOrDefault","def","isBool","isUndef","isNumeric","isNaN","parseFloat","ifFunction","that","size","image","raw","u","width","naturalWidth","imgWidth","height","naturalHeight","imgHeight","complete","setOpacity","opacity","css","fader","op","endOp","duration","index","cbIntervals","setTimeout","getShape","areaEl","shape","toLowerCase","hasAttribute","attrName","getBoundList","key_list","key","list","is","add","getMapDataIndex","img","id","tagName","parent","getMapData","queueCommand","map_data","command","currentAction","commands","unload","off","ap","capProp","substr","toUpperCase","jqwidth","Method","func_map","func_area","output","input","first","allowAsync","go","data","ar","len","area_list","getData","addMap","removeMap","hasVml","a","html","b","firstChild","behavior","has","adj","namespaces","document","d","g_vml_","getContext","merge_areas","map_areas","getDataForKey","merge_options","temp_opts","area_options","md","getSelected","isSelected","defaultReturn","highlightId","ensureNoHighlight","keys","keyList","addUniqueKeys","ad","concat","getKeysForGroup","getDataForArea","join","select","set","deselect","lastMap","addArea","finishSetForMap","newState","toggle","setSelection","removeSelectionFinish","toString","unbind","preserveState","clearEvents","clearMapData","rebind","configureOptions","bindImages","buildDataset","get_options","effective","eff","effectiveOptions","set_options","graphics","snapshot","base_canvas","createVisibleCanvas","before","state","map","usemap","getAttribute","MapData","initialize","useCanvas","shapes","value","v","createStyleSheet","addRule","eval","canvasMethods","vmlMethods","addShapeGroupImpl","areaData","nohref","addShape","hex_to_decimal","hex","Math","max","min","parseInt","css3color","color","noop","Graphics","active","canvas","masks","begin","elementName","c","mapArea","mapData","createCanvasFor","addClass","addShapeGroup","mode","effectiveRenderOptions","areaId","overlay_canvas","render","find","not","renderShape","offset","coords","rect","moveTo","lineTo","arc","PI","addAltImage","beginPath","closePath","clip","globalAlpha","drawImage","owner","scaleInfo","maskCanvas","maskContext","hasMasks","shapeCanvas","shapeContext","clearRect","save","lineWidth","fillStyle","s","images","strokeStyle","globalCompositeOperation","clearHighlight","refreshSelections","canvas_temp","hide","redrawSelections","show","cssclass","t_fill","el_name","el_class","append","w","h","children","removeSelections","area_id","MapImages","clear","status","_add","ids","on","imageLoaded","imageLoadError","triesLeft","check","isLoaded","imgTimeout","deferred","resolver","clearTimeout","queueMouseEvent","delay","area","activeAreaEvent","completeAction","currentAreaId","shouldNavigateTo","href","mousedown","blur","preventDefault","mouseover","arData","getAllDataForArea","isNotRendered","clearEffects","showToolTip","toolTip","mouseout","relatedTarget","toolTipClose","activeToolTip","clearToolTip","click","list_target","newSelectionState","canChangeState","cbResult","navDetails","areaOpts","navigateTo","location","open","getNavDetails","defaultHref","elHref","useEl","hrefTarget","clickArea","listTarget","imgCssText","cssText","mapAreas","_xref","_tooltip_events","autoResizeTimer","initializeDefaults","mi","e2","configureAltImages","isActive","resizing","zoomed","zoomedArea","wrapId","instanceEventNamespace","_idFromKey","hasOwnProperty","atMost","isPrimary","getPrimaryKeysForMapAreas","changeState","setHighlightId","clearSelections","setAreaOptions","drawSelections","key_arr","drawSelection","isSelectedOrStatic","setBoundListProperties","removeClass","clearBoundListProperties","refreshBoundList","setBoundList","sort_func","sorted_list","sort","imgCopy","wrap","parentId","scale","substring","className","wrapper","processCommandQueue","configureAutoResize","$img","sel","j","$area","curKey","mapAreaId","group_value","dataItem","default_group","addAreaData","AreaData","String","configure","areaDataXref","MapArea","areasXref","cur","_clearCanvases","reset","g","isNoHref","staticStateOverridden","optsCache","constuctor","selectedHasChanged","hasOptions","newOptsCache","changeOptions","isDrawn","updateSelected","partial","prevSelected","allOpts","state_type","originalCoords","areaCorners","container","pos","found","minX","minY","maxX","maxY","bestMinX","bestMaxX","bestMinY","bestMaxY","curX","curY","nest","rootx","rooty","iCoords","radius","angle","offsetx","offsety","body","cos","sin","getScaleInfo","pct","scalePct","realWidth","realHeight","ratio","imageRaw","vis","resize","promises","newsize","els","sizeCanvas","finishResize","tempOptions","resizeMapData","round","animate","easing","resizeMap","percent","coordOffset","newCoords","noDimensions","createToolTip","tooltip","bindToolTipClose","bindOption","beforeClose","onClose","tooltip_ns","event_name","object","corners","ttopts","outerWidth","outerHeight","tooltipCss","actalOpacity","zindex","showToolTipImpl","getHtmlFromOptions","jquery","content","getOptionsFromOptions","toolTipContainer","toolTipFade","onShowToolTip","onHideToolTip","stop","activeToolTipID","closeOpts","tipClosed","closeEvents","effectiveContent","areaOptions","defaultTarget"],"sources":["jquery.imagemapster.js"],"mappings":"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","sourcesContent":["/*!\n* imagemapster - v1.8.0 - 2024-05-01\n* https://jamietre.github.io/ImageMapster\n* Copyright (c) 2011 - 2024 James Treworgy\n* License: MIT\n*/\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['jquery'], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node/CommonJS\n module.exports = function( root, jQuery ) {\n if ( jQuery === undefined ) {\n // require('jQuery') returns a factory that requires window to\n // build a jQuery instance, we normalize how we use modules\n // that require this pattern but the window provided is a noop\n // if it's defined (how jquery works)\n if ( typeof window !== 'undefined' ) {\n jQuery = require('jquery');\n }\n else {\n jQuery = require('jquery')(root);\n }\n }\n factory(jQuery);\n return jQuery;\n };\n } else {\n // Browser globals\n factory(jQuery);\n }\n}(function (jQuery) {\n/*\n jqueryextensions.js\n Extend/intercept jquery behavior\n*/\n\n(function ($) {\n 'use strict';\n\n function setupPassiveListeners() {\n // Test via a getter in the options object to see if the passive property is accessed\n var supportsPassive = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function () {\n supportsPassive = true;\n return true;\n }\n });\n window.addEventListener('testPassive.mapster', function () {}, opts);\n window.removeEventListener('testPassive.mapster', function () {}, opts);\n } catch (e) {\n // intentionally ignored\n }\n\n if (supportsPassive) {\n // In order to not interrupt scrolling on touch devices\n // we commit to not calling preventDefault from within listeners\n // There is a plan to handle this natively in jQuery 4.0 but for\n // now we are on our own.\n // TODO: Migrate to jQuery 4.0 approach if/when released\n // https://www.chromestatus.com/feature/5745543795965952\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://github.com/jquery/jquery/issues/2871#issuecomment-175175180\n // https://jsbin.com/bupesajoza/edit?html,js,output\n var setupListener = function (ns, type, listener) {\n if (ns.includes('mapster') && ns.includes('noPreventDefault')) {\n this.addEventListener(type, listener, { passive: true });\n } else {\n return false;\n }\n };\n\n // special events for mapster.noPreventDefault\n $.event.special.touchstart = {\n setup: function (_, ns, listener) {\n return setupListener.call(this, ns, 'touchstart', listener);\n }\n };\n $.event.special.touchend = {\n setup: function (_, ns, listener) {\n return setupListener.call(this, ns, 'touchend', listener);\n }\n };\n }\n }\n\n function supportsSpecialEvents() {\n return $.event && $.event.special;\n }\n\n // Zepto does not support special events\n // TODO: Remove when Zepto support is removed\n if (supportsSpecialEvents()) {\n setupPassiveListeners();\n }\n})(jQuery);\n\n/*\n When autoresize is enabled, we obtain the width of the wrapper element and resize to that, however when we're hidden because of\n one of our ancenstors, jQuery width function returns 0. Ideally, we could use ResizeObserver/MutationObserver to detect\n when we hide/show and resize on that event instead of resizing while we are not visible but until official support of older \n browsers is dropped, we need to go this route. The plugin below will provide the actual width even when we're not visible.\n\n Source: https://raw.githubusercontent.com/dreamerslab/jquery.actual/master/jquery.actual.js\n*/\n/*! Copyright 2012, Ben Lin (http://dreamerslab.com/)\n * Licensed under the MIT License (LICENSE.txt).\n *\n * Version: 1.0.19\n *\n * Requires: jQuery >= 1.2.3\n */\n/* eslint-disable one-var */\n(function ($) {\n 'use strict';\n\n $.fn.addBack = $.fn.addBack || $.fn.andSelf;\n\n $.fn.extend({\n actual: function (method, options) {\n // check if the jQuery method exist\n if (!this[method]) {\n throw (\n '$.actual => The jQuery method \"' +\n method +\n '\" you called does not exist'\n );\n }\n\n var defaults = {\n absolute: false,\n clone: false,\n includeMargin: false,\n display: 'block'\n };\n\n var configs = $.extend(defaults, options);\n\n var $target = this.eq(0);\n var fix, restore;\n\n if (configs.clone === true) {\n fix = function () {\n var style = 'position: absolute !important; top: -1000 !important; ';\n\n // this is useful with css3pie\n $target = $target.clone().attr('style', style).appendTo('body');\n };\n\n restore = function () {\n // remove DOM element after getting the width\n $target.remove();\n };\n } else {\n var tmp = [];\n var style = '';\n var $hidden;\n\n fix = function () {\n // get all hidden parents\n $hidden = $target.parents().addBack().filter(':hidden');\n style +=\n 'visibility: hidden !important; display: ' +\n configs.display +\n ' !important; ';\n\n if (configs.absolute === true)\n style += 'position: absolute !important; ';\n\n // save the origin style props\n // set the hidden el css to be got the actual value later\n $hidden.each(function () {\n // Save original style. If no style was set, attr() returns undefined\n var $this = $(this);\n var thisStyle = $this.attr('style');\n\n tmp.push(thisStyle);\n // Retain as much of the original style as possible, if there is one\n $this.attr('style', thisStyle ? thisStyle + ';' + style : style);\n });\n };\n\n restore = function () {\n // restore origin style values\n $hidden.each(function (i) {\n var $this = $(this);\n var _tmp = tmp[i];\n\n if (_tmp === undefined) {\n $this.removeAttr('style');\n } else {\n $this.attr('style', _tmp);\n }\n });\n };\n }\n\n fix();\n // get the actual value with user specific methed\n // it can be 'width', 'height', 'outerWidth', 'innerWidth'... etc\n // configs.includeMargin only works for 'outerWidth' and 'outerHeight'\n var actual = /(outer)/.test(method)\n ? $target[method](configs.includeMargin)\n : $target[method]();\n\n restore();\n // IMPORTANT, this plugin only return the value of the first element\n return actual;\n }\n });\n})(jQuery);\n/* eslint-enable one-var */\n\n/*\n core.js\n ImageMapster core\n*/\n\n(function ($) {\n 'use strict';\n\n var mapster_version = '1.8.0';\n\n // all public functions in $.mapster.impl are methods\n $.fn.mapster = function (method) {\n var m = $.mapster.impl;\n if ($.mapster.utils.isFunction(m[method])) {\n return m[method].apply(this, Array.prototype.slice.call(arguments, 1));\n } else if (typeof method === 'object' || !method) {\n return m.bind.apply(this, arguments);\n } else {\n $.error('Method ' + method + ' does not exist on jQuery.mapster');\n }\n };\n\n $.mapster = {\n version: mapster_version,\n render_defaults: {\n isSelectable: true,\n isDeselectable: true,\n fade: false,\n fadeDuration: 150,\n fill: true,\n fillColor: '000000',\n fillColorMask: 'FFFFFF',\n fillOpacity: 0.7,\n highlight: true,\n stroke: false,\n strokeColor: 'ff0000',\n strokeOpacity: 1,\n strokeWidth: 1,\n includeKeys: '',\n altImage: null,\n altImageId: null, // used internally\n altImages: {},\n altImageOpacity: null\n },\n defaults: {\n clickNavigate: false,\n navigateMode: 'location', // location|open\n wrapClass: null,\n wrapCss: null,\n onGetList: null,\n sortList: false,\n // listenToList: false, // not used - see mapdata.js line 1002\n mapKey: '',\n mapValue: '',\n singleSelect: false,\n listKey: 'value',\n listSelectedAttribute: 'selected',\n listSelectedClass: null,\n onClick: null,\n onMouseover: null,\n onMouseout: null,\n mouseoutDelay: 0,\n onStateChange: null,\n boundList: null,\n onConfigured: null,\n configTimeout: 30000,\n noHrefIsMask: true,\n scaleMap: true,\n enableAutoResizeSupport: false, // TODO: Remove in next major release\n autoResize: false,\n autoResizeDelay: 0,\n autoResizeDuration: 0,\n onAutoResize: null,\n areas: []\n },\n shared_defaults: {\n render_highlight: { fade: true },\n render_select: { fade: false },\n staticState: null,\n selected: null\n },\n area_defaults: {\n includeKeys: '',\n isMask: false\n },\n canvas_style: {\n position: 'absolute',\n left: 0,\n top: 0,\n padding: 0,\n border: 0\n },\n hasCanvas: null,\n map_cache: [],\n hooks: {},\n addHook: function (name, callback) {\n this.hooks[name] = (this.hooks[name] || []).push(callback);\n },\n callHooks: function (name, context) {\n $.each(this.hooks[name] || [], function (_, e) {\n e.apply(context);\n });\n },\n utils: {\n when: {\n all: function (deferredArray) {\n // TODO: Promise breaks ES5 support\n // eslint-disable-next-line no-undef\n return Promise.all(deferredArray);\n },\n defer: function () {\n // Deferred is frequently referred to as an anti-pattern largely\n // due to error handling, however to avoid reworking existing\n // APIs and support backwards compat, creating a \"deferred\"\n // polyfill via native promise\n var Deferred = function () {\n // TODO: Promise breaks ES5 support\n // eslint-disable-next-line no-undef\n this.promise = new Promise(\n function (resolve, reject) {\n this.resolve = resolve;\n this.reject = reject;\n }.bind(this)\n );\n\n this.then = this.promise.then.bind(this.promise);\n this.catch = this.promise.catch.bind(this.promise);\n };\n return new Deferred();\n }\n },\n defer: function () {\n return this.when.defer();\n },\n // extends the constructor, returns a new object prototype. Does not refer to the\n // original constructor so is protected if the original object is altered. This way you\n // can \"extend\" an object by replacing it with its subclass.\n subclass: function (BaseClass, constr) {\n var Subclass = function () {\n var me = this,\n args = Array.prototype.slice.call(arguments, 0);\n me.base = BaseClass.prototype;\n me.base.init = function () {\n BaseClass.prototype.constructor.apply(me, args);\n };\n constr.apply(me, args);\n };\n Subclass.prototype = new BaseClass();\n Subclass.prototype.constructor = Subclass;\n return Subclass;\n },\n asArray: function (obj) {\n return obj.constructor === Array ? obj : this.split(obj);\n },\n // clean split: no padding or empty elements\n split: function (text, cb) {\n var i,\n el,\n arr = text.split(',');\n for (i = 0; i < arr.length; i++) {\n // backwards compat for $.trim which would return empty string on null\n // which theoertically should not happen here\n el = arr[i] ? arr[i].trim() : '';\n if (el === '') {\n arr.splice(i, 1);\n } else {\n arr[i] = cb ? cb(el) : el;\n }\n }\n return arr;\n },\n // similar to $.extend but does not add properties (only updates), unless the\n // first argument is an empty object, then all properties will be copied\n updateProps: function (_target, _template) {\n var onlyProps,\n target = _target || {},\n template = $.isEmptyObject(target) ? _template : _target;\n\n //if (template) {\n onlyProps = [];\n $.each(template, function (prop) {\n onlyProps.push(prop);\n });\n //}\n\n $.each(Array.prototype.slice.call(arguments, 1), function (_, src) {\n $.each(src || {}, function (prop) {\n if (!onlyProps || $.inArray(prop, onlyProps) >= 0) {\n var p = src[prop];\n\n if ($.isPlainObject(p)) {\n // not recursive - only copies 1 level of subobjects, and always merges\n target[prop] = $.extend(target[prop] || {}, p);\n } else if (p && p.constructor === Array) {\n target[prop] = p.slice(0);\n } else if (typeof p !== 'undefined') {\n target[prop] = src[prop];\n }\n }\n });\n });\n return target;\n },\n isElement: function (o) {\n return typeof HTMLElement === 'object'\n ? o instanceof HTMLElement\n : o &&\n typeof o === 'object' &&\n o.nodeType === 1 &&\n typeof o.nodeName === 'string';\n },\n /**\n * Basic indexOf implementation for IE7-8. Though we use $.inArray, some jQuery versions will try to\n * use a prototpye on the calling object, defeating the purpose of using $.inArray in the first place.\n *\n * This will be replaced with the array prototype if it's available.\n *\n * @param {Array} arr The array to search\n * @param {Object} target The item to search for\n * @return {Number} The index of the item, or -1 if not found\n */\n indexOf: function (arr, target) {\n if (Array.prototype.indexOf) {\n return Array.prototype.indexOf.call(arr, target);\n } else {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] === target) {\n return i;\n }\n }\n return -1;\n }\n },\n\n // finds element of array or object with a property \"prop\" having value \"val\"\n // if prop is not defined, then just looks for property with value \"val\"\n indexOfProp: function (obj, prop, val) {\n var result = obj.constructor === Array ? -1 : null;\n $.each(obj, function (i, e) {\n if (e && (prop ? e[prop] : e) === val) {\n result = i;\n return false;\n }\n });\n return result;\n },\n // returns \"obj\" if true or false, or \"def\" if not true/false\n boolOrDefault: function (obj, def) {\n return this.isBool(obj) ? obj : def || false;\n },\n isBool: function (obj) {\n return typeof obj === 'boolean';\n },\n isUndef: function (obj) {\n return typeof obj === 'undefined';\n },\n isFunction: function (obj) {\n return typeof obj === 'function';\n },\n isNumeric: function (obj) {\n return !isNaN(parseFloat(obj));\n },\n // evaluates \"obj\", if function, calls it with args\n // (todo - update this to handle variable lenght/more than one arg)\n ifFunction: function (obj, that, args) {\n if (this.isFunction(obj)) {\n obj.call(that, args);\n }\n },\n size: function (image, raw) {\n var u = $.mapster.utils;\n return {\n width: raw\n ? image.width || image.naturalWidth\n : u.imgWidth(image, true),\n height: raw\n ? image.height || image.naturalHeight\n : u.imgHeight(image, true),\n complete: function () {\n return !!this.height && !!this.width;\n }\n };\n },\n\n /**\n * Set the opacity of the element. This is an IE<8 specific function for handling VML.\n * When using VML we must override the \"setOpacity\" utility function (monkey patch ourselves).\n * jQuery does not deal with opacity correctly for VML elements. This deals with that.\n *\n * @param {Element} el The DOM element\n * @param {double} opacity A value between 0 and 1 inclusive.\n */\n\n setOpacity: function (el, opacity) {\n if ($.mapster.hasCanvas()) {\n el.style.opacity = opacity;\n } else {\n $(el).each(function (_, e) {\n if (typeof e.opacity !== 'undefined') {\n e.opacity = opacity;\n } else {\n $(e).css('opacity', opacity);\n }\n });\n }\n },\n\n // fade \"el\" from opacity \"op\" to \"endOp\" over a period of time \"duration\"\n\n fader: (function () {\n var elements = {},\n lastKey = 0,\n fade_func = function (el, op, endOp, duration) {\n var index,\n cbIntervals = duration / 15,\n obj,\n u = $.mapster.utils;\n\n if (typeof el === 'number') {\n obj = elements[el];\n if (!obj) {\n return;\n }\n } else {\n index = u.indexOfProp(elements, null, el);\n if (index) {\n delete elements[index];\n }\n elements[++lastKey] = obj = el;\n el = lastKey;\n }\n\n endOp = endOp || 1;\n\n op =\n op + endOp / cbIntervals > endOp - 0.01\n ? endOp\n : op + endOp / cbIntervals;\n\n u.setOpacity(obj, op);\n if (op < endOp) {\n setTimeout(function () {\n fade_func(el, op, endOp, duration);\n }, 15);\n }\n };\n return fade_func;\n })(),\n getShape: function (areaEl) {\n // per HTML spec, invalid value and missing value default is 'rect'\n // Handling as follows:\n // - Missing/Empty value will be treated as 'rect' per spec\n // - Avoid handling invalid values do to perf impact\n // Note - IM currently does not support shape of 'default' so while its technically\n // a valid attribute value it should not be used.\n // https://html.spec.whatwg.org/multipage/image-maps.html#the-area-element\n return (areaEl.shape || 'rect').toLowerCase();\n },\n hasAttribute: function (el, attrName) {\n var attr = $(el).attr(attrName);\n // For some browsers, `attr` is undefined; for others, `attr` is false.\n return typeof attr !== 'undefined' && attr !== false;\n }\n },\n getBoundList: function (opts, key_list) {\n if (!opts.boundList) {\n return null;\n }\n var index,\n key,\n result = $(),\n list = $.mapster.utils.split(key_list);\n opts.boundList.each(function (_, e) {\n for (index = 0; index < list.length; index++) {\n key = list[index];\n if ($(e).is('[' + opts.listKey + '=\"' + key + '\"]')) {\n result = result.add(e);\n }\n }\n });\n return result;\n },\n getMapDataIndex: function (obj) {\n var img, id;\n switch (obj.tagName && obj.tagName.toLowerCase()) {\n case 'area':\n id = $(obj).parent().attr('name');\n img = $(\"img[usemap='#\" + id + \"']\")[0];\n break;\n case 'img':\n img = obj;\n break;\n }\n return img ? this.utils.indexOfProp(this.map_cache, 'image', img) : -1;\n },\n getMapData: function (obj) {\n var index = this.getMapDataIndex(obj.length ? obj[0] : obj);\n if (index >= 0) {\n return index >= 0 ? this.map_cache[index] : null;\n }\n },\n /**\n * Queue a command to be run after the active async operation has finished\n * @param {MapData} map_data The target MapData object\n * @param {jQuery} that jQuery object on which the command was invoked\n * @param {string} command the ImageMapster method name\n * @param {object[]} args arguments passed to the method\n * @return {bool} true if the command was queued, false if not (e.g. there was no need to)\n */\n queueCommand: function (map_data, that, command, args) {\n if (!map_data) {\n return false;\n }\n if (!map_data.complete || map_data.currentAction) {\n map_data.commands.push({\n that: that,\n command: command,\n args: args\n });\n return true;\n }\n return false;\n },\n unload: function () {\n this.impl.unload();\n this.utils = null;\n this.impl = null;\n $.fn.mapster = null;\n $.mapster = null;\n return $('*').off('.mapster');\n }\n };\n\n // Config for object prototypes\n // first: use only first object (for things that should not apply to lists)\n /// calls back one of two fuinctions, depending on whether an area was obtained.\n // opts: {\n // name: 'method name',\n // key: 'key,\n // args: 'args'\n //\n //}\n // name: name of method (required)\n // args: arguments to re-call with\n // Iterates through all the objects passed, and determines whether it's an area or an image, and calls the appropriate\n // callback for each. If anything is returned from that callback, the process is stopped and that data return. Otherwise,\n // the object itself is returned.\n\n var m = $.mapster,\n u = m.utils,\n ap = Array.prototype;\n\n // jQuery's width() and height() are broken on IE9 in some situations. This tries everything.\n $.each(['width', 'height'], function (_, e) {\n var capProp = e.substr(0, 1).toUpperCase() + e.substr(1);\n // when jqwidth parm is passed, it also checks the jQuery width()/height() property\n // the issue is that jQUery width() can report a valid size before the image is loaded in some browsers\n // without it, we can read zero even when image is loaded in other browsers if its not visible\n // we must still check because stuff like adblock can temporarily block it\n // what a goddamn headache\n u['img' + capProp] = function (img, jqwidth) {\n return (\n (jqwidth ? $(img)[e]() : 0) ||\n img[e] ||\n img['natural' + capProp] ||\n img['client' + capProp] ||\n img['offset' + capProp]\n );\n };\n });\n\n /**\n * The Method object encapsulates the process of testing an ImageMapster method to see if it's being\n * invoked on an image, or an area; then queues the command if the MapData is in an active state.\n *\n * @param {[jQuery]} that The target of the invocation\n * @param {[function]} func_map The callback if the target is an image map\n * @param {[function]} func_area The callback if the target is an area\n * @param {[object]} opt Options: { key: a map key if passed explicitly\n * name: the command name, if it can be queued,\n * args: arguments to the method\n * }\n */\n\n m.Method = function (that, func_map, func_area, opts) {\n var me = this;\n me.name = opts.name;\n me.output = that;\n me.input = that;\n me.first = opts.first || false;\n me.args = opts.args ? ap.slice.call(opts.args, 0) : [];\n me.key = opts.key;\n me.func_map = func_map;\n me.func_area = func_area;\n //$.extend(me, opts);\n me.name = opts.name;\n me.allowAsync = opts.allowAsync || false;\n };\n m.Method.prototype = {\n constructor: m.Method,\n go: function () {\n var i,\n data,\n ar,\n len,\n result,\n src = this.input,\n area_list = [],\n me = this;\n\n len = src.length;\n for (i = 0; i < len; i++) {\n data = $.mapster.getMapData(src[i]);\n if (data) {\n if (\n !me.allowAsync &&\n m.queueCommand(data, me.input, me.name, me.args)\n ) {\n if (this.first) {\n result = '';\n }\n continue;\n }\n\n ar = data.getData(src[i].nodeName === 'AREA' ? src[i] : this.key);\n if (ar) {\n if ($.inArray(ar, area_list) < 0) {\n area_list.push(ar);\n }\n } else {\n result = this.func_map.apply(data, me.args);\n }\n if (this.first || typeof result !== 'undefined') {\n break;\n }\n }\n }\n // if there were areas, call the area function for each unique group\n $(area_list).each(function (_, e) {\n result = me.func_area.apply(e, me.args);\n });\n\n if (typeof result !== 'undefined') {\n return result;\n } else {\n return this.output;\n }\n }\n };\n\n $.mapster.impl = (function () {\n var me = {},\n addMap = function (map_data) {\n return m.map_cache.push(map_data) - 1;\n },\n removeMap = function (map_data) {\n m.map_cache.splice(map_data.index, 1);\n for (var i = m.map_cache.length - 1; i >= map_data.index; i--) {\n m.map_cache[i].index--;\n }\n };\n\n /**\n * Test whether the browser supports VML. Credit: google.\n * http://stackoverflow.com/questions/654112/how-do-you-detect-support-for-vml-or-svg-in-a-browser\n *\n * @return {bool} true if vml is supported, false if not\n */\n\n function hasVml() {\n var a = $('
').appendTo('body');\n a.html('');\n\n var b = a[0].firstChild;\n b.style.behavior = 'url(#default#VML)';\n var has = b ? typeof b.adj === 'object' : true;\n a.remove();\n return has;\n }\n\n /**\n * Return a reference to the IE namespaces object, if available, or an empty object otherwise\n * @return {obkect} The document.namespaces object.\n */\n function namespaces() {\n return typeof document.namespaces === 'object'\n ? document.namespaces\n : null;\n }\n\n /**\n * Test for the presence of HTML5 Canvas support. This also checks to see if excanvas.js has been\n * loaded and is faking it; if so, we assume that canvas is not supported.\n *\n * @return {bool} true if HTML5 canvas support, false if not\n */\n\n function hasCanvas() {\n var d = namespaces();\n // when g_vml_ is present, then we can be sure excanvas is active, meaning there's not a real canvas.\n\n return d && d.g_vml_\n ? false\n : $('')[0].getContext\n ? true\n : false;\n }\n\n /**\n * Merge new area data into existing area options on a MapData object. Used for rebinding.\n *\n * @param {[MapData]} map_data The MapData object\n * @param {[object[]]} areas areas array to merge\n */\n\n function merge_areas(map_data, areas) {\n var ar,\n index,\n map_areas = map_data.options.areas;\n\n if (areas) {\n $.each(areas, function (_, e) {\n // Issue #68 - ignore invalid data in areas array\n\n if (!e || !e.key) {\n return;\n }\n\n index = u.indexOfProp(map_areas, 'key', e.key);\n\n if (index >= 0) {\n $.extend(map_areas[index], e);\n } else {\n map_areas.push(e);\n }\n ar = map_data.getDataForKey(e.key);\n if (ar) {\n $.extend(ar.options, e);\n }\n });\n }\n }\n function merge_options(map_data, options) {\n var temp_opts = u.updateProps({}, options);\n delete temp_opts.areas;\n\n u.updateProps(map_data.options, temp_opts);\n\n merge_areas(map_data, options.areas);\n // refresh the area_option template\n u.updateProps(map_data.area_options, map_data.options);\n }\n\n // Most methods use the \"Method\" object which handles figuring out whether it's an image or area called and\n // parsing key parameters. The constructor wants:\n // this, the jQuery object\n // a function that is called when an image was passed (with a this context of the MapData)\n // a function that is called when an area was passed (with a this context of the AreaData)\n // options: first = true means only the first member of a jQuery object is handled\n // key = the key parameters passed\n // defaultReturn: a value to return other than the jQuery object (if its not chainable)\n // args: the arguments\n // Returns a comma-separated list of user-selected areas. \"staticState\" areas are not considered selected for the purposes of this method.\n\n me.get = function (key) {\n var md = m.getMapData(this);\n if (!(md && md.complete)) {\n throw \"Can't access data until binding complete.\";\n }\n\n return new m.Method(\n this,\n function () {\n // map_data return\n return this.getSelected();\n },\n function () {\n return this.isSelected();\n },\n {\n name: 'get',\n args: arguments,\n key: key,\n first: true,\n allowAsync: true,\n defaultReturn: ''\n }\n ).go();\n };\n me.data = function (key) {\n return new m.Method(\n this,\n null,\n function () {\n return this;\n },\n { name: 'data', args: arguments, key: key }\n ).go();\n };\n\n // Set or return highlight state.\n // $(img).mapster('highlight') -- return highlighted area key, or null if none\n // $(area).mapster('highlight') -- highlight an area\n // $(img).mapster('highlight','area_key') -- highlight an area\n // $(img).mapster('highlight',false) -- remove highlight\n me.highlight = function (key) {\n return new m.Method(\n this,\n function () {\n if (key === false) {\n this.ensureNoHighlight();\n } else {\n var id = this.highlightId;\n return id >= 0 ? this.data[id].key : null;\n }\n },\n function () {\n this.highlight();\n },\n { name: 'highlight', args: arguments, key: key, first: true }\n ).go();\n };\n // Return the primary keys for an area or group key.\n // $(area).mapster('key')\n // includes all keys (not just primary keys)\n // $(area).mapster('key',true)\n // $(img).mapster('key','group-key')\n\n // $(img).mapster('key','group-key', true)\n me.keys = function (key, all) {\n var keyList = [],\n md = m.getMapData(this);\n\n if (!(md && md.complete)) {\n throw \"Can't access data until binding complete.\";\n }\n\n function addUniqueKeys(ad) {\n var areas,\n keys = [];\n if (!all) {\n keys.push(ad.key);\n } else {\n areas = ad.areas();\n $.each(areas, function (_, e) {\n keys = keys.concat(e.keys);\n });\n }\n $.each(keys, function (_, e) {\n if ($.inArray(e, keyList) < 0) {\n keyList.push(e);\n }\n });\n }\n\n if (!(md && md.complete)) {\n return '';\n }\n if (typeof key === 'string') {\n if (all) {\n addUniqueKeys(md.getDataForKey(key));\n } else {\n keyList = [md.getKeysForGroup(key)];\n }\n } else {\n all = key;\n this.each(function (_, e) {\n if (e.nodeName === 'AREA') {\n addUniqueKeys(md.getDataForArea(e));\n }\n });\n }\n return keyList.join(',');\n };\n me.select = function () {\n me.set.call(this, true);\n };\n me.deselect = function () {\n me.set.call(this, false);\n };\n\n /**\n * Select or unselect areas. Areas can be identified by a single string key, a comma-separated list of keys,\n * or an array of strings.\n *\n *\n * @param {boolean} selected Determines whether areas are selected or deselected\n * @param {string|string[]} key A string, comma-separated string, or array of strings indicating\n * the areas to select or deselect\n * @param {object} options Rendering options to apply when selecting an area\n */\n\n me.set = function (selected, key, options) {\n var lastMap,\n map_data,\n opts = options,\n key_list,\n area_list; // array of unique areas passed\n\n function setSelection(ar) {\n var newState = selected;\n if (ar) {\n switch (selected) {\n case true:\n ar.select(opts);\n break;\n case false:\n ar.deselect(true);\n break;\n default:\n newState = ar.toggle(opts);\n break;\n }\n return newState;\n }\n }\n function addArea(ar) {\n if (ar && $.inArray(ar, area_list) < 0) {\n area_list.push(ar);\n key_list += (key_list === '' ? '' : ',') + ar.key;\n }\n }\n // Clean up after a group that applied to the same map\n function finishSetForMap(map_data) {\n $.each(area_list, function (_, el) {\n setSelection(el);\n });\n if (!selected) {\n map_data.removeSelectionFinish();\n }\n }\n\n this.filter('img,area').each(function (_, e) {\n var keys;\n map_data = m.getMapData(e);\n\n if (map_data !== lastMap) {\n if (lastMap) {\n finishSetForMap(lastMap);\n }\n\n area_list = [];\n key_list = '';\n }\n\n if (map_data) {\n keys = '';\n if (e.nodeName.toUpperCase() === 'IMG') {\n if (!m.queueCommand(map_data, $(e), 'set', [selected, key, opts])) {\n if (key instanceof Array) {\n if (key.length) {\n keys = key.join(',');\n }\n } else {\n keys = key;\n }\n\n if (keys) {\n $.each(u.split(keys), function (_, key) {\n addArea(map_data.getDataForKey(key.toString()));\n lastMap = map_data;\n });\n }\n }\n } else {\n opts = key;\n if (!m.queueCommand(map_data, $(e), 'set', [selected, opts])) {\n addArea(map_data.getDataForArea(e));\n lastMap = map_data;\n }\n }\n }\n });\n\n if (map_data) {\n finishSetForMap(map_data);\n }\n\n return this;\n };\n me.unbind = function (preserveState) {\n return new m.Method(\n this,\n function () {\n this.clearEvents();\n this.clearMapData(preserveState);\n removeMap(this);\n },\n null,\n { name: 'unbind', args: arguments }\n ).go();\n };\n\n // refresh options and update selection information.\n me.rebind = function (options) {\n return new m.Method(\n this,\n function () {\n var me = this;\n\n me.complete = false;\n me.configureOptions(options);\n me.bindImages().then(function () {\n me.buildDataset(true);\n me.complete = true;\n me.onConfigured();\n });\n //this.redrawSelections();\n },\n null,\n {\n name: 'rebind',\n args: arguments\n }\n ).go();\n };\n // get options. nothing or false to get, or \"true\" to get effective options (versus passed options)\n me.get_options = function (key, effective) {\n var eff = u.isBool(key) ? key : effective; // allow 2nd parm as \"effective\" when no key\n return new m.Method(\n this,\n function () {\n var opts = $.extend({}, this.options);\n if (eff) {\n opts.render_select = u.updateProps(\n {},\n m.render_defaults,\n opts,\n opts.render_select\n );\n\n opts.render_highlight = u.updateProps(\n {},\n m.render_defaults,\n opts,\n opts.render_highlight\n );\n }\n return opts;\n },\n function () {\n return eff ? this.effectiveOptions() : this.options;\n },\n {\n name: 'get_options',\n args: arguments,\n first: true,\n allowAsync: true,\n key: key\n }\n ).go();\n };\n\n // set options - pass an object with options to set,\n me.set_options = function (options) {\n return new m.Method(\n this,\n function () {\n merge_options(this, options);\n },\n null,\n {\n name: 'set_options',\n args: arguments\n }\n ).go();\n };\n me.unload = function () {\n var i;\n for (i = m.map_cache.length - 1; i >= 0; i--) {\n if (m.map_cache[i]) {\n me.unbind.call($(m.map_cache[i].image));\n }\n }\n me.graphics = null;\n };\n\n me.snapshot = function () {\n return new m.Method(\n this,\n function () {\n $.each(this.data, function (_, e) {\n e.selected = false;\n });\n\n this.base_canvas = this.graphics.createVisibleCanvas(this);\n $(this.image).before(this.base_canvas);\n },\n null,\n { name: 'snapshot' }\n ).go();\n };\n\n // do not queue this function\n\n me.state = function () {\n var md,\n result = null;\n $(this).each(function (_, e) {\n if (e.nodeName === 'IMG') {\n md = m.getMapData(e);\n if (md) {\n result = md.state();\n }\n return false;\n }\n });\n return result;\n };\n\n me.bind = function (options) {\n return this.each(function (_, e) {\n var img, map, usemap, md;\n\n // save ref to this image even if we can't access it yet. commands will be queued\n img = $(e);\n\n md = m.getMapData(e);\n\n // if already bound completely, do a total rebind\n\n if (md) {\n me.unbind.apply(img);\n if (!md.complete) {\n // will be queued\n return true;\n }\n md = null;\n }\n\n // ensure it's a valid image\n // jQuery bug with Opera, results in full-url#usemap being returned from jQuery's attr.\n // So use raw getAttribute instead.\n\n usemap = this.getAttribute('usemap');\n map = usemap && $('map[name=\"' + usemap.substr(1) + '\"]');\n if (!(img.is('img') && usemap && map.length > 0)) {\n return true;\n }\n\n // sorry - your image must have border:0, things are too unpredictable otherwise.\n img.css('border', 0);\n\n if (!md) {\n md = new m.MapData(this, options);\n\n md.index = addMap(md);\n md.map = map;\n md.bindImages().then(function () {\n md.initialize();\n });\n }\n });\n };\n\n me.init = function (useCanvas) {\n var style, shapes;\n\n // for testing/debugging, use of canvas can be forced by initializing\n // manually with \"true\" or \"false\". But generally we test for it.\n\n m.hasCanvas = function () {\n if (!u.isBool(m.hasCanvas.value)) {\n m.hasCanvas.value = u.isBool(useCanvas) ? useCanvas : hasCanvas();\n }\n return m.hasCanvas.value;\n };\n\n m.hasVml = function () {\n if (!u.isBool(m.hasVml.value)) {\n // initialize VML the first time we detect its presence.\n var d = namespaces();\n\n if (d && !d.v) {\n d.add('v', 'urn:schemas-microsoft-com:vml');\n style = document.createStyleSheet();\n shapes = [\n 'shape',\n 'rect',\n 'oval',\n 'circ',\n 'fill',\n 'stroke',\n 'imagedata',\n 'group',\n 'textbox'\n ];\n $.each(shapes, function (_, el) {\n style.addRule(\n 'v\\\\:' + el,\n 'behavior: url(#default#VML); antialias:true'\n );\n });\n }\n m.hasVml.value = hasVml();\n }\n\n return m.hasVml.value;\n };\n\n $.extend(m.defaults, m.render_defaults, m.shared_defaults);\n $.extend(m.area_defaults, m.render_defaults, m.shared_defaults);\n };\n me.test = function (obj) {\n return eval(obj);\n };\n return me;\n })();\n $.mapster.impl.init();\n})(jQuery);\n\n/*\n graphics.js\n Graphics object handles all rendering.\n*/\n\n(function ($) {\n 'use strict';\n\n var p,\n m = $.mapster,\n u = m.utils,\n canvasMethods,\n vmlMethods;\n\n /**\n * Implemenation to add each area in an AreaData object to the canvas\n * @param {Graphics} graphics The target graphics object\n * @param {AreaData} areaData The AreaData object (a collection of area elements and metadata)\n * @param {object} options Rendering options to apply when rendering this group of areas\n */\n function addShapeGroupImpl(graphics, areaData, options) {\n var me = graphics,\n md = me.map_data,\n isMask = options.isMask;\n\n // first get area options. Then override fade for selecting, and finally merge in the\n // \"select\" effect options.\n\n $.each(areaData.areas(), function (_, e) {\n options.isMask = isMask || (e.nohref && md.options.noHrefIsMask);\n me.addShape(e, options);\n });\n\n // it's faster just to manipulate the passed options isMask property and restore it, than to\n // copy the object each time\n\n options.isMask = isMask;\n }\n\n /**\n * Convert a hex value to decimal\n * @param {string} hex A hexadecimal toString\n * @return {int} Integer represenation of the hex string\n */\n\n function hex_to_decimal(hex) {\n return Math.max(0, Math.min(parseInt(hex, 16), 255));\n }\n function css3color(color, opacity) {\n return (\n 'rgba(' +\n hex_to_decimal(color.substr(0, 2)) +\n ',' +\n hex_to_decimal(color.substr(2, 2)) +\n ',' +\n hex_to_decimal(color.substr(4, 2)) +\n ',' +\n opacity +\n ')'\n );\n }\n /**\n * An object associated with a particular map_data instance to manage renderin.\n * @param {MapData} map_data The MapData object bound to this instance\n */\n\n m.Graphics = function (map_data) {\n //$(window).unload($.mapster.unload);\n // create graphics functions for canvas and vml browsers. usage:\n // 1) init with map_data, 2) call begin with canvas to be used (these are separate b/c may not require canvas to be specified\n // 3) call add_shape_to for each shape or mask, 4) call render() to finish\n\n var me = this;\n me.active = false;\n me.canvas = null;\n me.width = 0;\n me.height = 0;\n me.shapes = [];\n me.masks = [];\n me.map_data = map_data;\n };\n\n p = m.Graphics.prototype = {\n constructor: m.Graphics,\n\n /**\n * Initiate a graphics request for a canvas\n * @param {Element} canvas The canvas element that is the target of this operation\n * @param {string} [elementName] The name to assign to the element (VML only)\n */\n\n begin: function (canvas, elementName) {\n var c = $(canvas);\n\n this.elementName = elementName;\n this.canvas = canvas;\n\n this.width = c.width();\n this.height = c.height();\n this.shapes = [];\n this.masks = [];\n this.active = true;\n },\n\n /**\n * Add an area to be rendered to this canvas.\n * @param {MapArea} mapArea The MapArea object to render\n * @param {object} options An object containing any rendering options that should override the\n * defaults for the area\n */\n\n addShape: function (mapArea, options) {\n var addto = options.isMask ? this.masks : this.shapes;\n addto.push({ mapArea: mapArea, options: options });\n },\n\n /**\n * Create a canvas that is sized and styled for the MapData object\n * @param {MapData} mapData The MapData object that will receive this new canvas\n * @return {Element} A canvas element\n */\n\n createVisibleCanvas: function (mapData) {\n return $(this.createCanvasFor(mapData))\n .addClass('mapster_el')\n .css(m.canvas_style)[0];\n },\n\n /**\n * Add a group of shapes from an AreaData object to the canvas\n *\n * @param {AreaData} areaData An AreaData object (a set of area elements)\n * @param {string} mode The rendering mode, \"select\" or \"highlight\". This determines the target\n * canvas and which default options to use.\n * @param {striong} options Rendering options\n */\n\n addShapeGroup: function (areaData, mode, options) {\n // render includeKeys first - because they could be masks\n var me = this,\n list,\n name,\n canvas,\n map_data = this.map_data,\n opts = areaData.effectiveRenderOptions(mode);\n\n if (options) {\n $.extend(opts, options);\n }\n\n if (mode === 'select') {\n name = 'static_' + areaData.areaId.toString();\n canvas = map_data.base_canvas;\n } else {\n canvas = map_data.overlay_canvas;\n }\n\n me.begin(canvas, name);\n\n if (opts.includeKeys) {\n list = u.split(opts.includeKeys);\n $.each(list, function (_, e) {\n var areaData = map_data.getDataForKey(e.toString());\n addShapeGroupImpl(\n me,\n areaData,\n areaData.effectiveRenderOptions(mode)\n );\n });\n }\n\n addShapeGroupImpl(me, areaData, opts);\n me.render();\n if (opts.fade) {\n // fading requires special handling for IE. We must access the fill elements directly. The fader also has to deal with\n // the \"opacity\" attribute (not css)\n\n u.fader(\n m.hasCanvas()\n ? canvas\n : $(canvas).find('._fill').not('.mapster_mask'),\n 0,\n m.hasCanvas() ? 1 : opts.fillOpacity,\n opts.fadeDuration\n );\n }\n }\n\n // These prototype methods are implementation dependent\n };\n\n function noop() {}\n\n // configure remaining prototype methods for ie or canvas-supporting browser\n\n canvasMethods = {\n renderShape: function (context, mapArea, offset) {\n var i,\n c = mapArea.coords(null, offset);\n\n switch (mapArea.shape) {\n case 'rect':\n case 'rectangle':\n context.rect(c[0], c[1], c[2] - c[0], c[3] - c[1]);\n break;\n case 'poly':\n case 'polygon':\n context.moveTo(c[0], c[1]);\n\n for (i = 2; i < mapArea.length; i += 2) {\n context.lineTo(c[i], c[i + 1]);\n }\n context.lineTo(c[0], c[1]);\n break;\n case 'circ':\n case 'circle':\n context.arc(c[0], c[1], c[2], 0, Math.PI * 2, false);\n break;\n }\n },\n addAltImage: function (context, image, mapArea, options) {\n context.beginPath();\n\n this.renderShape(context, mapArea);\n context.closePath();\n context.clip();\n\n context.globalAlpha = options.altImageOpacity || options.fillOpacity;\n\n context.drawImage(\n image,\n 0,\n 0,\n mapArea.owner.scaleInfo.width,\n mapArea.owner.scaleInfo.height\n );\n },\n render: function () {\n // firefox 6.0 context.save() seems to be broken. to work around, we have to draw the contents on one temp canvas,\n // the mask on another, and merge everything. ugh. fixed in 1.2.2. unfortunately this is a lot more code for masks,\n // but no other way around it that i can see.\n\n var maskCanvas,\n maskContext,\n me = this,\n md = me.map_data,\n hasMasks = me.masks.length,\n shapeCanvas = me.createCanvasFor(md),\n shapeContext = shapeCanvas.getContext('2d'),\n context = me.canvas.getContext('2d');\n\n if (hasMasks) {\n maskCanvas = me.createCanvasFor(md);\n maskContext = maskCanvas.getContext('2d');\n maskContext.clearRect(0, 0, maskCanvas.width, maskCanvas.height);\n\n $.each(me.masks, function (_, e) {\n maskContext.save();\n maskContext.beginPath();\n me.renderShape(maskContext, e.mapArea);\n maskContext.closePath();\n maskContext.clip();\n maskContext.lineWidth = 0;\n maskContext.fillStyle = '#000';\n maskContext.fill();\n maskContext.restore();\n });\n }\n\n $.each(me.shapes, function (_, s) {\n shapeContext.save();\n if (s.options.fill) {\n if (s.options.altImageId) {\n me.addAltImage(\n shapeContext,\n md.images[s.options.altImageId],\n s.mapArea,\n s.options\n );\n } else {\n shapeContext.beginPath();\n me.renderShape(shapeContext, s.mapArea);\n shapeContext.closePath();\n //shapeContext.clip();\n shapeContext.fillStyle = css3color(\n s.options.fillColor,\n s.options.fillOpacity\n );\n shapeContext.fill();\n }\n }\n shapeContext.restore();\n });\n\n // render strokes at end since masks get stroked too\n\n $.each(me.shapes.concat(me.masks), function (_, s) {\n var offset = s.options.strokeWidth === 1 ? 0.5 : 0;\n // offset applies only when stroke width is 1 and stroke would render between pixels.\n\n if (s.options.stroke) {\n shapeContext.save();\n shapeContext.strokeStyle = css3color(\n s.options.strokeColor,\n s.options.strokeOpacity\n );\n shapeContext.lineWidth = s.options.strokeWidth;\n\n shapeContext.beginPath();\n\n me.renderShape(shapeContext, s.mapArea, offset);\n shapeContext.closePath();\n shapeContext.stroke();\n shapeContext.restore();\n }\n });\n\n if (hasMasks) {\n // render the new shapes against the mask\n\n maskContext.globalCompositeOperation = 'source-out';\n maskContext.drawImage(shapeCanvas, 0, 0);\n\n // flatten into the main canvas\n context.drawImage(maskCanvas, 0, 0);\n } else {\n context.drawImage(shapeCanvas, 0, 0);\n }\n\n me.active = false;\n return me.canvas;\n },\n\n // create a canvas mimicing dimensions of an existing element\n createCanvasFor: function (md) {\n return $(\n ''\n )[0];\n },\n clearHighlight: function () {\n var c = this.map_data.overlay_canvas;\n c.getContext('2d').clearRect(0, 0, c.width, c.height);\n },\n // Draw all items from selected_list to a new canvas, then swap with the old one. This is used to delete items when using canvases.\n refreshSelections: function () {\n var canvas_temp,\n map_data = this.map_data;\n // draw new base canvas, then swap with the old one to avoid flickering\n canvas_temp = map_data.base_canvas;\n\n map_data.base_canvas = this.createVisibleCanvas(map_data);\n $(map_data.base_canvas).hide();\n $(canvas_temp).before(map_data.base_canvas);\n\n map_data.redrawSelections();\n\n $(map_data.base_canvas).show();\n $(canvas_temp).remove();\n }\n };\n\n vmlMethods = {\n renderShape: function (mapArea, options, cssclass) {\n var me = this,\n fill,\n stroke,\n e,\n t_fill,\n el_name,\n el_class,\n template,\n c = mapArea.coords();\n el_name = me.elementName ? 'name=\"' + me.elementName + '\" ' : '';\n el_class = cssclass ? 'class=\"' + cssclass + '\" ' : '';\n\n t_fill =\n '';\n\n stroke = options.stroke\n ? ' strokeweight=' +\n options.strokeWidth +\n ' stroked=\"t\" strokecolor=\"#' +\n options.strokeColor +\n '\"'\n : ' stroked=\"f\"';\n\n fill = options.fill ? ' filled=\"t\"' : ' filled=\"f\"';\n\n switch (mapArea.shape) {\n case 'rect':\n case 'rectangle':\n template =\n '' +\n t_fill +\n '';\n break;\n case 'poly':\n case 'polygon':\n template =\n '' +\n t_fill +\n '';\n break;\n case 'circ':\n case 'circle':\n template =\n '' +\n t_fill +\n '';\n break;\n }\n e = $(template);\n $(me.canvas).append(e);\n\n return e;\n },\n render: function () {\n var opts,\n me = this;\n\n $.each(this.shapes, function (_, e) {\n me.renderShape(e.mapArea, e.options);\n });\n\n if (this.masks.length) {\n $.each(this.masks, function (_, e) {\n opts = u.updateProps({}, e.options, {\n fillOpacity: 1,\n fillColor: e.options.fillColorMask\n });\n me.renderShape(e.mapArea, opts, 'mapster_mask');\n });\n }\n\n this.active = false;\n return this.canvas;\n },\n\n createCanvasFor: function (md) {\n var w = md.scaleInfo.width,\n h = md.scaleInfo.height;\n return $(\n ''\n )[0];\n },\n\n clearHighlight: function () {\n $(this.map_data.overlay_canvas).children().remove();\n },\n // remove single or all selections\n removeSelections: function (area_id) {\n if (area_id >= 0) {\n $(this.map_data.base_canvas)\n .find('[name=\"static_' + area_id.toString() + '\"]')\n .remove();\n } else {\n $(this.map_data.base_canvas).children().remove();\n }\n }\n };\n\n // for all methods with two implemenatations, add a function that will automatically replace itself with the correct\n // method on first invocation\n\n $.each(\n [\n 'renderShape',\n 'addAltImage',\n 'render',\n 'createCanvasFor',\n 'clearHighlight',\n 'removeSelections',\n 'refreshSelections'\n ],\n function (_, e) {\n p[e] = (function (method) {\n return function () {\n p[method] =\n (m.hasCanvas() ? canvasMethods[method] : vmlMethods[method]) ||\n noop;\n\n return p[method].apply(this, arguments);\n };\n })(e);\n }\n );\n})(jQuery);\n\n/*\n mapimage.js\n The MapImage object, repesents an instance of a single bound image map\n*/\n\n(function ($) {\n 'use strict';\n\n var m = $.mapster,\n u = m.utils,\n ap = [],\n configCheckInterval = 50;\n /**\n * An object encapsulating all the images used by a MapData.\n */\n\n m.MapImages = function (owner) {\n this.owner = owner;\n this.clear();\n };\n\n m.MapImages.prototype = {\n constructor: m.MapImages,\n\n /* interface to make this array-like */\n\n slice: function () {\n return ap.slice.apply(this, arguments);\n },\n splice: function () {\n ap.slice.apply(this.status, arguments);\n var result = ap.slice.apply(this, arguments);\n return result;\n },\n\n /**\n * a boolean value indicates whether all images are done loading\n * @return {bool} true when all are done\n */\n complete: function () {\n return $.inArray(false, this.status) < 0;\n },\n\n /**\n * Save an image in the images array and return its index\n * @param {Image} image An Image object\n * @return {int} the index of the image\n */\n\n _add: function (image) {\n var index = ap.push.call(this, image) - 1;\n this.status[index] = false;\n return index;\n },\n\n /**\n * Return the index of an Image within the images array\n * @param {Image} img An Image\n * @return {int} the index within the array, or -1 if it was not found\n */\n\n indexOf: function (image) {\n return u.indexOf(this, image);\n },\n\n /**\n * Clear this object and reset it to its initial state after binding.\n */\n\n clear: function () {\n var me = this;\n\n if (me.ids && me.ids.length > 0) {\n $.each(me.ids, function (_, e) {\n delete me[e];\n });\n }\n\n /**\n * A list of the cross-reference IDs bound to this object\n * @type {string[]}\n */\n\n me.ids = [];\n\n /**\n * Length property for array-like behavior, set to zero when initializing. Array prototype\n * methods will update it after that.\n *\n * @type {int}\n */\n\n me.length = 0;\n\n /**\n * the loaded status of the corresponding image\n * @type {boolean[]}\n */\n\n me.status = [];\n\n // actually erase the images\n\n me.splice(0);\n },\n\n /**\n * Bind an image to the map and add it to the queue to be loaded; return an ID that\n * can be used to reference the\n *\n * @param {Image|string} image An Image object or a URL to an image\n * @param {string} [id] An id to refer to this image\n * @returns {int} an ID referencing the index of the image object in\n * map_data.images\n */\n\n add: function (image, id) {\n var index,\n src,\n me = this;\n\n if (!image) {\n return;\n }\n\n if (typeof image === 'string') {\n src = image;\n image = me[src];\n if (typeof image === 'object') {\n return me.indexOf(image);\n }\n\n image = $('').addClass('mapster_el').hide();\n\n index = me._add(image[0]);\n\n image\n .on('load.mapster', function (e) {\n me.imageLoaded.call(me, e);\n })\n .on('error.mapster', function (e) {\n me.imageLoadError.call(me, e);\n });\n\n image.attr('src', src);\n } else {\n // use attr because we want the actual source, not the resolved path the browser will return directly calling image.src\n\n index = me._add($(image)[0]);\n }\n if (id) {\n if (this[id]) {\n throw (\n id + ' is already used or is not available as an altImage alias.'\n );\n }\n me.ids.push(id);\n me[id] = me[index];\n }\n return index;\n },\n\n /**\n * Bind the images in this object,\n * @return {Promise} a promise that resolves when the images have finished loading\n */\n\n bind: function () {\n var me = this,\n promise,\n triesLeft = me.owner.options.configTimeout / configCheckInterval,\n /* A recursive function to continue checking that the images have been\n loaded until a timeout has elapsed */\n\n check = function () {\n var i;\n\n // refresh status of images\n\n i = me.length;\n\n while (i-- > 0) {\n if (!me.isLoaded(i)) {\n break;\n }\n }\n\n // check to see if every image has already been loaded\n\n if (me.complete()) {\n me.resolve();\n } else {\n // to account for failure of onLoad to fire in rare situations\n if (triesLeft-- > 0) {\n me.imgTimeout = window.setTimeout(function () {\n check.call(me, true);\n }, configCheckInterval);\n } else {\n me.imageLoadError.call(me);\n }\n }\n };\n\n promise = me.deferred = u.defer();\n\n check();\n return promise;\n },\n\n resolve: function () {\n var me = this,\n resolver = me.deferred;\n\n if (resolver) {\n // Make a copy of the resolver before calling & removing it to ensure\n // it is not called twice\n me.deferred = null;\n resolver.resolve();\n }\n },\n\n /**\n * Event handler for image onload\n * @param {object} e jQuery event data\n */\n\n imageLoaded: function (e) {\n var me = this,\n index = me.indexOf(e.target);\n\n if (index >= 0) {\n me.status[index] = true;\n if ($.inArray(false, me.status) < 0) {\n me.resolve();\n }\n }\n },\n\n /**\n * Event handler for onload error\n * @param {object} e jQuery event data\n */\n\n imageLoadError: function (e) {\n clearTimeout(this.imgTimeout);\n this.triesLeft = 0;\n var err = e\n ? 'The image ' + e.target.src + ' failed to load.'\n : 'The images never seemed to finish loading. You may just need to increase the configTimeout if images could take a long time to load.';\n throw err;\n },\n /**\n * Test if the image at specificed index has finished loading\n * @param {int} index The image index\n * @return {boolean} true if loaded, false if not\n */\n\n isLoaded: function (index) {\n var img,\n me = this,\n status = me.status;\n\n if (status[index]) {\n return true;\n }\n img = me[index];\n\n if (typeof img.complete !== 'undefined') {\n status[index] = img.complete;\n } else {\n status[index] = !!u.imgWidth(img);\n }\n // if complete passes, the image is loaded, but may STILL not be available because of stuff like adblock.\n // make sure it is.\n\n return status[index];\n }\n };\n})(jQuery);\n\n/*\n mapdata.js\n The MapData object, repesents an instance of a single bound image map\n*/\n\n(function ($) {\n 'use strict';\n\n var m = $.mapster,\n u = m.utils;\n\n /**\n * Set default values for MapData object properties\n * @param {MapData} me The MapData object\n */\n\n function initializeDefaults(me) {\n $.extend(me, {\n complete: false, // (bool) when configuration is complete\n map: null, // ($) the image map\n base_canvas: null, // (canvas|var) where selections are rendered\n overlay_canvas: null, // (canvas|var) where highlights are rendered\n commands: [], // {} commands that were run before configuration was completed (b/c images weren't loaded)\n data: [], // MapData[] area groups\n mapAreas: [], // MapArea[] list. AreaData entities contain refs to this array, so options are stored with each.\n _xref: {}, // (int) xref of mapKeys to data[]\n highlightId: -1, // (int) the currently highlighted element.\n currentAreaId: -1,\n _tooltip_events: [], // {} info on events we bound to a tooltip container, so we can properly unbind them\n scaleInfo: null, // {} info about the image size, scaling, defaults\n index: -1, // index of this in map_cache - so we have an ID to use for wraper div\n activeAreaEvent: null,\n autoResizeTimer: null // tracks autoresize timer based on options.autoResizeDelay\n });\n }\n\n /**\n * Return an array of all image-containing options from an options object;\n * that is, containers that may have an \"altImage\" property\n *\n * @param {object} obj An options object\n * @return {object[]} An array of objects\n */\n function getOptionImages(obj) {\n return [obj, obj.render_highlight, obj.render_select];\n }\n\n /**\n * Parse all the altImage references, adding them to the library so they can be preloaded\n * and aliased.\n *\n * @param {MapData} me The MapData object on which to operate\n */\n function configureAltImages(me) {\n var opts = me.options,\n mi = me.images;\n\n // add alt images\n\n if (m.hasCanvas()) {\n // map altImage library first\n\n $.each(opts.altImages || {}, function (i, e) {\n mi.add(e, i);\n });\n\n // now find everything else\n\n $.each([opts].concat(opts.areas), function (_, e) {\n $.each(getOptionImages(e), function (_, e2) {\n if (e2 && e2.altImage) {\n e2.altImageId = mi.add(e2.altImage);\n }\n });\n });\n }\n\n // set area_options\n me.area_options = u.updateProps(\n {}, // default options for any MapArea\n m.area_defaults,\n opts\n );\n }\n\n /**\n * Queue a mouse move action based on current delay settings\n * (helper for mouseover/mouseout handlers)\n *\n * @param {MapData} me The MapData context\n * @param {number} delay The number of milliseconds to delay the action\n * @param {AreaData} area AreaData affected\n * @param {Deferred} deferred A deferred object to return (instead of a new one)\n * @return {Promise} A promise that resolves when the action is completed\n */\n function queueMouseEvent(me, delay, area, deferred) {\n deferred = deferred || u.when.defer();\n\n function cbFinal(areaId) {\n if (me.currentAreaId !== areaId && me.highlightId >= 0) {\n deferred.resolve({ completeAction: true });\n }\n }\n if (me.activeAreaEvent) {\n window.clearTimeout(me.activeAreaEvent);\n me.activeAreaEvent = 0;\n }\n if (delay < 0) {\n deferred.resolve({ completeAction: false });\n } else {\n if (area.owner.currentAction || delay) {\n me.activeAreaEvent = window.setTimeout(\n (function () {\n return function () {\n queueMouseEvent(me, 0, area, deferred);\n };\n })(area),\n delay || 100\n );\n } else {\n cbFinal(area.areaId);\n }\n }\n return deferred;\n }\n\n function shouldNavigateTo(href) {\n return !!href && href !== '#';\n }\n\n /**\n * Mousedown event. This is captured only to prevent browser from drawing an outline around an\n * area when it's clicked.\n *\n * @param {EventData} e jQuery event data\n */\n\n function mousedown(e) {\n if (!m.hasCanvas()) {\n this.blur();\n }\n e.preventDefault();\n }\n\n /**\n * Mouseover event. Handle highlight rendering and client callback on mouseover\n *\n * @param {MapData} me The MapData context\n * @param {EventData} e jQuery event data\n * @return {[type]} [description]\n */\n\n function mouseover(me, e) {\n var arData = me.getAllDataForArea(this),\n ar = arData.length ? arData[0] : null;\n\n // mouseover events are ignored entirely while resizing, though we do care about mouseout events\n // and must queue the action to keep things clean.\n\n if (!ar || ar.isNotRendered() || ar.owner.currentAction) {\n return;\n }\n\n if (me.currentAreaId === ar.areaId) {\n return;\n }\n if (me.highlightId !== ar.areaId) {\n me.clearEffects();\n\n ar.highlight();\n\n if (me.options.showToolTip) {\n $.each(arData, function (_, e) {\n if (e.effectiveOptions().toolTip) {\n e.showToolTip();\n }\n });\n }\n }\n\n me.currentAreaId = ar.areaId;\n\n if (u.isFunction(me.options.onMouseover)) {\n me.options.onMouseover.call(this, {\n e: e,\n options: ar.effectiveOptions(),\n key: ar.key,\n selected: ar.isSelected()\n });\n }\n }\n\n /**\n * Mouseout event.\n *\n * @param {MapData} me The MapData context\n * @param {EventData} e jQuery event data\n * @return {[type]} [description]\n */\n\n function mouseout(me, e) {\n var newArea,\n ar = me.getDataForArea(this),\n opts = me.options;\n\n if (me.currentAreaId < 0 || !ar) {\n return;\n }\n\n newArea = me.getDataForArea(e.relatedTarget);\n\n if (newArea === ar) {\n return;\n }\n\n me.currentAreaId = -1;\n ar.area = null;\n\n queueMouseEvent(me, opts.mouseoutDelay, ar).then(function (result) {\n if (!result.completeAction) {\n return;\n }\n me.clearEffects();\n });\n\n if (u.isFunction(opts.onMouseout)) {\n opts.onMouseout.call(this, {\n e: e,\n options: opts,\n key: ar.key,\n selected: ar.isSelected()\n });\n }\n }\n\n /**\n * Clear any active tooltip or highlight\n *\n * @param {MapData} me The MapData context\n * @param {EventData} e jQuery event data\n * @return {[type]} [description]\n */\n\n function clearEffects(me) {\n var opts = me.options;\n\n me.ensureNoHighlight();\n\n if (\n opts.toolTipClose &&\n $.inArray('area-mouseout', opts.toolTipClose) >= 0 &&\n me.activeToolTip\n ) {\n me.clearToolTip();\n }\n }\n\n /**\n * Mouse click event handler\n *\n * @param {MapData} me The MapData context\n * @param {EventData} e jQuery event data\n * @return {[type]} [description]\n */\n\n function click(me, e) {\n var list,\n list_target,\n newSelectionState,\n canChangeState,\n cbResult,\n that = this,\n ar = me.getDataForArea(this),\n opts = me.options,\n navDetails,\n areaOpts;\n\n function navigateTo(mode, href, target) {\n switch (mode) {\n // if no target is specified, use legacy\n // behavior and change current window\n case 'open':\n window.open(href, target || '_self');\n return;\n\n // default legacy behavior of ImageMapster\n default:\n window.location.href = href;\n return;\n }\n }\n\n function getNavDetails(ar, mode, defaultHref) {\n if (mode === 'open') {\n var elHref = $(ar.area).attr('href'),\n useEl = shouldNavigateTo(elHref);\n\n return {\n href: useEl ? elHref : ar.href,\n target: useEl ? $(ar.area).attr('target') : ar.hrefTarget\n };\n }\n\n return {\n href: defaultHref\n };\n }\n\n function clickArea(ar) {\n var target;\n canChangeState =\n ar.isSelectable() && (ar.isDeselectable() || !ar.isSelected());\n\n if (canChangeState) {\n newSelectionState = !ar.isSelected();\n } else {\n newSelectionState = ar.isSelected();\n }\n\n list_target = m.getBoundList(opts, ar.key);\n\n if (u.isFunction(opts.onClick)) {\n cbResult = opts.onClick.call(that, {\n e: e,\n listTarget: list_target,\n key: ar.key,\n selected: newSelectionState\n });\n\n if (u.isBool(cbResult)) {\n if (!cbResult) {\n return false;\n }\n target = getNavDetails(\n ar,\n opts.navigateMode,\n $(ar.area).attr('href')\n );\n if (shouldNavigateTo(target.href)) {\n navigateTo(opts.navigateMode, target.href, target.target);\n return false;\n }\n }\n }\n\n if (canChangeState) {\n ar.toggle();\n }\n }\n\n mousedown.call(this, e);\n\n navDetails = getNavDetails(ar, opts.navigateMode, ar.href);\n if (opts.clickNavigate && shouldNavigateTo(navDetails.href)) {\n navigateTo(opts.navigateMode, navDetails.href, navDetails.target);\n return;\n }\n\n if (ar && !ar.owner.currentAction) {\n opts = me.options;\n clickArea(ar);\n areaOpts = ar.effectiveOptions();\n if (areaOpts.includeKeys) {\n list = u.split(areaOpts.includeKeys);\n $.each(list, function (_, e) {\n var ar = me.getDataForKey(e.toString());\n if (!ar.options.isMask) {\n clickArea(ar);\n }\n });\n }\n }\n }\n\n /**\n * Prototype for a MapData object, representing an ImageMapster bound object\n * @param {Element} image an IMG element\n * @param {object} options ImageMapster binding options\n */\n m.MapData = function (image, options) {\n var me = this;\n\n // (Image) main map image\n\n me.image = image;\n\n me.images = new m.MapImages(me);\n me.graphics = new m.Graphics(me);\n\n // save the initial style of the image for unbinding. This is problematic, chrome\n // duplicates styles when assigning, and cssText is apparently not universally supported.\n // Need to do something more robust to make unbinding work universally.\n\n me.imgCssText = image.style.cssText || null;\n\n initializeDefaults(me);\n\n me.configureOptions(options);\n\n // create context-bound event handlers from our private functions\n\n me.mouseover = function (e) {\n mouseover.call(this, me, e);\n };\n me.mouseout = function (e) {\n mouseout.call(this, me, e);\n };\n me.click = function (e) {\n click.call(this, me, e);\n };\n me.clearEffects = function (e) {\n clearEffects.call(this, me, e);\n };\n me.mousedown = function (e) {\n mousedown.call(this, e);\n };\n };\n\n m.MapData.prototype = {\n constructor: m.MapData,\n\n /**\n * Set target.options from defaults + options\n * @param {[type]} target The target\n * @param {[type]} options The options to merge\n */\n\n configureOptions: function (options) {\n this.options = u.updateProps({}, m.defaults, options);\n },\n\n /**\n * Ensure all images are loaded\n * @return {Promise} A promise that resolves when the images have finished loading (or fail)\n */\n\n bindImages: function () {\n var me = this,\n mi = me.images;\n\n // reset the images if this is a rebind\n\n if (mi.length > 2) {\n mi.splice(2);\n } else if (mi.length === 0) {\n // add the actual main image\n mi.add(me.image);\n // will create a duplicate of the main image, we need this to get raw size info\n mi.add(me.image.src);\n }\n\n configureAltImages(me);\n\n return me.images.bind();\n },\n\n /**\n * Test whether an async action is currently in progress\n * @return {Boolean} true or false indicating state\n */\n\n isActive: function () {\n return !this.complete || this.currentAction;\n },\n\n /**\n * Return an object indicating the various states. This isn't really used by\n * production code.\n *\n * @return {object} An object with properties for various states\n */\n\n state: function () {\n return {\n complete: this.complete,\n resizing: this.currentAction === 'resizing',\n zoomed: this.zoomed,\n zoomedArea: this.zoomedArea,\n scaleInfo: this.scaleInfo\n };\n },\n\n /**\n * Get a unique ID for the wrapper of this imagemapster\n * @return {string} A string that is unique to this image\n */\n\n wrapId: function () {\n return 'mapster_wrap_' + this.index;\n },\n instanceEventNamespace: function () {\n return '.mapster.' + this.wrapId();\n },\n _idFromKey: function (key) {\n return typeof key === 'string' &&\n Object.prototype.hasOwnProperty.call(this._xref, key)\n ? this._xref[key]\n : -1;\n },\n\n /**\n * Return a comma-separated string of all selected keys\n * @return {string} CSV of all keys that are currently selected\n */\n\n getSelected: function () {\n var result = '';\n $.each(this.data, function (_, e) {\n if (e.isSelected()) {\n result += (result ? ',' : '') + this.key;\n }\n });\n return result;\n },\n\n /**\n * Get an array of MapAreas associated with a specific AREA based on the keys for that area\n * @param {Element} area An HTML AREA\n * @param {number} atMost A number limiting the number of areas to be returned (typically 1 or 0 for no limit)\n * @return {MapArea[]} Array of MapArea objects\n */\n\n getAllDataForArea: function (area, atMost) {\n var i,\n ar,\n result,\n me = this,\n key = $(area).filter('area').attr(me.options.mapKey);\n\n if (key) {\n result = [];\n key = u.split(key);\n\n for (i = 0; i < (atMost || key.length); i++) {\n ar = me.data[me._idFromKey(key[i])];\n if (ar) {\n ar.area = area.length ? area[0] : area;\n // set the actual area moused over/selected\n // TODO: this is a brittle model for capturing which specific area - if this method was not used,\n // ar.area could have old data. fix this.\n result.push(ar);\n }\n }\n }\n\n return result;\n },\n getDataForArea: function (area) {\n var ar = this.getAllDataForArea(area, 1);\n return ar ? ar[0] || null : null;\n },\n getDataForKey: function (key) {\n return this.data[this._idFromKey(key)];\n },\n\n /**\n * Get the primary keys associated with an area group.\n * If this is a primary key, it will be returned.\n *\n * @param {string key An area key\n * @return {string} A CSV of area keys\n */\n\n getKeysForGroup: function (key) {\n var ar = this.getDataForKey(key);\n\n return !ar\n ? ''\n : ar.isPrimary\n ? ar.key\n : this.getPrimaryKeysForMapAreas(ar.areas()).join(',');\n },\n\n /**\n * given an array of MapArea object, return an array of its unique primary keys\n * @param {MapArea[]} areas The areas to analyze\n * @return {string[]} An array of unique primary keys\n */\n\n getPrimaryKeysForMapAreas: function (areas) {\n var keys = [];\n $.each(areas, function (_, e) {\n if ($.inArray(e.keys[0], keys) < 0) {\n keys.push(e.keys[0]);\n }\n });\n return keys;\n },\n getData: function (obj) {\n if (typeof obj === 'string') {\n return this.getDataForKey(obj);\n } else if ((obj && obj.mapster) || u.isElement(obj)) {\n return this.getDataForArea(obj);\n } else {\n return null;\n }\n },\n // remove highlight if present, raise event\n ensureNoHighlight: function () {\n var ar;\n if (this.highlightId >= 0) {\n this.graphics.clearHighlight();\n ar = this.data[this.highlightId];\n ar.changeState('highlight', false);\n this.setHighlightId(-1);\n }\n },\n setHighlightId: function (id) {\n this.highlightId = id;\n },\n\n /**\n * Clear all active selections on this map\n */\n\n clearSelections: function () {\n $.each(this.data, function (_, e) {\n if (e.selected) {\n e.deselect(true);\n }\n });\n this.removeSelectionFinish();\n },\n\n /**\n * Set area options from an array of option data.\n *\n * @param {object[]} areas An array of objects containing area-specific options\n */\n\n setAreaOptions: function (areas) {\n var i, area_options, ar;\n areas = areas || [];\n\n // refer by: map_data.options[map_data.data[x].area_option_id]\n\n for (i = areas.length - 1; i >= 0; i--) {\n area_options = areas[i];\n if (area_options) {\n ar = this.getDataForKey(area_options.key);\n if (ar) {\n u.updateProps(ar.options, area_options);\n\n // TODO: will not deselect areas that were previously selected, so this only works\n // for an initial bind.\n\n if (u.isBool(area_options.selected)) {\n ar.selected = area_options.selected;\n }\n }\n }\n }\n },\n // keys: a comma-separated list\n drawSelections: function (keys) {\n var i,\n key_arr = u.asArray(keys);\n\n for (i = key_arr.length - 1; i >= 0; i--) {\n this.data[key_arr[i]].drawSelection();\n }\n },\n redrawSelections: function () {\n $.each(this.data, function (_, e) {\n if (e.isSelectedOrStatic()) {\n e.drawSelection();\n }\n });\n },\n // Causes changes to the bound list based on the user action (select or deselect)\n // area: the jQuery area object\n // returns the matching elements from the bound list for the first area passed\n // (normally only one should be passed, but a list can be passed)\n setBoundListProperties: function (opts, target, selected) {\n target.each(function (_, e) {\n if (opts.listSelectedClass) {\n if (selected) {\n $(e).addClass(opts.listSelectedClass);\n } else {\n $(e).removeClass(opts.listSelectedClass);\n }\n }\n if (opts.listSelectedAttribute) {\n $(e).prop(opts.listSelectedAttribute, selected);\n }\n });\n },\n clearBoundListProperties: function (opts) {\n var me = this;\n if (!opts.boundList) {\n return;\n }\n me.setBoundListProperties(opts, opts.boundList, false);\n },\n refreshBoundList: function (opts) {\n var me = this;\n me.clearBoundListProperties(opts);\n me.setBoundListProperties(\n opts,\n m.getBoundList(opts, me.getSelected()),\n true\n );\n },\n setBoundList: function (opts) {\n var me = this,\n sorted_list = me.data.slice(0),\n sort_func;\n if (opts.sortList) {\n if (opts.sortList === 'desc') {\n sort_func = function (a, b) {\n return a === b ? 0 : a > b ? -1 : 1;\n };\n } else {\n sort_func = function (a, b) {\n return a === b ? 0 : a < b ? -1 : 1;\n };\n }\n\n sorted_list.sort(function (a, b) {\n a = a.value;\n b = b.value;\n return sort_func(a, b);\n });\n }\n me.options.boundList = opts.onGetList.call(me.image, sorted_list);\n },\n ///called when images are done loading\n initialize: function () {\n var imgCopy,\n base_canvas,\n overlay_canvas,\n wrap,\n parentId,\n css,\n i,\n size,\n img,\n scale,\n me = this,\n opts = me.options;\n\n if (me.complete) {\n return;\n }\n\n img = $(me.image);\n\n parentId = img.parent().attr('id');\n\n // create a div wrapper only if there's not already a wrapper, otherwise, own it\n\n if (\n parentId &&\n parentId.length >= 12 &&\n parentId.substring(0, 12) === 'mapster_wrap'\n ) {\n wrap = img.parent();\n wrap.attr('id', me.wrapId());\n } else {\n wrap = $('
');\n\n if (opts.wrapClass) {\n if (opts.wrapClass === true) {\n wrap.addClass(img[0].className);\n } else {\n wrap.addClass(opts.wrapClass);\n }\n }\n }\n me.wrapper = wrap;\n\n // me.images[1] is the copy of the original image. It should be loaded & at its native size now so we can obtain the true\n // width & height. This is needed to scale the image map if not being shown at its native size. It is also needed purely\n // to finish binding in case the original image was not visible. It can be impossible in some browsers to obtain the\n // native size of a hidden image.\n\n me.scaleInfo = scale = u.scaleMap(\n me.images[0],\n me.images[1],\n opts.scaleMap\n );\n\n me.base_canvas = base_canvas = me.graphics.createVisibleCanvas(me);\n me.overlay_canvas = overlay_canvas = me.graphics.createVisibleCanvas(me);\n\n // Now we got what we needed from the copy -clone from the original image again to make sure any other attributes are copied\n imgCopy = $(me.images[1])\n .addClass('mapster_el ' + me.images[0].className)\n .attr({ id: null, usemap: null });\n\n size = u.size(me.images[0]);\n\n if (size.complete) {\n imgCopy.css({\n width: size.width,\n height: size.height\n });\n }\n\n me.buildDataset();\n\n // now that we have processed all the areas, set css for wrapper, scale map if needed\n\n css = $.extend(\n {\n display: 'block',\n position: 'relative',\n padding: 0\n },\n opts.enableAutoResizeSupport === true\n ? {}\n : {\n width: scale.width,\n height: scale.height\n }\n );\n\n if (opts.wrapCss) {\n $.extend(css, opts.wrapCss);\n }\n // if we were rebinding with an existing wrapper, the image will aready be in it\n if (img.parent()[0] !== me.wrapper[0]) {\n img.before(me.wrapper);\n }\n\n wrap.css(css);\n\n // move all generated images into the wrapper for easy removal later\n\n $(me.images.slice(2)).hide();\n for (i = 1; i < me.images.length; i++) {\n wrap.append(me.images[i]);\n }\n\n //me.images[1].style.cssText = me.image.style.cssText;\n\n wrap\n .append(base_canvas)\n .append(overlay_canvas)\n .append(img.css(m.canvas_style));\n\n // images[0] is the original image with map, images[1] is the copy/background that is visible\n\n u.setOpacity(me.images[0], 0);\n $(me.images[1]).show();\n\n u.setOpacity(me.images[1], 1);\n\n me.complete = true;\n me.processCommandQueue();\n\n if (opts.enableAutoResizeSupport === true) {\n me.configureAutoResize();\n }\n\n me.onConfigured();\n },\n\n onConfigured: function () {\n var me = this,\n $img = $(me.image),\n opts = me.options;\n\n if (u.isFunction(opts.onConfigured)) {\n opts.onConfigured.call($img, true);\n }\n },\n\n // when rebind is true, the MapArea data will not be rebuilt.\n buildDataset: function (rebind) {\n var sel,\n areas,\n j,\n area_id,\n $area,\n area,\n curKey,\n mapArea,\n key,\n keys,\n mapAreaId,\n group_value,\n dataItem,\n href,\n me = this,\n opts = me.options,\n default_group;\n\n function addAreaData(key, value) {\n var dataItem = new m.AreaData(me, key, value);\n dataItem.areaId = me._xref[key] = me.data.push(dataItem) - 1;\n return dataItem.areaId;\n }\n\n me._xref = {};\n me.data = [];\n if (!rebind) {\n me.mapAreas = [];\n }\n\n default_group = !opts.mapKey;\n if (default_group) {\n opts.mapKey = 'data-mapster-key';\n }\n\n // the [attribute] selector is broken on old IE with jQuery. hasVml() is a quick and dirty\n // way to test for that\n\n sel = m.hasVml()\n ? 'area'\n : default_group\n ? 'area[coords]'\n : 'area[' + opts.mapKey + ']';\n\n areas = $(me.map).find(sel).off('.mapster');\n\n for (mapAreaId = 0; mapAreaId < areas.length; mapAreaId++) {\n area_id = 0;\n area = areas[mapAreaId];\n $area = $(area);\n\n // skip areas with no coords - selector broken for older ie\n if (!area.coords) {\n continue;\n }\n // Create a key if none was assigned by the user\n\n if (default_group) {\n curKey = String(mapAreaId);\n $area.attr('data-mapster-key', curKey);\n } else {\n curKey = area.getAttribute(opts.mapKey);\n }\n\n // conditions for which the area will be bound to mouse events\n // only bind to areas that don't have nohref. ie 6&7 cannot detect the presence of nohref, so we have to also not bind if href is missing.\n\n if (rebind) {\n mapArea = me.mapAreas[$area.data('mapster') - 1];\n mapArea.configure(curKey);\n mapArea.areaDataXref = [];\n } else {\n mapArea = new m.MapArea(me, area, curKey);\n me.mapAreas.push(mapArea);\n }\n\n keys = mapArea.keys; // converted to an array by mapArea\n\n // Iterate through each mapKey assigned to this area\n for (j = keys.length - 1; j >= 0; j--) {\n key = keys[j];\n\n if (opts.mapValue) {\n group_value = $area.attr(opts.mapValue);\n }\n if (default_group) {\n // set an attribute so we can refer to the area by index from the DOM object if no key\n area_id = addAreaData(me.data.length, group_value);\n dataItem = me.data[area_id];\n dataItem.key = key = area_id.toString();\n } else {\n area_id = me._xref[key];\n if (area_id >= 0) {\n dataItem = me.data[area_id];\n if (group_value && !me.data[area_id].value) {\n dataItem.value = group_value;\n }\n } else {\n area_id = addAreaData(key, group_value);\n dataItem = me.data[area_id];\n dataItem.isPrimary = j === 0;\n }\n }\n mapArea.areaDataXref.push(area_id);\n dataItem.areasXref.push(mapAreaId);\n }\n\n href = $area.attr('href');\n if (shouldNavigateTo(href) && !dataItem.href) {\n dataItem.href = href;\n dataItem.hrefTarget = $area.attr('target');\n }\n\n if (!mapArea.nohref) {\n $area\n .on('click.mapster', me.click)\n .on(\n 'mouseover.mapster touchstart.mapster.noPreventDefault',\n me.mouseover\n )\n .on(\n 'mouseout.mapster touchend.mapster.noPreventDefault',\n me.mouseout\n )\n .on('mousedown.mapster', me.mousedown);\n }\n\n // store an ID with each area.\n $area.data('mapster', mapAreaId + 1);\n }\n\n // TODO listenToList\n // if (opts.listenToList && opts.nitG) {\n // opts.nitG.bind('click.mapster', event_hooks[map_data.hooks_index].listclick_hook);\n // }\n\n // populate areas from config options\n me.setAreaOptions(opts.areas);\n if (opts.onGetList) {\n me.setBoundList(opts);\n }\n\n if (opts.boundList && opts.boundList.length > 0) {\n me.refreshBoundList(opts);\n }\n\n if (rebind) {\n me.graphics.removeSelections();\n me.graphics.refreshSelections();\n } else {\n me.redrawSelections();\n }\n },\n processCommandQueue: function () {\n var cur,\n me = this;\n while (!me.currentAction && me.commands.length) {\n cur = me.commands[0];\n me.commands.splice(0, 1);\n m.impl[cur.command].apply(cur.that, cur.args);\n }\n },\n clearEvents: function () {\n $(this.map).find('area').off('.mapster');\n $(this.images).off('.mapster');\n $(window).off(this.instanceEventNamespace());\n $(window.document).off(this.instanceEventNamespace());\n },\n _clearCanvases: function (preserveState) {\n // remove the canvas elements created\n if (!preserveState) {\n $(this.base_canvas).remove();\n }\n $(this.overlay_canvas).remove();\n },\n clearMapData: function (preserveState) {\n var me = this;\n me.ensureNoHighlight();\n this._clearCanvases(preserveState);\n\n // release refs to DOM elements\n $.each(this.data, function (_, e) {\n e.reset();\n });\n this.data = null;\n if (!preserveState) {\n // get rid of everything except the original image\n this.image.style.cssText = this.imgCssText;\n $(this.wrapper).before(this.image).remove();\n }\n\n me.images.clear();\n\n if (me.autoResizeTimer) {\n clearTimeout(me.autoResizeTimer);\n }\n me.autoResizeTimer = null;\n this.image = null;\n u.ifFunction(this.clearToolTip, this);\n },\n\n // Compelete cleanup process for deslecting items. Called after a batch operation, or by AreaData for single\n // operations not flagged as \"partial\"\n\n removeSelectionFinish: function () {\n var g = this.graphics;\n\n g.refreshSelections();\n // do not call ensure_no_highlight- we don't really want to unhilight it, just remove the effect\n g.clearHighlight();\n }\n };\n})(jQuery);\n\n/* areadata.js\n AreaData and MapArea protoypes\n*/\n\n(function ($) {\n 'use strict';\n\n var m = $.mapster,\n u = m.utils;\n\n function optsAreEqual(opts1, opts2) {\n // deep compare is not trivial and current testing framework\n // doesn't provide a way to detect this accurately so only\n // implementing basic compare at this time.\n // TODO: Implement deep obj compare or for perf reasons shallow\n // with a short-circuit if deep is required for full compare\n // since config options should only require shallow\n return opts1 === opts2;\n }\n\n /**\n * Update selected state of this area\n *\n * @param {boolean} selected Determines whether areas are selected or deselected\n */\n function updateSelected(selected) {\n var me = this,\n prevSelected = me.selected;\n\n me.selected = selected;\n me.staticStateOverridden = u.isBool(me.effectiveOptions().staticState)\n ? true\n : false;\n\n return prevSelected !== selected;\n }\n\n /**\n * Select this area\n *\n * @param {AreaData} me AreaData context\n * @param {object} options Options for rendering the selection\n */\n function select(options) {\n function buildOptions() {\n // map the altImageId if an altimage was passed\n return $.extend(me.effectiveRenderOptions('select'), options, {\n altImageId: o.images.add(options.altImage)\n });\n }\n\n var me = this,\n o = me.owner,\n hasOptions = !$.isEmptyObject(options),\n newOptsCache = hasOptions ? buildOptions() : null,\n // Per docs, options changed via set_options for an area that is\n // already selected will not be reflected until the next time\n // the area becomes selected.\n changeOptions = hasOptions\n ? !optsAreEqual(me.optsCache, newOptsCache)\n : false,\n selectedHasChanged = false,\n isDrawn = me.isSelectedOrStatic();\n\n // This won't clear staticState === true areas that have not been overridden via API set/select/deselect.\n // This could be optimized to only clear if we are the only one selected. However, there are scenarios\n // that do not respect singleSelect (e.g. initialization) so we force clear if there should only be one.\n // TODO: Only clear if we aren't the only one selected (depends on #370)\n if (o.options.singleSelect) {\n o.clearSelections();\n // we may (staticState === true) or may not still be visible\n isDrawn = me.isSelectedOrStatic();\n }\n\n if (changeOptions) {\n me.optsCache = newOptsCache;\n }\n\n // Update before we start drawing for methods\n // that rely on internal selected value.\n // Force update because area can be selected\n // at multiple levels (selected / area_options.selected / staticState / etc.)\n // and could have been cleared.\n selectedHasChanged = me.updateSelected(true);\n\n if (isDrawn && changeOptions) {\n // no way to remove just this area from canvas so must refresh everything\n\n // explicitly remove vml element since it uses removeSelections instead of refreshSelections\n // TODO: Not sure why removeSelections isn't incorporated in to refreshSelections\n // need to investigate and possibly consolidate\n o.graphics.removeSelections(me.areaId);\n o.graphics.refreshSelections();\n } else if (!isDrawn) {\n me.drawSelection();\n }\n\n // don't fire until everything is done\n if (selectedHasChanged) {\n me.changeState('select', true);\n }\n }\n\n /**\n * Deselect this area, optionally deferring finalization so additional areas can be deselected\n * in a single operation\n *\n * @param {boolean} partial when true, the caller must invoke \"finishRemoveSelection\" to render\n */\n\n function deselect(partial) {\n var me = this,\n selectedHasChanged = false;\n\n // update before we start drawing for methods\n // that rely on internal selected value\n // force update because area can be selected\n // at multiple levels (selected / area_options.selected / staticState / etc.)\n selectedHasChanged = me.updateSelected(false);\n\n // release information about last area options when deselecting.\n me.optsCache = null;\n me.owner.graphics.removeSelections(me.areaId);\n\n // Complete selection removal process. This is separated because it's very inefficient to perform the whole\n // process for multiple removals, as the canvas must be totally redrawn at the end of the process.ar.remove\n if (!partial) {\n me.owner.removeSelectionFinish();\n }\n\n // don't fire until everything is done\n if (selectedHasChanged) {\n me.changeState('select', false);\n }\n }\n\n /**\n * Toggle the selection state of this area\n * @param {object} options Rendering options, if toggling on\n * @return {bool} The new selection state\n */\n function toggle(options) {\n var me = this;\n if (!me.isSelected()) {\n me.select(options);\n } else {\n me.deselect();\n }\n return me.isSelected();\n }\n\n function isNoHref(areaEl) {\n var $area = $(areaEl);\n return u.hasAttribute($area, 'nohref') || !u.hasAttribute($area, 'href');\n }\n\n /**\n * An AreaData object; represents a conceptual area that can be composed of\n * one or more MapArea objects\n *\n * @param {MapData} owner The MapData object to which this belongs\n * @param {string} key The key for this area\n * @param {string} value The mapValue string for this area\n */\n\n m.AreaData = function (owner, key, value) {\n $.extend(this, {\n owner: owner,\n key: key || '',\n // means this represents the first key in a list of keys (it's the area group that gets highlighted on mouseover)\n isPrimary: true,\n areaId: -1,\n href: '',\n hrefTarget: null,\n value: value || '',\n options: {},\n // \"null\" means unchanged. Use \"isSelected\" method to just test true/false\n selected: null,\n // \"true\" means selected has been set via API AND staticState is true/false\n staticStateOverridden: false,\n // xref to MapArea objects\n areasXref: [],\n // (temporary storage) - the actual area moused over\n area: null,\n // the last options used to render this. Cache so when re-drawing after a remove, changes in options won't\n // break already selected things.\n optsCache: null\n });\n };\n\n /**\n * The public API for AreaData object\n */\n\n m.AreaData.prototype = {\n constuctor: m.AreaData,\n select: select,\n deselect: deselect,\n toggle: toggle,\n updateSelected: updateSelected,\n areas: function () {\n var i,\n result = [];\n for (i = 0; i < this.areasXref.length; i++) {\n result.push(this.owner.mapAreas[this.areasXref[i]]);\n }\n return result;\n },\n // return all coordinates for all areas\n coords: function (offset) {\n var coords = [];\n $.each(this.areas(), function (_, el) {\n coords = coords.concat(el.coords(offset));\n });\n return coords;\n },\n reset: function () {\n $.each(this.areas(), function (_, e) {\n e.reset();\n });\n this.areasXref = [];\n this.options = null;\n },\n // Return the effective selected state of an area, incorporating staticState\n isSelectedOrStatic: function () {\n var o = this.effectiveOptions();\n return !u.isBool(o.staticState) || this.staticStateOverridden\n ? this.isSelected()\n : o.staticState;\n },\n isSelected: function () {\n return u.isBool(this.selected)\n ? this.selected\n : u.isBool(this.owner.area_options.selected)\n ? this.owner.area_options.selected\n : false;\n },\n isSelectable: function () {\n return u.isBool(this.effectiveOptions().staticState)\n ? false\n : u.isBool(this.owner.options.staticState)\n ? false\n : u.boolOrDefault(this.effectiveOptions().isSelectable, true);\n },\n isDeselectable: function () {\n return u.isBool(this.effectiveOptions().staticState)\n ? false\n : u.isBool(this.owner.options.staticState)\n ? false\n : u.boolOrDefault(this.effectiveOptions().isDeselectable, true);\n },\n isNotRendered: function () {\n return isNoHref(this.area) || this.effectiveOptions().isMask;\n },\n /**\n * Return the overall options effective for this area.\n * This should get the default options, and merge in area-specific options, finally\n * overlaying options passed by parameter\n *\n * @param {[type]} options options which will supercede all other options for this area\n * @return {[type]} the combined options\n */\n\n effectiveOptions: function (options) {\n var opts = u.updateProps(\n {},\n this.owner.area_options,\n this.options,\n options || {},\n {\n id: this.areaId\n }\n );\n\n opts.selected = this.isSelected();\n\n return opts;\n },\n\n /**\n * Return the options effective for this area for a \"render\" or \"highlight\" mode.\n * This should get the default options, merge in the areas-specific options,\n * and then the mode-specific options.\n * @param {string} mode 'render' or 'highlight'\n * @param {[type]} options options which will supercede all other options for this area\n * @return {[type]} the combined options\n */\n\n effectiveRenderOptions: function (mode, options) {\n var allOpts,\n opts = this.optsCache;\n\n if (!opts || mode === 'highlight') {\n allOpts = this.effectiveOptions(options);\n opts = u.updateProps({}, allOpts, allOpts['render_' + mode]);\n\n if (mode !== 'highlight') {\n this.optsCache = opts;\n }\n }\n return $.extend({}, opts);\n },\n\n // Fire callback on area state change\n changeState: function (state_type, state) {\n if (u.isFunction(this.owner.options.onStateChange)) {\n this.owner.options.onStateChange.call(this.owner.image, {\n key: this.key,\n state: state_type,\n selected: state\n });\n }\n if (state_type === 'select' && this.owner.options.boundList) {\n this.owner.setBoundListProperties(\n this.owner.options,\n m.getBoundList(this.owner.options, this.key),\n state\n );\n }\n },\n\n // highlight this area\n\n highlight: function (options) {\n var o = this.owner;\n o.ensureNoHighlight();\n if (this.effectiveOptions().highlight) {\n o.graphics.addShapeGroup(this, 'highlight', options);\n }\n o.setHighlightId(this.areaId);\n this.changeState('highlight', true);\n },\n\n // select this area. if \"callEvent\" is true then the state change event will be called. (This method can be used\n // during config operations, in which case no event is indicated)\n\n drawSelection: function () {\n this.owner.graphics.addShapeGroup(this, 'select');\n }\n };\n // represents an HTML area\n m.MapArea = function (owner, areaEl, keys) {\n if (!owner) {\n return;\n }\n var me = this;\n me.owner = owner; // a MapData object\n me.area = areaEl;\n me.areaDataXref = []; // a list of map_data.data[] id's for each areaData object containing this\n me.originalCoords = [];\n $.each(u.split(areaEl.coords), function (_, el) {\n me.originalCoords.push(parseFloat(el));\n });\n me.length = me.originalCoords.length;\n me.shape = u.getShape(areaEl);\n me.nohref = isNoHref(areaEl);\n me.configure(keys);\n };\n m.MapArea.prototype = {\n constructor: m.MapArea,\n configure: function (keys) {\n this.keys = u.split(keys);\n },\n reset: function () {\n this.area = null;\n },\n coords: function (offset) {\n return $.map(this.originalCoords, function (e) {\n return offset ? e : e + offset;\n });\n }\n };\n})(jQuery);\n\n/* areacorners.js\n determine the best place to put a box of dimensions (width,height) given a circle, rect or poly\n*/\n\n(function ($) {\n 'use strict';\n\n var u = $.mapster.utils;\n\n /**\n * Compute positions that will place a target with dimensions [width,height] outside\n * but near the boundaries of the elements \"elements\". When an image map is passed, the\n *\n * @param {Element|Element[]} elements An element or an array of elements (such as a jQuery object)\n * @param {Element} image The image to which area elements are bound, if this is an image map.\n * @param {Element} container The contianer in which the target must be constrained (or document, if missing)\n * @param {int} width The width of the target object\n * @return {object} a structure with the x and y positions\n */\n u.areaCorners = function (elements, image, container, width, height) {\n var pos,\n found,\n minX,\n minY,\n maxX,\n maxY,\n bestMinX,\n bestMaxX,\n bestMinY,\n bestMaxY,\n curX,\n curY,\n nest,\n j,\n offsetx = 0,\n offsety = 0,\n rootx,\n rooty,\n iCoords,\n radius,\n angle,\n el,\n coords = [];\n\n // if a single element was passed, map it to an array\n\n elements = elements.length ? elements : [elements];\n\n container = container ? $(container) : $(document.body);\n\n // get the relative root of calculation\n\n pos = container.offset();\n rootx = pos.left;\n rooty = pos.top;\n\n // with areas, all we know about is relative to the top-left corner of the image. We need to add an offset compared to\n // the actual container. After this calculation, offsetx/offsety can be added to either the area coords, or the target's\n // absolute position to get the correct top/left boundaries of the container.\n\n if (image) {\n pos = $(image).offset();\n offsetx = pos.left;\n offsety = pos.top;\n }\n\n // map the coordinates of any type of shape to a poly and use the logic. simpler than using three different\n // calculation methods. Circles use a 20 degree increment for this estimation.\n\n for (j = 0; j < elements.length; j++) {\n el = elements[j];\n if (el.nodeName === 'AREA') {\n iCoords = u.split(el.coords, parseInt);\n\n switch (u.getShape(el)) {\n case 'circle':\n case 'circ':\n curX = iCoords[0];\n curY = iCoords[1];\n radius = iCoords[2];\n coords = [];\n for (j = 0; j < 360; j += 20) {\n angle = (j * Math.PI) / 180;\n coords.push(\n curX + radius * Math.cos(angle),\n curY + radius * Math.sin(angle)\n );\n }\n break;\n case 'rectangle':\n case 'rect':\n coords.push(\n iCoords[0],\n iCoords[1],\n iCoords[2],\n iCoords[1],\n iCoords[2],\n iCoords[3],\n iCoords[0],\n iCoords[3]\n );\n break;\n default:\n coords = coords.concat(iCoords);\n break;\n }\n\n // map area positions to it's real position in the container\n\n for (j = 0; j < coords.length; j += 2) {\n coords[j] = parseInt(coords[j], 10) + offsetx;\n coords[j + 1] = parseInt(coords[j + 1], 10) + offsety;\n }\n } else {\n el = $(el);\n pos = el.position();\n coords.push(\n pos.left,\n pos.top,\n pos.left + el.width(),\n pos.top,\n pos.left + el.width(),\n pos.top + el.height(),\n pos.left,\n pos.top + el.height()\n );\n }\n }\n\n minX = minY = bestMinX = bestMinY = 999999;\n maxX = maxY = bestMaxX = bestMaxY = -1;\n\n for (j = coords.length - 2; j >= 0; j -= 2) {\n curX = coords[j];\n curY = coords[j + 1];\n\n if (curX < minX) {\n minX = curX;\n bestMaxY = curY;\n }\n if (curX > maxX) {\n maxX = curX;\n bestMinY = curY;\n }\n if (curY < minY) {\n minY = curY;\n bestMaxX = curX;\n }\n if (curY > maxY) {\n maxY = curY;\n bestMinX = curX;\n }\n }\n\n // try to figure out the best place for the tooltip\n\n if (width && height) {\n found = false;\n $.each(\n [\n [bestMaxX - width, minY - height],\n [bestMinX, minY - height],\n [minX - width, bestMaxY - height],\n [minX - width, bestMinY],\n [maxX, bestMaxY - height],\n [maxX, bestMinY],\n [bestMaxX - width, maxY],\n [bestMinX, maxY]\n ],\n function (_, e) {\n if (!found && e[0] > rootx && e[1] > rooty) {\n nest = e;\n found = true;\n return false;\n }\n }\n );\n\n // default to lower-right corner if nothing fit inside the boundaries of the image\n\n if (!found) {\n nest = [maxX, maxY];\n }\n }\n return nest;\n };\n})(jQuery);\n\n/*\n scale.js\n Resize and zoom functionality\n Requires areacorners.js\n*/\n\n(function ($) {\n 'use strict';\n\n var m = $.mapster,\n u = m.utils,\n p = m.MapArea.prototype;\n\n m.utils.getScaleInfo = function (eff, actual) {\n var pct;\n if (!actual) {\n pct = 1;\n actual = eff;\n } else {\n pct = eff.width / actual.width || eff.height / actual.height;\n // make sure a float error doesn't muck us up\n if (pct > 0.98 && pct < 1.02) {\n pct = 1;\n }\n }\n return {\n scale: pct !== 1,\n scalePct: pct,\n realWidth: actual.width,\n realHeight: actual.height,\n width: eff.width,\n height: eff.height,\n ratio: eff.width / eff.height\n };\n };\n // Scale a set of AREAs, return old data as an array of objects\n m.utils.scaleMap = function (image, imageRaw, scale) {\n // stunningly, jQuery width can return zero even as width does not, seems to happen only\n // with adBlock or maybe other plugins. These must interfere with onload events somehow.\n\n var vis = u.size(image),\n raw = u.size(imageRaw, true);\n\n if (!raw.complete()) {\n throw 'Another script, such as an extension, appears to be interfering with image loading. Please let us know about this.';\n }\n if (!vis.complete()) {\n vis = raw;\n }\n return this.getScaleInfo(vis, scale ? raw : null);\n };\n\n /**\n * Resize the image map. Only one of newWidth and newHeight should be passed to preserve scale\n *\n * @param {int} width The new width\n * @param {int} height The new height\n * @param {int} effectDuration Time in ms for the resize animation, or zero for no animation\n * @param {function} callback A function to invoke when the operation finishes\n * @return {promise} NOT YET IMPLEMENTED\n */\n\n m.MapData.prototype.resize = function (width, height, duration, callback) {\n var p,\n promises,\n newsize,\n els,\n highlightId,\n ratio,\n me = this;\n\n // allow omitting duration\n callback = callback || duration;\n\n function sizeCanvas(canvas, w, h) {\n if (m.hasCanvas()) {\n canvas.width = w;\n canvas.height = h;\n } else {\n $(canvas).width(w);\n $(canvas).height(h);\n }\n }\n\n // Finalize resize action, do callback, pass control to command queue\n\n function cleanupAndNotify() {\n me.currentAction = '';\n\n if (u.isFunction(callback)) {\n callback();\n }\n\n me.processCommandQueue();\n }\n\n // handle cleanup after the inner elements are resized\n\n function finishResize() {\n sizeCanvas(me.overlay_canvas, width, height);\n\n // restore highlight state if it was highlighted before\n if (highlightId >= 0) {\n var areaData = me.data[highlightId];\n areaData.tempOptions = { fade: false };\n me.getDataForKey(areaData.key).highlight();\n areaData.tempOptions = null;\n }\n sizeCanvas(me.base_canvas, width, height);\n me.redrawSelections();\n cleanupAndNotify();\n }\n\n function resizeMapData() {\n $(me.image).css(newsize);\n // start calculation at the same time as effect\n me.scaleInfo = u.getScaleInfo(\n {\n width: width,\n height: height\n },\n {\n width: me.scaleInfo.realWidth,\n height: me.scaleInfo.realHeight\n }\n );\n $.each(me.data, function (_, e) {\n $.each(e.areas(), function (_, e) {\n e.resize();\n });\n });\n }\n\n if (me.scaleInfo.width === width && me.scaleInfo.height === height) {\n return;\n }\n\n highlightId = me.highlightId;\n\n if (!width) {\n ratio = height / me.scaleInfo.realHeight;\n width = Math.round(me.scaleInfo.realWidth * ratio);\n }\n if (!height) {\n ratio = width / me.scaleInfo.realWidth;\n height = Math.round(me.scaleInfo.realHeight * ratio);\n }\n\n newsize = { width: String(width) + 'px', height: String(height) + 'px' };\n if (!m.hasCanvas()) {\n $(me.base_canvas).children().remove();\n }\n\n // resize all the elements that are part of the map except the image itself (which is not visible)\n // but including the div wrapper\n els = $(me.wrapper).find('.mapster_el');\n if (me.options.enableAutoResizeSupport !== true) {\n els = els.add(me.wrapper);\n }\n\n if (duration) {\n promises = [];\n me.currentAction = 'resizing';\n els.filter(':visible').each(function (_, e) {\n p = u.defer();\n promises.push(p);\n\n $(e).animate(newsize, {\n duration: duration,\n complete: p.resolve,\n easing: 'linear'\n });\n });\n els.filter(':hidden').css(newsize);\n\n p = u.defer();\n promises.push(p);\n\n // though resizeMapData is not async, it needs to be finished just the same as the animations,\n // so add it to the \"to do\" list.\n\n u.when.all(promises).then(finishResize);\n resizeMapData();\n p.resolve();\n } else {\n els.css(newsize);\n resizeMapData();\n finishResize();\n }\n };\n\n m.MapData.prototype.autoResize = function (duration, callback) {\n var me = this;\n\n /*\n When autoresize is enabled, we obtain the width of the wrapper element and resize to that, however when we're hidden because of\n one of our ancenstors, jQuery width function returns 0. Ideally, we could use ResizeObserver/MutationObserver to detect\n when we hide/show and resize on that event instead of resizing while we are not visible but until official support of older \n browsers is dropped, we need to go this route.\n */\n me.resize(\n $(me.wrapper).width() || $(me.wrapper).actual('width'),\n null,\n duration,\n callback\n );\n };\n\n m.MapData.prototype.configureAutoResize = function () {\n var me = this,\n ns = me.instanceEventNamespace();\n\n function resizeMap() {\n // Evaluate this at runtime to allow for set_options\n // to change behavior as set_options intentionally\n // does not change any rendering behavior when invoked.\n // To improve perf, in next major release this should\n // be refactored to add/remove listeners when autoResize\n // changes rather than always having listeners attached\n // and conditionally resizing\n if (me.options.autoResize !== true) {\n return;\n }\n\n me.autoResize(me.options.autoResizeDuration, me.options.onAutoResize);\n }\n\n function debounce() {\n if (me.autoResizeTimer) {\n clearTimeout(me.autoResizeTimer);\n }\n me.autoResizeTimer = setTimeout(resizeMap, me.options.autoResizeDelay);\n }\n\n $(me.image).on('load' + ns, resizeMap); //Detect late image loads in IE11\n $(window).on('focus' + ns, resizeMap);\n $(window).on('resize' + ns, debounce);\n $(window).on('readystatechange' + ns, resizeMap);\n $(window.document).on('fullscreenchange' + ns, resizeMap);\n resizeMap();\n };\n\n m.MapArea = u.subclass(m.MapArea, function () {\n //change the area tag data if needed\n this.base.init();\n if (this.owner.scaleInfo.scale) {\n this.resize();\n }\n });\n\n p.coords = function (percent, coordOffset) {\n var j,\n newCoords = [],\n pct = percent || this.owner.scaleInfo.scalePct,\n offset = coordOffset || 0;\n\n if (pct === 1 && coordOffset === 0) {\n return this.originalCoords;\n }\n\n for (j = 0; j < this.length; j++) {\n //amount = j % 2 === 0 ? xPct : yPct;\n newCoords.push(Math.round(this.originalCoords[j] * pct) + offset);\n }\n return newCoords;\n };\n p.resize = function () {\n this.area.coords = this.coords().join(',');\n };\n\n p.reset = function () {\n this.area.coords = this.coords(1).join(',');\n };\n\n m.impl.resize = function (width, height, duration, callback) {\n var x = new m.Method(\n this,\n function () {\n var me = this,\n noDimensions = !width && !height,\n isAutoResize =\n me.options.enableAutoResizeSupport &&\n me.options.autoResize &&\n noDimensions;\n\n if (isAutoResize) {\n me.autoResize(duration, callback);\n return;\n }\n\n if (noDimensions) {\n return false;\n }\n\n me.resize(width, height, duration, callback);\n },\n null,\n {\n name: 'resize',\n args: arguments\n }\n ).go();\n return x;\n };\n\n /*\n m.impl.zoom = function (key, opts) {\n var options = opts || {};\n\n function zoom(areaData) {\n // this will be MapData object returned by Method\n\n var scroll, corners, height, width, ratio,\n diffX, diffY, ratioX, ratioY, offsetX, offsetY, newWidth, newHeight, scrollLeft, scrollTop,\n padding = options.padding || 0,\n scrollBarSize = areaData ? 20 : 0,\n me = this,\n zoomOut = false;\n\n if (areaData) {\n // save original state on first zoom operation\n if (!me.zoomed) {\n me.zoomed = true;\n me.preZoomWidth = me.scaleInfo.width;\n me.preZoomHeight = me.scaleInfo.height;\n me.zoomedArea = areaData;\n if (options.scroll) {\n me.wrapper.css({ overflow: 'auto' });\n }\n }\n corners = $.mapster.utils.areaCorners(areaData.coords(1, 0));\n width = me.wrapper.innerWidth() - scrollBarSize - padding * 2;\n height = me.wrapper.innerHeight() - scrollBarSize - padding * 2;\n diffX = corners.maxX - corners.minX;\n diffY = corners.maxY - corners.minY;\n ratioX = width / diffX;\n ratioY = height / diffY;\n ratio = Math.min(ratioX, ratioY);\n offsetX = (width - diffX * ratio) / 2;\n offsetY = (height - diffY * ratio) / 2;\n\n newWidth = me.scaleInfo.realWidth * ratio;\n newHeight = me.scaleInfo.realHeight * ratio;\n scrollLeft = (corners.minX) * ratio - padding - offsetX;\n scrollTop = (corners.minY) * ratio - padding - offsetY;\n } else {\n if (!me.zoomed) {\n return;\n }\n zoomOut = true;\n newWidth = me.preZoomWidth;\n newHeight = me.preZoomHeight;\n scrollLeft = null;\n scrollTop = null;\n }\n\n this.resize({\n width: newWidth,\n height: newHeight,\n duration: options.duration,\n scroll: scroll,\n scrollLeft: scrollLeft,\n scrollTop: scrollTop,\n // closure so we can be sure values are correct\n callback: (function () {\n var isZoomOut = zoomOut,\n scroll = options.scroll,\n areaD = areaData;\n return function () {\n if (isZoomOut) {\n me.preZoomWidth = null;\n me.preZoomHeight = null;\n me.zoomed = false;\n me.zoomedArea = false;\n if (scroll) {\n me.wrapper.css({ overflow: 'inherit' });\n }\n } else {\n // just to be sure it wasn't canceled & restarted\n me.zoomedArea = areaD;\n }\n };\n } ())\n });\n }\n return (new m.Method(this,\n function (opts) {\n zoom.call(this);\n },\n function () {\n zoom.call(this.owner, this);\n },\n {\n name: 'zoom',\n args: arguments,\n first: true,\n key: key\n }\n )).go();\n };\n */\n})(jQuery);\n\n/*\n tooltip.js\n Tooltip functionality\n Requires areacorners.js\n*/\n\n(function ($) {\n 'use strict';\n\n var m = $.mapster,\n u = m.utils;\n\n $.extend(m.defaults, {\n toolTipContainer:\n '
',\n showToolTip: false,\n toolTip: null,\n toolTipFade: true,\n toolTipClose: ['area-mouseout', 'image-mouseout', 'generic-mouseout'],\n onShowToolTip: null,\n onHideToolTip: null\n });\n\n $.extend(m.area_defaults, {\n toolTip: null,\n toolTipClose: null\n });\n\n /**\n * Show a tooltip positioned near this area.\n *\n * @param {string|jquery} html A string of html or a jQuery object containing the tooltip content.\n * @param {string|jquery} [template] The html template in which to wrap the content\n * @param {string|object} [css] CSS to apply to the outermost element of the tooltip\n * @return {jquery} The tooltip that was created\n */\n\n function createToolTip(html, template, css) {\n var tooltip;\n\n // wrap the template in a jQuery object, or clone the template if it's already one.\n // This assumes that anything other than a string is a jQuery object; if it's not jQuery will\n // probably throw an error.\n\n if (template) {\n tooltip =\n typeof template === 'string' ? $(template) : $(template).clone();\n\n tooltip.append(html);\n } else {\n tooltip = $(html);\n }\n\n // always set display to block, or the positioning css won't work if the end user happened to\n // use a non-block type element.\n\n tooltip\n .css(\n $.extend(css || {}, {\n display: 'block',\n position: 'absolute'\n })\n )\n .hide();\n\n $('body').append(tooltip);\n\n // we must actually add the tooltip to the DOM and \"show\" it in order to figure out how much space it\n // consumes, and then reposition it with that knowledge.\n // We also cache the actual opacity setting to restore finally.\n\n tooltip.attr('data-opacity', tooltip.css('opacity')).css('opacity', 0);\n\n // doesn't really show it because opacity=0\n\n return tooltip.show();\n }\n\n /**\n * Show a tooltip positioned near this area.\n *\n * @param {jquery} tooltip The tooltip\n * @param {object} [options] options for displaying the tooltip.\n * @config {int} [left] The 0-based absolute x position for the tooltip\n * @config {int} [top] The 0-based absolute y position for the tooltip\n * @config {string|object} [css] CSS to apply to the outermost element of the tooltip\n * @config {bool} [fadeDuration] When non-zero, the duration in milliseconds of a fade-in effect for the tooltip.\n */\n\n function showToolTipImpl(tooltip, options) {\n var tooltipCss = {\n left: options.left + 'px',\n top: options.top + 'px'\n },\n actalOpacity = tooltip.attr('data-opacity') || 0,\n zindex = tooltip.css('z-index');\n\n if (parseInt(zindex, 10) === 0 || zindex === 'auto') {\n tooltipCss['z-index'] = 9999;\n }\n\n tooltip.css(tooltipCss).addClass('mapster_tooltip');\n\n if (options.fadeDuration && options.fadeDuration > 0) {\n u.fader(tooltip[0], 0, actalOpacity, options.fadeDuration);\n } else {\n u.setOpacity(tooltip[0], actalOpacity);\n }\n }\n\n /**\n * Hide and remove active tooltips\n *\n * @param {MapData} this The mapdata object to which the tooltips belong\n */\n\n m.MapData.prototype.clearToolTip = function () {\n if (this.activeToolTip) {\n this.activeToolTip.stop().remove();\n this.activeToolTip = null;\n this.activeToolTipID = null;\n u.ifFunction(this.options.onHideToolTip, this);\n }\n };\n\n /**\n * Configure the binding between a named tooltip closing option, and a mouse event.\n *\n * If a callback is passed, it will be called when the activating event occurs, and the tooltip will\n * only closed if it returns true.\n *\n * @param {MapData} [this] The MapData object to which this tooltip belongs.\n * @param {String} option The name of the tooltip closing option\n * @param {String} event UI event to bind to this option\n * @param {Element} target The DOM element that is the target of the event\n * @param {Function} [beforeClose] Callback when the tooltip is closed\n * @param {Function} [onClose] Callback when the tooltip is closed\n */\n function bindToolTipClose(\n options,\n bindOption,\n event,\n target,\n beforeClose,\n onClose\n ) {\n var tooltip_ns = '.mapster.tooltip',\n event_name = event + tooltip_ns;\n\n if ($.inArray(bindOption, options) >= 0) {\n target.off(event_name).on(event_name, function (e) {\n if (!beforeClose || beforeClose.call(this, e)) {\n target.off(tooltip_ns);\n if (onClose) {\n onClose.call(this);\n }\n }\n });\n\n return {\n object: target,\n event: event_name\n };\n }\n }\n\n /**\n * Show a tooltip.\n *\n * @param {string|jquery} [tooltip] A string of html or a jQuery object containing the tooltip content.\n *\n * @param {string|jquery} [target] The target of the tooltip, to be used to determine positioning. If null,\n * absolute position values must be passed with left and top.\n *\n * @param {string|jquery} [image] If target is an [area] the image that owns it\n *\n * @param {string|jquery} [container] An element within which the tooltip must be bounded\n *\n * @param {object|string|jQuery} [options] options to apply when creating this tooltip\n * @config {int} [offsetx] the horizontal amount to offset the tooltip\n * @config {int} [offsety] the vertical amount to offset the tooltip\n * @config {string|object} [css] CSS to apply to the outermost element of the tooltip\n * @config {bool} [fadeDuration] When non-zero, the duration in milliseconds of a fade-in effect for the tooltip.\n * @config {int} [left] The 0-based absolute x position for the tooltip (only used if target is not specified)\n * @config {int} [top] The 0-based absolute y position for the tooltip (only used if target it not specified)\n */\n\n function showToolTip(tooltip, target, image, container, options) {\n var corners,\n ttopts = {};\n\n options = options || {};\n\n if (target) {\n corners = u.areaCorners(\n target,\n image,\n container,\n tooltip.outerWidth(true),\n tooltip.outerHeight(true)\n );\n\n // Try to upper-left align it first, if that doesn't work, change the parameters\n\n ttopts.left = corners[0];\n ttopts.top = corners[1];\n } else {\n ttopts.left = options.left;\n ttopts.top = options.top;\n }\n\n ttopts.left += options.offsetx || 0;\n ttopts.top += options.offsety || 0;\n\n ttopts.css = options.css;\n ttopts.fadeDuration = options.fadeDuration;\n\n showToolTipImpl(tooltip, ttopts);\n\n return tooltip;\n }\n\n /**\n * Show a tooltip positioned near this area.\n *\n * @param {string|jquery|function} [content] A string of html, jQuery object or function that returns same containing the tooltip content.\n\n * @param {object} [options] options to apply when creating this tooltip\n * @config {string|jquery} [container] An element within which the tooltip must be bounded\n * @config {bool} [template] a template to use instead of the default. If this property exists and is null,\n * then no template will be used.\n * @config {string} [closeEvents] A string with one or more comma-separated values that determine when the tooltip\n * closes: 'area-click','tooltip-click','image-mouseout','image-click' are valid values\n * then no template will be used.\n * @config {int} [offsetx] the horizontal amount to offset the tooltip\n * @config {int} [offsety] the vertical amount to offset the tooltip\n * @config {string|object} [css] CSS to apply to the outermost element of the tooltip\n * @config {bool} [fadeDuration] When non-zero, the duration in milliseconds of a fade-in effect for the tooltip.\n */\n m.AreaData.prototype.showToolTip = function (content, options) {\n var tooltip,\n closeOpts,\n target,\n tipClosed,\n template,\n ttopts = {},\n ad = this,\n md = ad.owner,\n areaOpts = ad.effectiveOptions();\n\n // copy the options object so we can update it\n options = options ? $.extend({}, options) : {};\n\n content = content || areaOpts.toolTip;\n closeOpts =\n options.closeEvents ||\n areaOpts.toolTipClose ||\n md.options.toolTipClose ||\n 'tooltip-click';\n\n template =\n typeof options.template !== 'undefined'\n ? options.template\n : md.options.toolTipContainer;\n\n options.closeEvents =\n typeof closeOpts === 'string'\n ? (closeOpts = u.split(closeOpts))\n : closeOpts;\n\n options.fadeDuration =\n options.fadeDuration ||\n (md.options.toolTipFade\n ? u.isNumeric(areaOpts.fadeDuration)\n ? areaOpts.fadeDuration\n : md.options.fadeDuration\n : 0);\n\n target = ad.area\n ? ad.area\n : $.map(ad.areas(), function (e) {\n return e.area;\n });\n\n if (md.activeToolTipID === ad.areaId) {\n return;\n }\n\n md.clearToolTip();\n\n var effectiveContent = u.isFunction(content)\n ? content({ key: this.key, target: target })\n : content;\n\n if (!effectiveContent) {\n return;\n }\n\n md.activeToolTip = tooltip = createToolTip(\n effectiveContent,\n template,\n options.css\n );\n\n md.activeToolTipID = ad.areaId;\n\n tipClosed = function () {\n md.clearToolTip();\n };\n\n bindToolTipClose(\n closeOpts,\n 'area-click',\n 'click',\n $(md.map),\n null,\n tipClosed\n );\n bindToolTipClose(\n closeOpts,\n 'tooltip-click',\n 'click',\n tooltip,\n null,\n tipClosed\n );\n bindToolTipClose(\n closeOpts,\n 'image-mouseout',\n 'mouseout',\n $(md.image),\n function (e) {\n return (\n e.relatedTarget &&\n e.relatedTarget.nodeName !== 'AREA' &&\n e.relatedTarget !== ad.area\n );\n },\n tipClosed\n );\n bindToolTipClose(\n closeOpts,\n 'image-click',\n 'click',\n $(md.image),\n null,\n tipClosed\n );\n\n showToolTip(tooltip, target, md.image, options.container, options);\n\n u.ifFunction(md.options.onShowToolTip, ad.area, {\n toolTip: tooltip,\n options: ttopts,\n areaOptions: areaOpts,\n key: ad.key,\n selected: ad.isSelected()\n });\n\n return tooltip;\n };\n\n /**\n * Parse an object that could be a string, a jquery object, or an object with a \"contents\" property\n * containing html or a jQuery object.\n *\n * @param {object|string|jQuery} options The parameter to parse\n * @return {string|jquery} A string or jquery object\n */\n function getHtmlFromOptions(options) {\n // see if any html was passed as either the options object itself, or the content property\n\n return options\n ? typeof options === 'string' || options.jquery || u.isFunction(options)\n ? options\n : options.content\n : null;\n }\n\n function getOptionsFromOptions(options) {\n return options\n ? typeof options == 'string' || options.jquery || u.isFunction(options)\n ? { content: options }\n : options\n : {};\n }\n\n /**\n * Activate or remove a tooltip for an area. When this method is called on an area, the\n * key parameter doesn't apply and \"options\" is the first parameter.\n *\n * When called with no parameters, or \"key\" is a falsy value, any active tooltip is cleared.\n *\n * When only a key is provided, the default tooltip for the area is used.\n *\n * When html is provided, this is used instead of the default tooltip.\n *\n * When \"noTemplate\" is true, the default tooltip template will not be used either, meaning only\n * the actual html passed will be used.\n *\n * @param {string|AreaElement|HTMLElement} key The area key or element for which to activate a tooltip, or a DOM element/selector.\n *\n * @param {object|string|jquery} [options] options to apply when creating this tooltip - OR -\n * The markup, or a jquery object, containing the data for the tooltip\n * @config {string|jQuery|function} [content] the inner content of the tooltip; the tooltip text, HTML or function that returns same\n * @config {Element|jQuery} [container] the inner content of the tooltip; the tooltip text or HTML\n * @config {bool} [template] a template to use instead of the default. If this property exists and is null,\n * then no template will be used.\n * @config {string} [closeEvents] A string with one or more comma-separated values that determine when the tooltip\n * closes: 'area-click','tooltip-click','image-mouseout','image-click','generic-click','generic-mouseout' are valid values\n * @config {int} [offsetx] the horizontal amount to offset the tooltip.\n * @config {int} [offsety] the vertical amount to offset the tooltip.\n * @config {string|object} [css] CSS to apply to the outermost element of the tooltip\n * @config {bool} [fadeDuration] When non-zero, the duration in milliseconds of a fade-in effect for the tooltip.\n * @return {jQuery} The jQuery object\n */\n\n m.impl.tooltip = function (key, options) {\n return new m.Method(\n this,\n function mapData() {\n var tooltip,\n target,\n defaultTarget,\n closeOpts,\n tipClosed,\n md = this;\n if (!key) {\n md.clearToolTip();\n } else {\n target = $(key);\n defaultTarget = target && target.length > 0 ? target[0] : null;\n if (md.activeToolTipID === defaultTarget) {\n return;\n }\n\n md.clearToolTip();\n if (!defaultTarget) {\n return;\n }\n\n var content = getHtmlFromOptions(options),\n effectiveContent = u.isFunction(content)\n ? content({ key: this.key, target: target })\n : content;\n\n if (!effectiveContent) {\n return;\n }\n\n options = getOptionsFromOptions(options);\n\n closeOpts =\n options.closeEvents || md.options.toolTipClose || 'tooltip-click';\n\n options.closeEvents =\n typeof closeOpts === 'string'\n ? (closeOpts = u.split(closeOpts))\n : closeOpts;\n\n options.fadeDuration =\n options.fadeDuration ||\n (md.options.toolTipFade ? md.options.fadeDuration : 0);\n\n tipClosed = function () {\n md.clearToolTip();\n };\n\n md.activeToolTip = tooltip = createToolTip(\n effectiveContent,\n options.template || md.options.toolTipContainer,\n options.css\n );\n md.activeToolTipID = defaultTarget;\n\n bindToolTipClose(\n closeOpts,\n 'tooltip-click',\n 'click',\n tooltip,\n null,\n tipClosed\n );\n\n bindToolTipClose(\n closeOpts,\n 'generic-mouseout',\n 'mouseout',\n target,\n null,\n tipClosed\n );\n\n bindToolTipClose(\n closeOpts,\n 'generic-click',\n 'click',\n target,\n null,\n tipClosed\n );\n\n md.activeToolTip = tooltip = showToolTip(\n tooltip,\n target,\n md.image,\n options.container,\n options\n );\n }\n },\n function areaData() {\n if ($.isPlainObject(key) && !options) {\n options = key;\n }\n\n this.showToolTip(\n getHtmlFromOptions(options),\n getOptionsFromOptions(options)\n );\n },\n {\n name: 'tooltip',\n args: arguments,\n key: key\n }\n ).go();\n };\n})(jQuery);\n\n}));\n"]}