Subway Map
<--------- scroll left or right --------->
Junior
Engineer
Senior Engineer
Developer
Senior Developer
Technical Lead
Senior Technical Lead
Analyst
Senior Analyst
Development Lead
Development Manager
Team Lead / Tech Lead
IT Operations Manager
Solutions Architect
Estate / Senior Solutions Architect
QA Team Lead
Test Manager
Project / Implementation Lead
Project / Implementation Manager
Portfolio Manager
Analyst - Business / Technical
Senior Analyst - Business / Techical
Test 1
Test 2
Test 3
Test 4
Test 5
Test 6
Test 1
Test 2
Test 3
Test 4
Test 5
Test 6
Test 1
Test 2
Test 3
Test 4
Test 5
Test 6
{"ScriptPreparationCode":"/*\r\n\r\nCopyright (c) 2010 Nik Kalyani nik@kalyani.com http://www.kalyani.com\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \u0022Software\u0022), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \u0022AS IS\u0022, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n\r\n*/\r\n\r\n(function ($) {\r\n\r\n var plugin = {\r\n\r\n defaults: {\r\n debug: false,\r\n grid: false\r\n },\r\n\r\n options: {\r\n },\r\n\r\n identity: function (type) {\r\n if (type === undefined) type = \u0022name\u0022;\r\n\r\n switch (type.toLowerCase()) {\r\n case \u0022version\u0022: return \u00221.0.0\u0022; break;\r\n default: return \u0022subwayMap Plugin\u0022; break;\r\n }\r\n },\r\n _debug: function (s) {\r\n if (this.options.debug)\r\n this._log(s);\r\n },\r\n _log: function () {\r\n if (window.console \u0026\u0026 window.console.log)\r\n window.console.log(\u0027[subwayMap] \u0027 \u002B Array.prototype.join.call(arguments, \u0027 \u0027));\r\n },\r\n _supportsCanvas: function () {\r\n var canvas = $(\u0022\u003Ccanvas\u003E\u003C/canvas\u003E\u0022);\r\n if (canvas[0].getContext)\r\n return true;\r\n else\r\n return false;\r\n },\r\n _getCanvasLayer: function (el, overlay) {\r\n this.layer\u002B\u002B;\r\n var canvas = $(\u0022\u003Ccanvas style=\u0027position:absolute;z-Index:\u0022 \u002B ((overlay ? 2000 : 1000) \u002B this.layer) \u002B \u0022\u0027 width=\u0027\u0022 \u002B this.options.pixelWidth \u002B \u0022\u0027 height=\u0027\u0022 \u002B this.options.pixelHeight \u002B \u0022\u0027\u003E\u003C/canvas\u003E\u0022);\r\n el.append(canvas);\r\n return (canvas[0].getContext(\u00222d\u0022));\r\n },\r\n _render: function (el) {\r\n\r\n this.layer = -1;\r\n var rows = el.attr(\u0022data-rows\u0022);\r\n if (rows === undefined) \r\n rows = 10;\r\n else\r\n rows = parseInt(rows);\r\n\r\n var columns = el.attr(\u0022data-columns\u0022);\r\n if (columns === undefined) \r\n columns = 10;\r\n else\r\n columns = parseInt(columns);\r\n\r\n var scale = el.attr(\u0022data-cellSize\u0022);\r\n if (scale === undefined) \r\n scale = 100;\r\n else\r\n scale = parseInt(scale);\r\n\r\n var lineWidth = el.attr(\u0022data-lineWidth\u0022);\r\n if (lineWidth === undefined) \r\n lineWidth = 10;\r\n else\r\n lineWidth = parseInt(lineWidth);\r\n\r\n var textClass = el.attr(\u0022data-textClass\u0022);\r\n if (textClass === undefined) textClass = \u0022\u0022;\r\n\r\n var grid = el.attr(\u0022data-grid\u0022);\r\n if ((grid === undefined) || (grid.toLowerCase() == \u0022false\u0022))\r\n grid = false;\r\n else\r\n grid = true;\r\n\r\n var legendId = el.attr(\u0022data-legendId\u0022);\r\n if (legendId === undefined) legendId = \u0022\u0022;\r\n\r\n var gridNumbers = el.attr(\u0022data-gridNumbers\u0022);\r\n if ((gridNumbers === undefined) || (gridNumbers.toLowerCase() == \u0022false\u0022))\r\n gridNumbers = false;\r\n else\r\n gridNumbers = true;\r\n\r\n var reverseMarkers = el.attr(\u0022data-reverseMarkers\u0022);\r\n if ((reverseMarkers === undefined) || (reverseMarkers.toLowerCase() == \u0022false\u0022))\r\n reverseMarkers = false;\r\n else\r\n reverseMarkers = true;\r\n\r\n\r\n this.options.pixelWidth = columns * scale;\r\n this.options.pixelHeight = rows * scale;\r\n\r\n //el.css(\u0022width\u0022, this.options.pixelWidth);\r\n //el.css(\u0022height\u0022, this.options.pixelHeight);\r\n self = this;\r\n var lineLabels = [];\r\n var supportsCanvas = $(\u0022\u003Ccanvas\u003E\u003C/canvas\u003E\u0022)[0].getContext;\r\n if (supportsCanvas) {\r\n\r\n if (grid) this._drawGrid(el, scale, gridNumbers);\r\n $(el).children(\u0022ul\u0022).each(function (index) {\r\n var ul = $(this);\r\n\r\n var color = $(ul).attr(\u0022data-color\u0022);\r\n if (color === undefined) color = \u0022#000000\u0022;\r\n\r\n var lineTextClass = $(ul).attr(\u0022data-textClass\u0022);\r\n if (lineTextClass === undefined) lineTextClass = \u0022\u0022; \r\n\r\n var shiftCoords = $(ul).attr(\u0022data-shiftCoords\u0022);\r\n if (shiftCoords === undefined) shiftCoords = \u0022\u0022;\r\n\r\n var shiftX = 0.00;\r\n var shiftY = 0.00;\r\n if (shiftCoords.indexOf(\u0022,\u0022) \u003E -1) {\r\n shiftX = parseInt(shiftCoords.split(\u0022,\u0022)[0]) * lineWidth/scale;\r\n shiftY = parseInt(shiftCoords.split(\u0022,\u0022)[1]) * lineWidth/scale;\r\n }\r\n\r\n var lineLabel = $(ul).attr(\u0022data-label\u0022);\r\n if (lineLabel === undefined) \r\n lineLabel = \u0022Line \u0022 \u002B index;\r\n\r\n lineLabels[lineLabels.length] = {label: lineLabel, color: color};\r\n\r\n var nodes = [];\r\n $(ul).children(\u0022li\u0022).each(function () {\r\n\r\n var coords = $(this).attr(\u0022data-coords\u0022);\r\n if (coords === undefined) coords = \u0022\u0022;\r\n\r\n var dir = $(this).attr(\u0022data-dir\u0022);\r\n if (dir === undefined) dir = \u0022\u0022;\r\n\r\n var labelPos = $(this).attr(\u0022data-labelPos\u0022);\r\n if (labelPos === undefined) labelPos = \u0022s\u0022;\r\n\r\n var marker = $(this).attr(\u0022data-marker\u0022);\r\n if (marker == undefined) marker = \u0022\u0022;\r\n\r\n var markerInfo = $(this).attr(\u0022data-markerInfo\u0022);\r\n if (markerInfo == undefined) markerInfo = \u0022\u0022;\r\n\r\n var anchor = $(this).children(\u0022a:first-child\u0022);\r\n var label = $(this).text();\r\n if (label === undefined) label = \u0022\u0022;\r\n\r\n var link = \u0022\u0022;\r\n var title = \u0022\u0022;\r\n if (anchor != undefined) {\r\n link = $(anchor).attr(\u0022href\u0022);\r\n if (link === undefined) link = \u0022\u0022;\r\n title = $(anchor).attr(\u0022title\u0022);\r\n if (title === undefined) title = \u0022\u0022;\r\n }\r\n\r\n self._debug(\u0022Coords=\u0022 \u002B coords \u002B \u0022; Dir=\u0022 \u002B dir \u002B \u0022; Link=\u0022 \u002B link \u002B \u0022; Label=\u0022 \u002B label \u002B \u0022; labelPos=\u0022 \u002B labelPos \u002B \u0022; Marker=\u0022 \u002B marker);\r\n\r\n var x = \u0022\u0022;\r\n var y = \u0022\u0022;\r\n if (coords.indexOf(\u0022,\u0022) \u003E -1) {\r\n x = Number(coords.split(\u0022,\u0022)[0]) \u002B (marker.indexOf(\u0022interchange\u0022) \u003E -1 ? 0 : shiftX);\r\n y = Number(coords.split(\u0022,\u0022)[1]) \u002B (marker.indexOf(\u0022interchange\u0022) \u003E -1 ? 0 : shiftY);\r\n }\r\n nodes[nodes.length] = { x: x, y:y, direction: dir, marker: marker, markerInfo: markerInfo, link: link, title: title, label: label, labelPos: labelPos};\r\n });\r\n if (nodes.length \u003E 0)\r\n self._drawLine(el, scale, rows, columns, color, (lineTextClass != \u0022\u0022 ? lineTextClass : textClass), lineWidth, nodes, reverseMarkers);\r\n $(ul).remove();\r\n });\r\n\r\n if ((lineLabels.length \u003E 0) \u0026\u0026 (legendId != \u0022\u0022))\r\n {\r\n var legend = $(\u0022#\u0022 \u002B legendId);\r\n\r\n for(var line=0; line\u003ClineLabels.length; line\u002B\u002B)\r\n legend.append(\u0022\u003Cdiv\u003E\u003Cspan style=\u0027float:left;width:100px;height:\u0022 \u002B lineWidth \u002B \u0022px;background-color:\u0022 \u002B lineLabels[line].color \u002B \u0022\u0027\u003E\u003C/span\u003E\u0022 \u002B lineLabels[line].label \u002B \u0022\u003C/div\u003E\u0022);\r\n }\r\n\r\n }\r\n },\r\n _drawLine: function (el, scale, rows, columns, color, textClass, width, nodes, reverseMarkers) {\r\n\r\n var ctx = this._getCanvasLayer(el, false);\r\n ctx.beginPath();\r\n ctx.moveTo(nodes[0].x * scale, nodes[0].y * scale);\r\n var markers = [];\r\n var lineNodes = [];\r\n for(var node = 0; node \u003C nodes.length; node\u002B\u002B)\r\n {\r\n if (nodes[node].marker.indexOf(\u0022@\u0022) != 0)\r\n lineNodes[lineNodes.length] = nodes[node];\r\n }\r\n for (var lineNode = 0; lineNode \u003C lineNodes.length; lineNode\u002B\u002B) {\r\n if (lineNode \u003C (lineNodes.length - 1)) {\r\n var nextNode = lineNodes[lineNode \u002B 1];\r\n var currNode = lineNodes[lineNode];\r\n\r\n // Correction for edges so lines are not running off campus\r\n var xCorr = 0;\r\n var yCorr = 0;\r\n if (nextNode.x == 0) xCorr = width / 2;\r\n if (nextNode.x == columns) xCorr = -1 * width / 2;\r\n if (nextNode.y == 0) yCorr = width / 2;\r\n if (nextNode.y == rows) yCorr = -1 * width / 2;\r\n\r\n var xVal = 0;\r\n var yVal = 0;\r\n var direction = \u0022\u0022;\r\n\r\n var xDiff = Math.round(Math.abs(currNode.x - nextNode.x));\r\n var yDiff = Math.round(Math.abs(currNode.y - nextNode.y));\r\n if ((xDiff == 0) || (yDiff == 0)) {\r\n // Horizontal or Vertical\r\n ctx.lineTo((nextNode.x * scale) \u002B xCorr, (nextNode.y * scale) \u002B yCorr);\r\n }\r\n else if ((xDiff == 1) \u0026\u0026 (yDiff == 1)) {\r\n // 90 degree turn\r\n if (nextNode.direction != \u0022\u0022)\r\n direction = nextNode.direction.toLowerCase();\r\n switch (direction) {\r\n case \u0022s\u0022: xVal = 0; yVal = scale; break;\r\n case \u0022e\u0022: xVal = scale; yVal = 0; break;\r\n case \u0022w\u0022: xVal = -1 * scale; yVal = 0; break;\r\n default: xVal = 0; yVal = -1 * scale; break;\r\n }\r\n ctx.quadraticCurveTo((currNode.x * scale) \u002B xVal, (currNode.y * scale) \u002B yVal,\r\n (nextNode.x * scale) \u002B xCorr, (nextNode.y * scale) \u002B yCorr);\r\n }\r\n else if (xDiff == yDiff) {\r\n // Symmetric, angular with curves at both ends\r\n if (nextNode.x \u003C currNode.x) {\r\n if (nextNode.y \u003C currNode.y)\r\n direction = \u0022nw\u0022;\r\n else\r\n direction = \u0022sw\u0022;\r\n }\r\n else {\r\n if (nextNode.y \u003C currNode.y)\r\n direction = \u0022ne\u0022;\r\n else\r\n direction = \u0022se\u0022;\r\n }\r\n var dirVal = 1;\r\n switch (direction) {\r\n case \u0022nw\u0022: xVal = -1 * (scale / 2); yVal = 1; dirVal = 1; break;\r\n case \u0022sw\u0022: xVal = -1 * (scale / 2); yVal = -1; dirVal = 1; break;\r\n case \u0022se\u0022: xVal = (scale / 2); yVal = -1; dirVal = -1; break;\r\n case \u0022ne\u0022: xVal = (scale / 2); yVal = 1; dirVal = -1; break;\r\n }\r\n this._debug((currNode.x * scale) \u002B xVal \u002B \u0022, \u0022 \u002B (currNode.y * scale) \u002B \u0022; \u0022 \u002B (nextNode.x \u002B (dirVal * xDiff / 2)) * scale \u002B \u0022, \u0022 \u002B\r\n (nextNode.y \u002B (yVal * xDiff / 2)) * scale)\r\n ctx.bezierCurveTo(\r\n (currNode.x * scale) \u002B xVal, (currNode.y * scale),\r\n (currNode.x * scale) \u002B xVal, (currNode.y * scale),\r\n (nextNode.x \u002B (dirVal * xDiff / 2)) * scale, (nextNode.y \u002B (yVal * xDiff / 2)) * scale);\r\n ctx.bezierCurveTo(\r\n (nextNode.x * scale) \u002B (dirVal * scale / 2), (nextNode.y) * scale,\r\n (nextNode.x * scale) \u002B (dirVal * scale / 2), (nextNode.y) * scale,\r\n nextNode.x * scale, nextNode.y * scale);\r\n }\r\n else\r\n ctx.lineTo(nextNode.x * scale, nextNode.y * scale);\r\n }\r\n } \r\n\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = width;\r\n ctx.stroke();\r\n\r\n ctx = this._getCanvasLayer(el, true);\r\n for (var node = 0; node \u003C nodes.length; node\u002B\u002B) {\r\n this._drawMarker(el, ctx, scale, color, textClass, width, nodes[node], reverseMarkers);\r\n }\r\n\r\n\r\n },\r\n _drawMarker: function (el, ctx, scale, color, textClass, width, data, reverseMarkers) {\r\n\r\n if (data.label == \u0022\u0022) return;\r\n if (data.marker == \u0022\u0022) data.marker = \u0022station\u0022;\r\n\r\n // Scale coordinates for rendering\r\n var x = data.x * scale;\r\n var y = data.y * scale;\r\n\r\n // Keep it simple -- black on white, or white on black\r\n var fgColor = \u0022#000000\u0022;\r\n var bgColor = \u0022#ffffff\u0022;\r\n if (reverseMarkers)\r\n {\r\n fgColor = \u0022#ffffff\u0022;\r\n bgColor = \u0022#000000\u0022;\r\n }\r\n\r\n // Render station and interchange icons\r\n ctx.strokeStyle = fgColor;\r\n ctx.fillStyle = bgColor;\r\n ctx.beginPath();\r\n switch(data.marker.toLowerCase())\r\n {\r\n case \u0022interchange\u0022:\r\n case \u0022@interchange\u0022:\r\n ctx.lineWidth = width;\r\n if (data.markerInfo == \u0022\u0022)\r\n ctx.arc(x, y, width * 0.7, 0, Math.PI * 2, true);\r\n else\r\n {\r\n var mDir = data.markerInfo.substr(0,1).toLowerCase();\r\n var mSize = parseInt(data.markerInfo.substr(1,10));\r\n if (((mDir == \u0022v\u0022) || (mDir == \u0022h\u0022)) \u0026\u0026 (mSize \u003E 1))\r\n {\r\n if (mDir == \u0022v\u0022)\r\n {\r\n ctx.arc(x, y, width * 0.7,290 * Math.PI/180, 250 * Math.PI/180, false);\r\n ctx.arc(x, y-(width*mSize), width * 0.7,110 * Math.PI/180, 70 * Math.PI/180, false);\r\n }\r\n else\r\n {\r\n ctx.arc(x, y, width * 0.7,20 * Math.PI/180, 340 * Math.PI/180, false);\r\n ctx.arc(x\u002B(width*mSize), y, width * 0.7,200 * Math.PI/180, 160 * Math.PI/180, false);\r\n }\r\n }\r\n else\r\n ctx.arc(x, y, width * 0.7, 0, Math.PI * 2, true);\r\n }\r\n break;\r\n case \u0022station\u0022:\r\n case \u0022@station\u0022:\r\n ctx.lineWidth = width/2;\r\n ctx.arc(x, y, width/2, 0, Math.PI * 2, true);\r\n break;\r\n }\r\n ctx.closePath();\r\n ctx.stroke();\r\n ctx.fill();\r\n \r\n // Render text labels and hyperlinks\r\n var pos = \u0022\u0022;\r\n var offset = width \u002B 4;\r\n var topOffset = 0;\r\n var centerOffset = \u0022-50px\u0022;\r\n switch(data.labelPos.toLowerCase())\r\n {\r\n case \u0022n\u0022:\r\n pos = \u0022text-align: center; margin: 0 0 \u0022 \u002B offset \u002B \u0022px \u0022 \u002B centerOffset;\r\n topOffset = offset * 2;\r\n break;\r\n case \u0022w\u0022:\r\n pos = \u0022text-align: right; margin:0 \u0022 \u002B offset \u002B \u0022px 0 -\u0022 \u002B (100 \u002B offset) \u002B \u0022px\u0022;\r\n topOffset = offset;\r\n break;\r\n case \u0022e\u0022:\r\n pos = \u0022text-align: left; margin:0 0 0 \u0022 \u002B offset \u002B \u0022px\u0022;\r\n topOffset = offset;\r\n break;\r\n case \u0022s\u0022:\r\n pos = \u0022text-align: center; margin:\u0022 \u002B offset \u002B \u0022px 0 0 \u0022 \u002B centerOffset;\r\n break;\r\n case \u0022se\u0022:\r\n pos = \u0022text-align: left; margin:\u0022 \u002B offset \u002B \u0022px 0 0 \u0022 \u002B offset \u002B \u0022px\u0022;\r\n break;\r\n case \u0022ne\u0022:\r\n pos = \u0022text-align: left; padding-left: \u0022 \u002B offset \u002B \u0022px; margin: 0 0 \u0022 \u002B offset \u002B \u0022px 0\u0022;\r\n topOffset = offset * 2;\r\n break;\r\n case \u0022sw\u0022: //TODO\r\n pos = \u0022text-align: right; margin:0 \u0022 \u002B offset \u002B \u0022px 0 -\u0022 \u002B (100 \u002B offset) \u002B \u0022px\u0022;\r\n topOffset = offset;\r\n break;\r\n case \u0022nw\u0022: //TODO\r\n pos = \u0022text-align: right; margin:0 \u0022 \u002B offset \u002B \u0022px 0 -\u0022 \u002B (100 \u002B offset) \u002B \u0022px\u0022;\r\n topOffset = offset;\r\n break;\r\n }\r\n var style = (textClass != \u0022\u0022 ? \u0022class=\u0027\u0022 \u002B textClass \u002B \u0022\u0027 \u0022 : \u0022\u0022) \u002B \u0022style=\u0027\u0022 \u002B (textClass == \u0022\u0022 ? \u0022font-size:8pt;font-family:Verdana,Arial,Helvetica,Sans Serif;text-decoration:none;\u0022 : \u0022\u0022) \u002B \u0022width:100px;\u0022 \u002B (pos != \u0022\u0022 ? pos : \u0022\u0022) \u002B \u0022;position:absolute;top:\u0022 \u002B (y \u002B el.offset().top - (topOffset \u003E 0 ? topOffset : 0)) \u002B \u0022px;left:\u0022 \u002B (x \u002B el.offset().left) \u002B \u0022px;z-index:3000;\u0027\u0022;\r\n if (data.link != \u0022\u0022)\r\n $(\u0022\u003Ca \u0022 \u002B style \u002B \u0022 title=\u0027\u0022 \u002B data.title.replace(/\\\\n/g,\u0022\u003Cbr /\u003E\u0022) \u002B \u0022\u0027 href=\u0027\u0022 \u002B data.link \u002B \u0022\u0027 target=\u0027_parent\u0027\u003E\u0022 \u002B data.label.replace(/\\\\n/g,\u0022\u003Cbr /\u003E\u0022) \u002B \u0022\u003C/span\u003E\u0022).appendTo(el);\r\n else\r\n $(\u0022\u003Cspan \u0022 \u002B style \u002B \u0022\u003E\u0022 \u002B data.label.replace(/\\\\n/g,\u0022\u003Cbr /\u003E\u0022) \u002B \u0022\u003C/span\u003E\u0022).appendTo(el);;\r\n \r\n },\r\n _drawGrid: function (el, scale, gridNumbers) {\r\n\r\n var ctx = this._getCanvasLayer(el, false);\r\n ctx.fillStyle = \u0022#000\u0022;\r\n ctx.beginPath();\r\n var counter = 0;\r\n for (var x = 0.5; x \u003C this.options.pixelWidth; x \u002B= scale) {\r\n if (gridNumbers)\r\n {\r\n ctx.moveTo(x, 0);\r\n ctx.fillText(counter\u002B\u002B, x-15, 10);\r\n }\r\n ctx.moveTo(x, 0);\r\n ctx.lineTo(x, this.options.pixelHeight);\r\n }\r\n ctx.moveTo(this.options.pixelWidth - 0.5, 0);\r\n ctx.lineTo(this.options.pixelWidth - 0.5, this.options.pixelHeight);\r\n\r\n counter = 0;\r\n for (var y = 0.5; y \u003C this.options.pixelHeight; y \u002B= scale) {\r\n if (gridNumbers)\r\n {\r\n ctx.moveTo(0, y);\r\n ctx.fillText(counter\u002B\u002B, 0, y-15);\r\n }\r\n ctx.moveTo(0, y);\r\n ctx.lineTo(this.options.pixelWidth, y);\r\n }\r\n ctx.moveTo(0, this.options.pixelHeight - 0.5);\r\n ctx.lineTo(this.options.pixelWidth, this.options.pixelHeight - 0.5);\r\n ctx.strokeStyle = \u0022#eee\u0022;\r\n ctx.lineWidth = 1;\r\n ctx.stroke();\r\n ctx.fill();\r\n ctx.closePath();\r\n\r\n }\r\n}\r\n\r\nvar methods = {\r\n\r\n init: function (options) {\r\n\r\n plugin.options = $.extend({}, plugin.defaults, options);\r\n // iterate and reformat each matched element\r\n return this.each(function (index) {\r\n\r\n plugin.options = $.meta\r\n ? $.extend(plugin.options, $(this).data())\r\n : plugin.options;\r\n\r\n plugin._debug(\u0022BEGIN: \u0022 \u002B plugin.identity() \u002B \u0022 for element \u0022 \u002B index);\r\n\r\n plugin._render($(this));\r\n\r\n plugin._debug(\u0022END: \u0022 \u002B plugin.identity() \u002B \u0022 for element \u0022 \u002B index);\r\n });\r\n\r\n },\r\n drawLine: function (data) {\r\n plugin._drawLine(data.element, data.scale, data.rows, data.columns, data.color, data.width, data.nodes);\r\n },\r\n};\r\n\r\n$.fn.subwayMap = function (method) {\r\n\r\n // Method calling logic\r\n if (methods[method]) {\r\n return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\r\n } else if (typeof method === \u0027object\u0027 || !method) {\r\n return methods.init.apply(this, arguments);\r\n } else {\r\n $.error(\u0027Method \u0027 \u002B method \u002B \u0027 does not exist on jQuery.tooltip\u0027);\r\n }\r\n\r\n};\r\n\r\n})(jQuery);","TestCases":[{"Name":"test1","Code":"1","IsDeferred":false},{"Name":"test2","Code":"2","IsDeferred":false}]}