{"version":3,"sources":["jquery.qtip/jquery.qtip.js"],"names":["window","document","undefined","factory","define","amd","jQuery","fn","qtip","$","QTIP","PROTOTYPE","CORNER","CHECKS","trackingBound","TRUE","FALSE","NULL","X","Y","WIDTH","HEIGHT","TOP","LEFT","BOTTOM","RIGHT","CENTER","SHIFT","PLUGINS","NAMESPACE","ATTR_HAS","ATTR_ID","WIDGET","SELECTOR","INACTIVE_EVENTS","split","CLASS_FIXED","CLASS_DEFAULT","CLASS_FOCUS","CLASS_HOVER","CLASS_DISABLED","replaceSuffix","oldtitle","BROWSER","ie","v","i","createElement","innerHTML","getElementsByTagName","NaN","iOS","parseFloat","exec","navigator","userAgent","replace","QTip","target","options","id","attr","this","tooltip","elements","_id","timers","img","plugins","cache","event","disabled","onTooltip","lastClass","rendered","destroyed","waiting","hiddenDuringWait","positioning","triggering","invalidOpt","a","type","invalidContent","c","isFunction","length","jquery","then","sanitizeOptions","opts","content","text","ajax","once","metadata","done","api","loading","deferred","extend","context","success","error","set","xhr","status","isPlainObject","title","button","position","my","at","show","ready","hide","style","classes","each","sanitize","convertNotation","notation","obj","option","levels","pop","setCallback","args","category","rule","match","checks","RegExp","push","apply","prototype","_when","deferreds","when","render","self","posOptions","posClass","_createPosClass","class","join","width","height","tracking","adjust","mouse","role","aria-live","aria-atomic","aria-describedby","aria-hidden","toggleClass","data","appendTo","container","append","_createTitle","_updateTitle","_createButton","_updateContent","_setWidget","name","instance","initialize","_unassignEvents","_assignEvents","_trigger","toggle","destroy","immediate","process","timer","stop","find","remove","end","clearTimeout","removeData","removeAttr","suppress","call","one","proxy","builtin","^id$","o","prev","nextid","new_id","^prerender","^content.text$","^content.attr$","^content.title$","_removeTitle","^content.button$","_updateButton","^content.title.(text|button)$","^position.(my|at)$","^position.container$","^show.ready$","^style.classes$","p","removeClass","addClass","^style.(width|height)","css","^style.widget|content.title","^style.def","^events.(render|show|move|hide|focus|blur)$","^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)","get","toLowerCase","result","precedance","string","rmove","rrender","value","reposition","test","previous","nodeType","offsetWidth","_update","element","e","empty","display","visibility","html","_waitForContent","images","imagesLoaded","Deferred","resolve","promise","titlebar","widget","createWidgetClass","insertBefore","delegate","substr","abbrev","effect","pluginCalculations","offset","adjusted","newClass","viewport","method","tooltipWidth","outerWidth","tooltipHeight","outerHeight","targetWidth","targetHeight","left","top","visible","isScroll","win","doc","ownerDocument","isArray","x","y","distance","origin","pageX","body","innerWidth","documentElement","clientWidth","pageY","scrollX","scrollLeft","scrollY","scrollTop","eq","innerHeight","imagemap","is","svg","ownerSVGElement","adjustable","elem","isNaN","queue","next","opacity","removeAttribute","pos","scrolled","parentOffset","overflow","quirks","compatMode","parent","scroll","getBoundingClientRect","offsetParent","C","Corner","corner","forceY","f","charAt","cls","concat","delay","callback","duration","setTimeout","showMethod","hasClass","hideMethod","relatedTarget","ontoTooltip","closest","ontoTarget","fixed","preventDefault","stopImmediatePropagation","inactiveMethod","inactive","repositionMethod","selector","events","arguments","invert","z","center","clone","state","add","has","fix","identicalState","allow","after","contentOptions","animate","sameTarget","search","focus","bind","_storeMouse","solo","not","Event","unbind","blur","autofocus","trigger","n","fadeTo","qtips","curIndex","parseInt","zIndex","newIndex","zindex","filter","disable","enable","close","aria-label","prepend","click","on","def","_bind","targets","suffix","ns","_unbind","originalEvent","isDefaultPrevented","_bindEvents","showEvents","hideEvents","showTargets","hideTargets","similarTargets","toggleEvents","showIndex","inArray","splice","_assignInitialEvents","showTarget","hideTarget","trim","hoverIntent","prerender","onTarget","containerTarget","viewportTarget","documentTarget","windowTarget","leave","nodeName","indexOf","enabled","isAncestor","parents","inactiveEvents","limit","abs","Math","resize","special","grep","toArray","currentTarget","newValue","command","returned","makeArray","slice","timeStamp","config","docBody","newTarget","metadata5","html5","parseJSON","defaults","overwrite","init","val","keepData","elems","func","old","ui","cleanData","triggerHandler","version","move","hidden","TIP","MARGIN","BORDER","COLOR","BG_COLOR","TRANSPARENT","IMPORTANT","HASCANVAS","getContext","INVALID","camel","s","toUpperCase","cssProps","cssPrefixes","intCss","prop","ceil","cur","ucProp","props","vendorCss","SCALE","devicePixelRatio","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","createVML","tag","Tip","_ns","size","tip","prependTo","lineJoin","miterLimit","save","stopPropagation","create","_swapDimensions","_resetDimensions","_useTitle","_parseCorner","_parseWidth","side","use","_parseRadius","_invalidColour","compare","_parseColours","borderSide","colorElem","color","_calculateSize","ratio","isCenter","base","pow","round","smallHyp","sqrt","hyp","border","reverse","_calculateTip","scale","width2","height2","tips","br","bl","tr","tl","tc","bc","rc","lc","lt","rt","lb","rb","_drawCoords","coords","beginPath","moveTo","lineTo","closePath","update","bigCoords","translate","newSize","inner","children","curSize","mimic","lineHeight","restore","clearRect","fillStyle","fill","coordsize","antialias","Number","$this","path","fillcolor","filled","stroked","opera","calculate","corners","userOffset","b","max","margin","bottom","right","newCorner","horizontal","vertical","shift","shiftflip","cornerTop","cornerLeft","user","shiftonly","direction","popposite","opposite","xy","^position.my|style.tip.(corner|mimic|border)$","^style.tip.(height|width)$","^content.title|style.(classes|widget)$","elemWidth","elemHeight","newMy","containerOffset","containerStatic","viewportWidth","viewportHeight","viewportScroll","viewportOffset","methodX","methodY","otherSide","side1","side2","lengthName","targetLength","elemLength","initialPos","mySide","atSide","isShift","myLength","atLength","sideOffset","overflow1","overflow2","min","polys","polygon","baseCoords","newWidth","newHeight","compareX","compareY","realX","realY","floor","rect","ax","ay","bx","by","_angles","ellipse","cx","cy","rx","ry","rxc","cos","PI","rys","sin","circle","r","area","adjustMethod","imageOffset","len","shape","image","coordsArray","MODAL","OVERLAY","MODALCLASS","MODALSELECTOR","Modal","current","prevState","focusableElems","focusInputs","blurElems","first","stealFocus","mousedown","modal","escape","keyCode","stealfocus","expr","focusable","map","mapName","isTabIndexNotNaN","parentNode","href","visibleModals","detach","overlay","modal_zindex","oEvent","last","^show.modal.(on|blur)$"],"mappings":"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","file":"jquery.qtip.min.js","sourcesContent":["/*\r\n * qTip2 - Pretty powerful tooltips - v2.2.1\r\n * http://qtip2.com\r\n *\r\n * Copyright (c) 2014 \r\n * Released under the MIT licenses\r\n * http://jquery.org/license\r\n *\r\n * Date: Sun Sep 7 2014 03:53 EDT-0400\r\n * Plugins: tips viewport imagemap modal\r\n * Styles: core basic css3\r\n */\r\n/*global window: false, jQuery: false, console: false, define: false */\r\n\r\n/* Cache window, document, undefined */\r\n(function( window, document, undefined ) {\r\n\r\n// Uses AMD or browser globals to create a jQuery plugin.\r\n(function( factory ) {\r\n\t\"use strict\";\r\n\tif(typeof define === 'function' && define.amd) {\r\n\t\tdefine(['jquery'], factory);\r\n\t}\r\n\telse if(jQuery && !jQuery.fn.qtip) {\r\n\t\tfactory(jQuery);\r\n\t}\r\n}\r\n(function($) {\r\n\t\"use strict\"; // Enable ECMAScript \"strict\" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/\r\n;// Munge the primitives - Paul Irish tip\r\nvar TRUE = true,\r\nFALSE = false,\r\nNULL = null,\r\n\r\n// Common variables\r\nX = 'x', Y = 'y',\r\nWIDTH = 'width',\r\nHEIGHT = 'height',\r\n\r\n// Positioning sides\r\nTOP = 'top',\r\nLEFT = 'left',\r\nBOTTOM = 'bottom',\r\nRIGHT = 'right',\r\nCENTER = 'center',\r\n\r\n// Position adjustment types\r\nFLIP = 'flip',\r\nFLIPINVERT = 'flipinvert',\r\nSHIFT = 'shift',\r\n\r\n// Shortcut vars\r\nQTIP, PROTOTYPE, CORNER, CHECKS,\r\nPLUGINS = {},\r\nNAMESPACE = 'qtip',\r\nATTR_HAS = 'data-hasqtip',\r\nATTR_ID = 'data-qtip-id',\r\nWIDGET = ['ui-widget', 'ui-tooltip'],\r\nSELECTOR = '.'+NAMESPACE,\r\nINACTIVE_EVENTS = 'click dblclick mousedown mouseup mousemove mouseleave mouseenter'.split(' '),\r\n\r\nCLASS_FIXED = NAMESPACE+'-fixed',\r\nCLASS_DEFAULT = NAMESPACE + '-default',\r\nCLASS_FOCUS = NAMESPACE + '-focus',\r\nCLASS_HOVER = NAMESPACE + '-hover',\r\nCLASS_DISABLED = NAMESPACE+'-disabled',\r\n\r\nreplaceSuffix = '_replacedByqTip',\r\noldtitle = 'oldtitle',\r\ntrackingBound,\r\n\r\n// Browser detection\r\nBROWSER = {\r\n\t/*\r\n\t * IE version detection\r\n\t *\r\n\t * Adapted from: http://ajaxian.com/archives/attack-of-the-ie-conditional-comment\r\n\t * Credit to James Padolsey for the original implemntation!\r\n\t */\r\n\tie: (function(){\r\n\t\tfor (\r\n\t\t\tvar v = 4, i = document.createElement(\"div\");\r\n\t\t\t(i.innerHTML = \"<!--[if gt IE \" + v + \"]><i></i><![endif]-->\") && i.getElementsByTagName(\"i\")[0];\r\n\t\t\tv+=1\r\n\t\t) {}\r\n\t\treturn v > 4 ? v : NaN;\r\n\t}()),\r\n\r\n\t/*\r\n\t * iOS version detection\r\n\t */\r\n\tiOS: parseFloat(\r\n\t\t('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1])\r\n\t\t.replace('undefined', '3_2').replace('_', '.').replace('_', '')\r\n\t) || FALSE\r\n};\r\n;function QTip(target, options, id, attr) {\r\n\t// Elements and ID\r\n\tthis.id = id;\r\n\tthis.target = target;\r\n\tthis.tooltip = NULL;\r\n\tthis.elements = { target: target };\r\n\r\n\t// Internal constructs\r\n\tthis._id = NAMESPACE + '-' + id;\r\n\tthis.timers = { img: {} };\r\n\tthis.options = options;\r\n\tthis.plugins = {};\r\n\r\n\t// Cache object\r\n\tthis.cache = {\r\n\t\tevent: {},\r\n\t\ttarget: $(),\r\n\t\tdisabled: FALSE,\r\n\t\tattr: attr,\r\n\t\tonTooltip: FALSE,\r\n\t\tlastClass: ''\r\n\t};\r\n\r\n\t// Set the initial flags\r\n\tthis.rendered = this.destroyed = this.disabled = this.waiting =\r\n\t\tthis.hiddenDuringWait = this.positioning = this.triggering = FALSE;\r\n}\r\nPROTOTYPE = QTip.prototype;\r\n\r\nPROTOTYPE._when = function(deferreds) {\r\n\treturn $.when.apply($, deferreds);\r\n};\r\n\r\nPROTOTYPE.render = function(show) {\r\n\tif(this.rendered || this.destroyed) { return this; } // If tooltip has already been rendered, exit\r\n\r\n\tvar self = this,\r\n\t\toptions = this.options,\r\n\t\tcache = this.cache,\r\n\t\telements = this.elements,\r\n\t\ttext = options.content.text,\r\n\t\ttitle = options.content.title,\r\n\t\tbutton = options.content.button,\r\n\t\tposOptions = options.position,\r\n\t\tnamespace = '.'+this._id+' ',\r\n\t\tdeferreds = [],\r\n\t\ttooltip;\r\n\r\n\t// Add ARIA attributes to target\r\n\t$.attr(this.target[0], 'aria-describedby', this._id);\r\n\r\n\t// Create public position object that tracks current position corners\r\n\tcache.posClass = this._createPosClass(\r\n\t\t(this.position = { my: posOptions.my, at: posOptions.at }).my\r\n\t);\r\n\r\n\t// Create tooltip element\r\n\tthis.tooltip = elements.tooltip = tooltip = $('<div/>', {\r\n\t\t'id': this._id,\r\n\t\t'class': [ NAMESPACE, CLASS_DEFAULT, options.style.classes, cache.posClass ].join(' '),\r\n\t\t'width': options.style.width || '',\r\n\t\t'height': options.style.height || '',\r\n\t\t'tracking': posOptions.target === 'mouse' && posOptions.adjust.mouse,\r\n\r\n\t\t/* ARIA specific attributes */\r\n\t\t'role': 'alert',\r\n\t\t'aria-live': 'polite',\r\n\t\t'aria-atomic': FALSE,\r\n\t\t'aria-describedby': this._id + '-content',\r\n\t\t'aria-hidden': TRUE\r\n\t})\r\n\t.toggleClass(CLASS_DISABLED, this.disabled)\r\n\t.attr(ATTR_ID, this.id)\r\n\t.data(NAMESPACE, this)\r\n\t.appendTo(posOptions.container)\r\n\t.append(\r\n\t\t// Create content element\r\n\t\telements.content = $('<div />', {\r\n\t\t\t'class': NAMESPACE + '-content',\r\n\t\t\t'id': this._id + '-content',\r\n\t\t\t'aria-atomic': TRUE\r\n\t\t})\r\n\t);\r\n\r\n\t// Set rendered flag and prevent redundant reposition calls for now\r\n\tthis.rendered = -1;\r\n\tthis.positioning = TRUE;\r\n\r\n\t// Create title...\r\n\tif(title) {\r\n\t\tthis._createTitle();\r\n\r\n\t\t// Update title only if its not a callback (called in toggle if so)\r\n\t\tif(!$.isFunction(title)) {\r\n\t\t\tdeferreds.push( this._updateTitle(title, FALSE) );\r\n\t\t}\r\n\t}\r\n\r\n\t// Create button\r\n\tif(button) { this._createButton(); }\r\n\r\n\t// Set proper rendered flag and update content if not a callback function (called in toggle)\r\n\tif(!$.isFunction(text)) {\r\n\t\tdeferreds.push( this._updateContent(text, FALSE) );\r\n\t}\r\n\tthis.rendered = TRUE;\r\n\r\n\t// Setup widget classes\r\n\tthis._setWidget();\r\n\r\n\t// Initialize 'render' plugins\r\n\t$.each(PLUGINS, function(name) {\r\n\t\tvar instance;\r\n\t\tif(this.initialize === 'render' && (instance = this(self))) {\r\n\t\t\tself.plugins[name] = instance;\r\n\t\t}\r\n\t});\r\n\r\n\t// Unassign initial events and assign proper events\r\n\tthis._unassignEvents();\r\n\tthis._assignEvents();\r\n\r\n\t// When deferreds have completed\r\n\tthis._when(deferreds).then(function() {\r\n\t\t// tooltiprender event\r\n\t\tself._trigger('render');\r\n\r\n\t\t// Reset flags\r\n\t\tself.positioning = FALSE;\r\n\r\n\t\t// Show tooltip if not hidden during wait period\r\n\t\tif(!self.hiddenDuringWait && (options.show.ready || show)) {\r\n\t\t\tself.toggle(TRUE, cache.event, FALSE);\r\n\t\t}\r\n\t\tself.hiddenDuringWait = FALSE;\r\n\t});\r\n\r\n\t// Expose API\r\n\tQTIP.api[this.id] = this;\r\n\r\n\treturn this;\r\n};\r\n\r\nPROTOTYPE.destroy = function(immediate) {\r\n\t// Set flag the signify destroy is taking place to plugins\r\n\t// and ensure it only gets destroyed once!\r\n\tif(this.destroyed) { return this.target; }\r\n\r\n\tfunction process() {\r\n\t\tif(this.destroyed) { return; }\r\n\t\tthis.destroyed = TRUE;\r\n\r\n\t\tvar target = this.target,\r\n\t\t\ttitle = target.attr(oldtitle),\r\n\t\t\ttimer;\r\n\r\n\t\t// Destroy tooltip if rendered\r\n\t\tif(this.rendered) {\r\n\t\t\tthis.tooltip.stop(1,0).find('*').remove().end().remove();\r\n\t\t}\r\n\r\n\t\t// Destroy all plugins\r\n\t\t$.each(this.plugins, function(name) {\r\n\t\t\tthis.destroy && this.destroy();\r\n\t\t});\r\n\r\n\t\t// Clear timers\r\n\t\tfor(timer in this.timers) {\r\n\t\t\tclearTimeout(this.timers[timer]);\r\n\t\t}\r\n\r\n\t\t// Remove api object and ARIA attributes\r\n\t\ttarget.removeData(NAMESPACE)\r\n\t\t\t.removeAttr(ATTR_ID)\r\n\t\t\t.removeAttr(ATTR_HAS)\r\n\t\t\t.removeAttr('aria-describedby');\r\n\r\n\t\t// Reset old title attribute if removed\r\n\t\tif(this.options.suppress && title) {\r\n\t\t\ttarget.attr('title', title).removeAttr(oldtitle);\r\n\t\t}\r\n\r\n\t\t// Remove qTip events associated with this API\r\n\t\tthis._unassignEvents();\r\n\r\n\t\t// Remove ID from used id objects, and delete object references\r\n\t\t// for better garbage collection and leak protection\r\n\t\tthis.options = this.elements = this.cache = this.timers =\r\n\t\t\tthis.plugins = this.mouse = NULL;\r\n\r\n\t\t// Delete epoxsed API object\r\n\t\tdelete QTIP.api[this.id];\r\n\t}\r\n\r\n\t// If an immediate destory is needed\r\n\tif((immediate !== TRUE || this.triggering === 'hide') && this.rendered) {\r\n\t\tthis.tooltip.one('tooltiphidden', $.proxy(process, this));\r\n\t\t!this.triggering && this.hide();\r\n\t}\r\n\r\n\t// If we're not in the process of hiding... process\r\n\telse { process.call(this); }\r\n\r\n\treturn this.target;\r\n};\r\n;function invalidOpt(a) {\r\n\treturn a === NULL || $.type(a) !== 'object';\r\n}\r\n\r\nfunction invalidContent(c) {\r\n\treturn !( $.isFunction(c) || (c && c.attr) || c.length || ($.type(c) === 'object' && (c.jquery || c.then) ));\r\n}\r\n\r\n// Option object sanitizer\r\nfunction sanitizeOptions(opts) {\r\n\tvar content, text, ajax, once;\r\n\r\n\tif(invalidOpt(opts)) { return FALSE; }\r\n\r\n\tif(invalidOpt(opts.metadata)) {\r\n\t\topts.metadata = { type: opts.metadata };\r\n\t}\r\n\r\n\tif('content' in opts) {\r\n\t\tcontent = opts.content;\r\n\r\n\t\tif(invalidOpt(content) || content.jquery || content.done) {\r\n\t\t\tcontent = opts.content = {\r\n\t\t\t\ttext: (text = invalidContent(content) ? FALSE : content)\r\n\t\t\t};\r\n\t\t}\r\n\t\telse { text = content.text; }\r\n\r\n\t\t// DEPRECATED - Old content.ajax plugin functionality\r\n\t\t// Converts it into the proper Deferred syntax\r\n\t\tif('ajax' in content) {\r\n\t\t\tajax = content.ajax;\r\n\t\t\tonce = ajax && ajax.once !== FALSE;\r\n\t\t\tdelete content.ajax;\r\n\r\n\t\t\tcontent.text = function(event, api) {\r\n\t\t\t\tvar loading = text || $(this).attr(api.options.content.attr) || 'Loading...',\r\n\r\n\t\t\t\tdeferred = $.ajax(\r\n\t\t\t\t\t$.extend({}, ajax, { context: api })\r\n\t\t\t\t)\r\n\t\t\t\t.then(ajax.success, NULL, ajax.error)\r\n\t\t\t\t.then(function(content) {\r\n\t\t\t\t\tif(content && once) { api.set('content.text', content); }\r\n\t\t\t\t\treturn content;\r\n\t\t\t\t},\r\n\t\t\t\tfunction(xhr, status, error) {\r\n\t\t\t\t\tif(api.destroyed || xhr.status === 0) { return; }\r\n\t\t\t\t\tapi.set('content.text', status + ': ' + error);\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn !once ? (api.set('content.text', loading), deferred) : loading;\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif('title' in content) {\r\n\t\t\tif($.isPlainObject(content.title)) {\r\n\t\t\t\tcontent.button = content.title.button;\r\n\t\t\t\tcontent.title = content.title.text;\r\n\t\t\t}\r\n\r\n\t\t\tif(invalidContent(content.title || FALSE)) {\r\n\t\t\t\tcontent.title = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif('position' in opts && invalidOpt(opts.position)) {\r\n\t\topts.position = { my: opts.position, at: opts.position };\r\n\t}\r\n\r\n\tif('show' in opts && invalidOpt(opts.show)) {\r\n\t\topts.show = opts.show.jquery ? { target: opts.show } :\r\n\t\t\topts.show === TRUE ? { ready: TRUE } : { event: opts.show };\r\n\t}\r\n\r\n\tif('hide' in opts && invalidOpt(opts.hide)) {\r\n\t\topts.hide = opts.hide.jquery ? { target: opts.hide } : { event: opts.hide };\r\n\t}\r\n\r\n\tif('style' in opts && invalidOpt(opts.style)) {\r\n\t\topts.style = { classes: opts.style };\r\n\t}\r\n\r\n\t// Sanitize plugin options\r\n\t$.each(PLUGINS, function() {\r\n\t\tthis.sanitize && this.sanitize(opts);\r\n\t});\r\n\r\n\treturn opts;\r\n}\r\n\r\n// Setup builtin .set() option checks\r\nCHECKS = PROTOTYPE.checks = {\r\n\tbuiltin: {\r\n\t\t// Core checks\r\n\t\t'^id$': function(obj, o, v, prev) {\r\n\t\t\tvar id = v === TRUE ? QTIP.nextid : v,\r\n\t\t\t\tnew_id = NAMESPACE + '-' + id;\r\n\r\n\t\t\tif(id !== FALSE && id.length > 0 && !$('#'+new_id).length) {\r\n\t\t\t\tthis._id = new_id;\r\n\r\n\t\t\t\tif(this.rendered) {\r\n\t\t\t\t\tthis.tooltip[0].id = this._id;\r\n\t\t\t\t\tthis.elements.content[0].id = this._id + '-content';\r\n\t\t\t\t\tthis.elements.title[0].id = this._id + '-title';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse { obj[o] = prev; }\r\n\t\t},\r\n\t\t'^prerender': function(obj, o, v) {\r\n\t\t\tv && !this.rendered && this.render(this.options.show.ready);\r\n\t\t},\r\n\r\n\t\t// Content checks\r\n\t\t'^content.text$': function(obj, o, v) {\r\n\t\t\tthis._updateContent(v);\r\n\t\t},\r\n\t\t'^content.attr$': function(obj, o, v, prev) {\r\n\t\t\tif(this.options.content.text === this.target.attr(prev)) {\r\n\t\t\t\tthis._updateContent( this.target.attr(v) );\r\n\t\t\t}\r\n\t\t},\r\n\t\t'^content.title$': function(obj, o, v) {\r\n\t\t\t// Remove title if content is null\r\n\t\t\tif(!v) { return this._removeTitle(); }\r\n\r\n\t\t\t// If title isn't already created, create it now and update\r\n\t\t\tv && !this.elements.title && this._createTitle();\r\n\t\t\tthis._updateTitle(v);\r\n\t\t},\r\n\t\t'^content.button$': function(obj, o, v) {\r\n\t\t\tthis._updateButton(v);\r\n\t\t},\r\n\t\t'^content.title.(text|button)$': function(obj, o, v) {\r\n\t\t\tthis.set('content.'+o, v); // Backwards title.text/button compat\r\n\t\t},\r\n\r\n\t\t// Position checks\r\n\t\t'^position.(my|at)$': function(obj, o, v){\r\n\t\t\t'string' === typeof v && (this.position[o] = obj[o] = new CORNER(v, o === 'at'));\r\n\t\t},\r\n\t\t'^position.container$': function(obj, o, v){\r\n\t\t\tthis.rendered && this.tooltip.appendTo(v);\r\n\t\t},\r\n\r\n\t\t// Show checks\r\n\t\t'^show.ready$': function(obj, o, v) {\r\n\t\t\tv && (!this.rendered && this.render(TRUE) || this.toggle(TRUE));\r\n\t\t},\r\n\r\n\t\t// Style checks\r\n\t\t'^style.classes$': function(obj, o, v, p) {\r\n\t\t\tthis.rendered && this.tooltip.removeClass(p).addClass(v);\r\n\t\t},\r\n\t\t'^style.(width|height)': function(obj, o, v) {\r\n\t\t\tthis.rendered && this.tooltip.css(o, v);\r\n\t\t},\r\n\t\t'^style.widget|content.title': function() {\r\n\t\t\tthis.rendered && this._setWidget();\r\n\t\t},\r\n\t\t'^style.def': function(obj, o, v) {\r\n\t\t\tthis.rendered && this.tooltip.toggleClass(CLASS_DEFAULT, !!v);\r\n\t\t},\r\n\r\n\t\t// Events check\r\n\t\t'^events.(render|show|move|hide|focus|blur)$': function(obj, o, v) {\r\n\t\t\tthis.rendered && this.tooltip[($.isFunction(v) ? '' : 'un') + 'bind']('tooltip'+o, v);\r\n\t\t},\r\n\r\n\t\t// Properties which require event reassignment\r\n\t\t'^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)': function() {\r\n\t\t\tif(!this.rendered) { return; }\r\n\r\n\t\t\t// Set tracking flag\r\n\t\t\tvar posOptions = this.options.position;\r\n\t\t\tthis.tooltip.attr('tracking', posOptions.target === 'mouse' && posOptions.adjust.mouse);\r\n\r\n\t\t\t// Reassign events\r\n\t\t\tthis._unassignEvents();\r\n\t\t\tthis._assignEvents();\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// Dot notation converter\r\nfunction convertNotation(options, notation) {\r\n\tvar i = 0, obj, option = options,\r\n\r\n\t// Split notation into array\r\n\tlevels = notation.split('.');\r\n\r\n\t// Loop through\r\n\twhile( option = option[ levels[i++] ] ) {\r\n\t\tif(i < levels.length) { obj = option; }\r\n\t}\r\n\r\n\treturn [obj || options, levels.pop()];\r\n}\r\n\r\nPROTOTYPE.get = function(notation) {\r\n\tif(this.destroyed) { return this; }\r\n\r\n\tvar o = convertNotation(this.options, notation.toLowerCase()),\r\n\t\tresult = o[0][ o[1] ];\r\n\r\n\treturn result.precedance ? result.string() : result;\r\n};\r\n\r\nfunction setCallback(notation, args) {\r\n\tvar category, rule, match;\r\n\r\n\tfor(category in this.checks) {\r\n\t\tfor(rule in this.checks[category]) {\r\n\t\t\tif(match = (new RegExp(rule, 'i')).exec(notation)) {\r\n\t\t\t\targs.push(match);\r\n\r\n\t\t\t\tif(category === 'builtin' || this.plugins[category]) {\r\n\t\t\t\t\tthis.checks[category][rule].apply(\r\n\t\t\t\t\t\tthis.plugins[category] || this, args\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvar rmove = /^position\\.(my|at|adjust|target|container|viewport)|style|content|show\\.ready/i,\r\n\trrender = /^prerender|show\\.ready/i;\r\n\r\nPROTOTYPE.set = function(option, value) {\r\n\tif(this.destroyed) { return this; }\r\n\r\n\tvar rendered = this.rendered,\r\n\t\treposition = FALSE,\r\n\t\toptions = this.options,\r\n\t\tchecks = this.checks,\r\n\t\tname;\r\n\r\n\t// Convert singular option/value pair into object form\r\n\tif('string' === typeof option) {\r\n\t\tname = option; option = {}; option[name] = value;\r\n\t}\r\n\telse { option = $.extend({}, option); }\r\n\r\n\t// Set all of the defined options to their new values\r\n\t$.each(option, function(notation, value) {\r\n\t\tif(rendered && rrender.test(notation)) {\r\n\t\t\tdelete option[notation]; return;\r\n\t\t}\r\n\r\n\t\t// Set new obj value\r\n\t\tvar obj = convertNotation(options, notation.toLowerCase()), previous;\r\n\t\tprevious = obj[0][ obj[1] ];\r\n\t\tobj[0][ obj[1] ] = value && value.nodeType ? $(value) : value;\r\n\r\n\t\t// Also check if we need to reposition\r\n\t\treposition = rmove.test(notation) || reposition;\r\n\r\n\t\t// Set the new params for the callback\r\n\t\toption[notation] = [obj[0], obj[1], value, previous];\r\n\t});\r\n\r\n\t// Re-sanitize options\r\n\tsanitizeOptions(options);\r\n\r\n\t/*\r\n\t * Execute any valid callbacks for the set options\r\n\t * Also set positioning flag so we don't get loads of redundant repositioning calls.\r\n\t */\r\n\tthis.positioning = TRUE;\r\n\t$.each(option, $.proxy(setCallback, this));\r\n\tthis.positioning = FALSE;\r\n\r\n\t// Update position if needed\r\n\tif(this.rendered && this.tooltip[0].offsetWidth > 0 && reposition) {\r\n\t\tthis.reposition( options.position.target === 'mouse' ? NULL : this.cache.event );\r\n\t}\r\n\r\n\treturn this;\r\n};\r\n;PROTOTYPE._update = function(content, element, reposition) {\r\n\tvar self = this,\r\n\t\tcache = this.cache;\r\n\r\n\t// Make sure tooltip is rendered and content is defined. If not return\r\n\tif(!this.rendered || !content) { return FALSE; }\r\n\r\n\t// Use function to parse content\r\n\tif($.isFunction(content)) {\r\n\t\tcontent = content.call(this.elements.target, cache.event, this) || '';\r\n\t}\r\n\r\n\t// Handle deferred content\r\n\tif($.isFunction(content.then)) {\r\n\t\tcache.waiting = TRUE;\r\n\t\treturn content.then(function(c) {\r\n\t\t\tcache.waiting = FALSE;\r\n\t\t\treturn self._update(c, element);\r\n\t\t}, NULL, function(e) {\r\n\t\t\treturn self._update(e, element);\r\n\t\t});\r\n\t}\r\n\r\n\t// If content is null... return false\r\n\tif(content === FALSE || (!content && content !== '')) { return FALSE; }\r\n\r\n\t// Append new content if its a DOM array and show it if hidden\r\n\tif(content.jquery && content.length > 0) {\r\n\t\telement.empty().append(\r\n\t\t\tcontent.css({ display: 'block', visibility: 'visible' })\r\n\t\t);\r\n\t}\r\n\r\n\t// Content is a regular string, insert the new content\r\n\telse { element.html(content); }\r\n\r\n\t// Wait for content to be loaded, and reposition\r\n\treturn this._waitForContent(element).then(function(images) {\r\n\t\tif(self.rendered && self.tooltip[0].offsetWidth > 0) {\r\n\t\t\tself.reposition(cache.event, !images.length);\r\n\t\t}\r\n\t});\r\n};\r\n\r\nPROTOTYPE._waitForContent = function(element) {\r\n\tvar cache = this.cache;\r\n\r\n\t// Set flag\r\n\tcache.waiting = TRUE;\r\n\r\n\t// If imagesLoaded is included, ensure images have loaded and return promise\r\n\treturn ( $.fn.imagesLoaded ? element.imagesLoaded() : $.Deferred().resolve([]) )\r\n\t\t.done(function() { cache.waiting = FALSE; })\r\n\t\t.promise();\r\n};\r\n\r\nPROTOTYPE._updateContent = function(content, reposition) {\r\n\tthis._update(content, this.elements.content, reposition);\r\n};\r\n\r\nPROTOTYPE._updateTitle = function(content, reposition) {\r\n\tif(this._update(content, this.elements.title, reposition) === FALSE) {\r\n\t\tthis._removeTitle(FALSE);\r\n\t}\r\n};\r\n\r\nPROTOTYPE._createTitle = function()\r\n{\r\n\tvar elements = this.elements,\r\n\t\tid = this._id+'-title';\r\n\r\n\t// Destroy previous title element, if present\r\n\tif(elements.titlebar) { this._removeTitle(); }\r\n\r\n\t// Create title bar and title elements\r\n\telements.titlebar = $('<div />', {\r\n\t\t'class': NAMESPACE + '-titlebar ' + (this.options.style.widget ? createWidgetClass('header') : '')\r\n\t})\r\n\t.append(\r\n\t\telements.title = $('<div />', {\r\n\t\t\t'id': id,\r\n\t\t\t'class': NAMESPACE + '-title',\r\n\t\t\t'aria-atomic': TRUE\r\n\t\t})\r\n\t)\r\n\t.insertBefore(elements.content)\r\n\r\n\t// Button-specific events\r\n\t.delegate('.qtip-close', 'mousedown keydown mouseup keyup mouseout', function(event) {\r\n\t\t$(this).toggleClass('ui-state-active ui-state-focus', event.type.substr(-4) === 'down');\r\n\t})\r\n\t.delegate('.qtip-close', 'mouseover mouseout', function(event){\r\n\t\t$(this).toggleClass('ui-state-hover', event.type === 'mouseover');\r\n\t});\r\n\r\n\t// Create button if enabled\r\n\tif(this.options.content.button) { this._createButton(); }\r\n};\r\n\r\nPROTOTYPE._removeTitle = function(reposition)\r\n{\r\n\tvar elements = this.elements;\r\n\r\n\tif(elements.title) {\r\n\t\telements.titlebar.remove();\r\n\t\telements.titlebar = elements.title = elements.button = NULL;\r\n\r\n\t\t// Reposition if enabled\r\n\t\tif(reposition !== FALSE) { this.reposition(); }\r\n\t}\r\n};\r\n;PROTOTYPE._createPosClass = function(my) {\r\n\treturn NAMESPACE + '-pos-' + (my || this.options.position.my).abbrev();\r\n};\r\n\r\nPROTOTYPE.reposition = function(event, effect) {\r\n\tif(!this.rendered || this.positioning || this.destroyed) { return this; }\r\n\r\n\t// Set positioning flag\r\n\tthis.positioning = TRUE;\r\n\r\n\tvar cache = this.cache,\r\n\t\ttooltip = this.tooltip,\r\n\t\tposOptions = this.options.position,\r\n\t\ttarget = posOptions.target,\r\n\t\tmy = posOptions.my,\r\n\t\tat = posOptions.at,\r\n\t\tviewport = posOptions.viewport,\r\n\t\tcontainer = posOptions.container,\r\n\t\tadjust = posOptions.adjust,\r\n\t\tmethod = adjust.method.split(' '),\r\n\t\ttooltipWidth = tooltip.outerWidth(FALSE),\r\n\t\ttooltipHeight = tooltip.outerHeight(FALSE),\r\n\t\ttargetWidth = 0,\r\n\t\ttargetHeight = 0,\r\n\t\ttype = tooltip.css('position'),\r\n\t\tposition = { left: 0, top: 0 },\r\n\t\tvisible = tooltip[0].offsetWidth > 0,\r\n\t\tisScroll = event && event.type === 'scroll',\r\n\t\twin = $(window),\r\n\t\tdoc = container[0].ownerDocument,\r\n\t\tmouse = this.mouse,\r\n\t\tpluginCalculations, offset, adjusted, newClass;\r\n\r\n\t// Check if absolute position was passed\r\n\tif($.isArray(target) && target.length === 2) {\r\n\t\t// Force left top and set position\r\n\t\tat = { x: LEFT, y: TOP };\r\n\t\tposition = { left: target[0], top: target[1] };\r\n\t}\r\n\r\n\t// Check if mouse was the target\r\n\telse if(target === 'mouse') {\r\n\t\t// Force left top to allow flipping\r\n\t\tat = { x: LEFT, y: TOP };\r\n\r\n\t\t// Use the mouse origin that caused the show event, if distance hiding is enabled\r\n\t\tif((!adjust.mouse || this.options.hide.distance) && cache.origin && cache.origin.pageX) {\r\n\t\t\tevent =  cache.origin;\r\n\t\t}\r\n\r\n\t\t// Use cached event for resize/scroll events\r\n\t\telse if(!event || (event && (event.type === 'resize' || event.type === 'scroll'))) {\r\n\t\t\tevent = cache.event;\r\n\t\t}\r\n\r\n\t\t// Otherwise, use the cached mouse coordinates if available\r\n\t\telse if(mouse && mouse.pageX) {\r\n\t\t\tevent = mouse;\r\n\t\t}\r\n\r\n\t\t// Calculate body and container offset and take them into account below\r\n\t\tif(type !== 'static') { position = container.offset(); }\r\n\t\tif(doc.body.offsetWidth !== (window.innerWidth || doc.documentElement.clientWidth)) {\r\n\t\t\toffset = $(document.body).offset();\r\n\t\t}\r\n\r\n\t\t// Use event coordinates for position\r\n\t\tposition = {\r\n\t\t\tleft: event.pageX - position.left + (offset && offset.left || 0),\r\n\t\t\ttop: event.pageY - position.top + (offset && offset.top || 0)\r\n\t\t};\r\n\r\n\t\t// Scroll events are a pain, some browsers\r\n\t\tif(adjust.mouse && isScroll && mouse) {\r\n\t\t\tposition.left -= (mouse.scrollX || 0) - win.scrollLeft();\r\n\t\t\tposition.top -= (mouse.scrollY || 0) - win.scrollTop();\r\n\t\t}\r\n\t}\r\n\r\n\t// Target wasn't mouse or absolute...\r\n\telse {\r\n\t\t// Check if event targetting is being used\r\n\t\tif(target === 'event') {\r\n\t\t\tif(event && event.target && event.type !== 'scroll' && event.type !== 'resize') {\r\n\t\t\t\tcache.target = $(event.target);\r\n\t\t\t}\r\n\t\t\telse if(!event.target) {\r\n\t\t\t\tcache.target = this.elements.target;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(target !== 'event'){\r\n\t\t\tcache.target = $(target.jquery ? target : this.elements.target);\r\n\t\t}\r\n\t\ttarget = cache.target;\r\n\r\n\t\t// Parse the target into a jQuery object and make sure there's an element present\r\n\t\ttarget = $(target).eq(0);\r\n\t\tif(target.length === 0) { return this; }\r\n\r\n\t\t// Check if window or document is the target\r\n\t\telse if(target[0] === document || target[0] === window) {\r\n\t\t\ttargetWidth = BROWSER.iOS ? window.innerWidth : target.width();\r\n\t\t\ttargetHeight = BROWSER.iOS ? window.innerHeight : target.height();\r\n\r\n\t\t\tif(target[0] === window) {\r\n\t\t\t\tposition = {\r\n\t\t\t\t\ttop: (viewport || target).scrollTop(),\r\n\t\t\t\t\tleft: (viewport || target).scrollLeft()\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Check if the target is an <AREA> element\r\n\t\telse if(PLUGINS.imagemap && target.is('area')) {\r\n\t\t\tpluginCalculations = PLUGINS.imagemap(this, target, at, PLUGINS.viewport ? method : FALSE);\r\n\t\t}\r\n\r\n\t\t// Check if the target is an SVG element\r\n\t\telse if(PLUGINS.svg && target && target[0].ownerSVGElement) {\r\n\t\t\tpluginCalculations = PLUGINS.svg(this, target, at, PLUGINS.viewport ? method : FALSE);\r\n\t\t}\r\n\r\n\t\t// Otherwise use regular jQuery methods\r\n\t\telse {\r\n\t\t\ttargetWidth = target.outerWidth(FALSE);\r\n\t\t\ttargetHeight = target.outerHeight(FALSE);\r\n\t\t\tposition = target.offset();\r\n\t\t}\r\n\r\n\t\t// Parse returned plugin values into proper variables\r\n\t\tif(pluginCalculations) {\r\n\t\t\ttargetWidth = pluginCalculations.width;\r\n\t\t\ttargetHeight = pluginCalculations.height;\r\n\t\t\toffset = pluginCalculations.offset;\r\n\t\t\tposition = pluginCalculations.position;\r\n\t\t}\r\n\r\n\t\t// Adjust position to take into account offset parents\r\n\t\tposition = this.reposition.offset(target, position, container);\r\n\r\n\t\t// Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2-4.0 & v4.3-4.3.2)\r\n\t\tif((BROWSER.iOS > 3.1 && BROWSER.iOS < 4.1) ||\r\n\t\t\t(BROWSER.iOS >= 4.3 && BROWSER.iOS < 4.33) ||\r\n\t\t\t(!BROWSER.iOS && type === 'fixed')\r\n\t\t){\r\n\t\t\tposition.left -= win.scrollLeft();\r\n\t\t\tposition.top -= win.scrollTop();\r\n\t\t}\r\n\r\n\t\t// Adjust position relative to target\r\n\t\tif(!pluginCalculations || (pluginCalculations && pluginCalculations.adjustable !== FALSE)) {\r\n\t\t\tposition.left += at.x === RIGHT ? targetWidth : at.x === CENTER ? targetWidth / 2 : 0;\r\n\t\t\tposition.top += at.y === BOTTOM ? targetHeight : at.y === CENTER ? targetHeight / 2 : 0;\r\n\t\t}\r\n\t}\r\n\r\n\t// Adjust position relative to tooltip\r\n\tposition.left += adjust.x + (my.x === RIGHT ? -tooltipWidth : my.x === CENTER ? -tooltipWidth / 2 : 0);\r\n\tposition.top += adjust.y + (my.y === BOTTOM ? -tooltipHeight : my.y === CENTER ? -tooltipHeight / 2 : 0);\r\n\r\n\t// Use viewport adjustment plugin if enabled\r\n\tif(PLUGINS.viewport) {\r\n\t\tadjusted = position.adjusted = PLUGINS.viewport(\r\n\t\t\tthis, position, posOptions, targetWidth, targetHeight, tooltipWidth, tooltipHeight\r\n\t\t);\r\n\r\n\t\t// Apply offsets supplied by positioning plugin (if used)\r\n\t\tif(offset && adjusted.left) { position.left += offset.left; }\r\n\t\tif(offset && adjusted.top) {  position.top += offset.top; }\r\n\r\n\t\t// Apply any new 'my' position\r\n\t\tif(adjusted.my) { this.position.my = adjusted.my; }\r\n\t}\r\n\r\n\t// Viewport adjustment is disabled, set values to zero\r\n\telse { position.adjusted = { left: 0, top: 0 }; }\r\n\r\n\t// Set tooltip position class if it's changed\r\n\tif(cache.posClass !== (newClass = this._createPosClass(this.position.my))) {\r\n\t\ttooltip.removeClass(cache.posClass).addClass( (cache.posClass = newClass) );\r\n\t}\r\n\r\n\t// tooltipmove event\r\n\tif(!this._trigger('move', [position, viewport.elem || viewport], event)) { return this; }\r\n\tdelete position.adjusted;\r\n\r\n\t// If effect is disabled, target it mouse, no animation is defined or positioning gives NaN out, set CSS directly\r\n\tif(effect === FALSE || !visible || isNaN(position.left) || isNaN(position.top) || target === 'mouse' || !$.isFunction(posOptions.effect)) {\r\n\t\ttooltip.css(position);\r\n\t}\r\n\r\n\t// Use custom function if provided\r\n\telse if($.isFunction(posOptions.effect)) {\r\n\t\tposOptions.effect.call(tooltip, this, $.extend({}, position));\r\n\t\ttooltip.queue(function(next) {\r\n\t\t\t// Reset attributes to avoid cross-browser rendering bugs\r\n\t\t\t$(this).css({ opacity: '', height: '' });\r\n\t\t\tif(BROWSER.ie) { this.style.removeAttribute('filter'); }\r\n\r\n\t\t\tnext();\r\n\t\t});\r\n\t}\r\n\r\n\t// Set positioning flag\r\n\tthis.positioning = FALSE;\r\n\r\n\treturn this;\r\n};\r\n\r\n// Custom (more correct for qTip!) offset calculator\r\nPROTOTYPE.reposition.offset = function(elem, pos, container) {\r\n\tif(!container[0]) { return pos; }\r\n\r\n\tvar ownerDocument = $(elem[0].ownerDocument),\r\n\t\tquirks = !!BROWSER.ie && document.compatMode !== 'CSS1Compat',\r\n\t\tparent = container[0],\r\n\t\tscrolled, position, parentOffset, overflow;\r\n\r\n\tfunction scroll(e, i) {\r\n\t\tpos.left += i * e.scrollLeft();\r\n\t\tpos.top += i * e.scrollTop();\r\n\t}\r\n\r\n\t// Compensate for non-static containers offset\r\n\tdo {\r\n\t\tif((position = $.css(parent, 'position')) !== 'static') {\r\n\t\t\tif(position === 'fixed') {\r\n\t\t\t\tparentOffset = parent.getBoundingClientRect();\r\n\t\t\t\tscroll(ownerDocument, -1);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tparentOffset = $(parent).position();\r\n\t\t\t\tparentOffset.left += (parseFloat($.css(parent, 'borderLeftWidth')) || 0);\r\n\t\t\t\tparentOffset.top += (parseFloat($.css(parent, 'borderTopWidth')) || 0);\r\n\t\t\t}\r\n\r\n\t\t\tpos.left -= parentOffset.left + (parseFloat($.css(parent, 'marginLeft')) || 0);\r\n\t\t\tpos.top -= parentOffset.top + (parseFloat($.css(parent, 'marginTop')) || 0);\r\n\r\n\t\t\t// If this is the first parent element with an overflow of \"scroll\" or \"auto\", store it\r\n\t\t\tif(!scrolled && (overflow = $.css(parent, 'overflow')) !== 'hidden' && overflow !== 'visible') { scrolled = $(parent); }\r\n\t\t}\r\n\t}\r\n\twhile((parent = parent.offsetParent));\r\n\r\n\t// Compensate for containers scroll if it also has an offsetParent (or in IE quirks mode)\r\n\tif(scrolled && (scrolled[0] !== ownerDocument[0] || quirks)) {\r\n\t\tscroll(scrolled, 1);\r\n\t}\r\n\r\n\treturn pos;\r\n};\r\n\r\n// Corner class\r\nvar C = (CORNER = PROTOTYPE.reposition.Corner = function(corner, forceY) {\r\n\tcorner = ('' + corner).replace(/([A-Z])/, ' $1').replace(/middle/gi, CENTER).toLowerCase();\r\n\tthis.x = (corner.match(/left|right/i) || corner.match(/center/) || ['inherit'])[0].toLowerCase();\r\n\tthis.y = (corner.match(/top|bottom|center/i) || ['inherit'])[0].toLowerCase();\r\n\tthis.forceY = !!forceY;\r\n\r\n\tvar f = corner.charAt(0);\r\n\tthis.precedance = (f === 't' || f === 'b' ? Y : X);\r\n}).prototype;\r\n\r\nC.invert = function(z, center) {\r\n\tthis[z] = this[z] === LEFT ? RIGHT : this[z] === RIGHT ? LEFT : center || this[z];\r\n};\r\n\r\nC.string = function(join) {\r\n\tvar x = this.x, y = this.y;\r\n\r\n\tvar result = x !== y ?\r\n\t\t(x === 'center' || y !== 'center' && (this.precedance === Y || this.forceY) ? \r\n\t\t\t[y,x] : [x,y]\r\n\t\t) :\r\n\t[x];\r\n\r\n\treturn join !== false ? result.join(' ') : result;\r\n};\r\n\r\nC.abbrev = function() {\r\n\tvar result = this.string(false);\r\n\treturn result[0].charAt(0) + (result[1] && result[1].charAt(0) || '');\r\n};\r\n\r\nC.clone = function() {\r\n\treturn new CORNER( this.string(), this.forceY );\r\n};\r\n\r\n;\r\nPROTOTYPE.toggle = function(state, event) {\r\n\tvar cache = this.cache,\r\n\t\toptions = this.options,\r\n\t\ttooltip = this.tooltip;\r\n\r\n\t// Try to prevent flickering when tooltip overlaps show element\r\n\tif(event) {\r\n\t\tif((/over|enter/).test(event.type) && cache.event && (/out|leave/).test(cache.event.type) &&\r\n\t\t\toptions.show.target.add(event.target).length === options.show.target.length &&\r\n\t\t\ttooltip.has(event.relatedTarget).length) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// Cache event\r\n\t\tcache.event = $.event.fix(event);\r\n\t}\r\n\r\n\t// If we're currently waiting and we've just hidden... stop it\r\n\tthis.waiting && !state && (this.hiddenDuringWait = TRUE);\r\n\r\n\t// Render the tooltip if showing and it isn't already\r\n\tif(!this.rendered) { return state ? this.render(1) : this; }\r\n\telse if(this.destroyed || this.disabled) { return this; }\r\n\r\n\tvar type = state ? 'show' : 'hide',\r\n\t\topts = this.options[type],\r\n\t\totherOpts = this.options[ !state ? 'show' : 'hide' ],\r\n\t\tposOptions = this.options.position,\r\n\t\tcontentOptions = this.options.content,\r\n\t\twidth = this.tooltip.css('width'),\r\n\t\tvisible = this.tooltip.is(':visible'),\r\n\t\tanimate = state || opts.target.length === 1,\r\n\t\tsameTarget = !event || opts.target.length < 2 || cache.target[0] === event.target,\r\n\t\tidenticalState, allow, showEvent, delay, after;\r\n\r\n\t// Detect state if valid one isn't provided\r\n\tif((typeof state).search('boolean|number')) { state = !visible; }\r\n\r\n\t// Check if the tooltip is in an identical state to the new would-be state\r\n\tidenticalState = !tooltip.is(':animated') && visible === state && sameTarget;\r\n\r\n\t// Fire tooltip(show/hide) event and check if destroyed\r\n\tallow = !identicalState ? !!this._trigger(type, [90]) : NULL;\r\n\r\n\t// Check to make sure the tooltip wasn't destroyed in the callback\r\n\tif(this.destroyed) { return this; }\r\n\r\n\t// If the user didn't stop the method prematurely and we're showing the tooltip, focus it\r\n\tif(allow !== FALSE && state) { this.focus(event); }\r\n\r\n\t// If the state hasn't changed or the user stopped it, return early\r\n\tif(!allow || identicalState) { return this; }\r\n\r\n\t// Set ARIA hidden attribute\r\n\t$.attr(tooltip[0], 'aria-hidden', !!!state);\r\n\r\n\t// Execute state specific properties\r\n\tif(state) {\r\n\t\t// Store show origin coordinates\r\n\t\tthis.mouse && (cache.origin = $.event.fix(this.mouse));\r\n\r\n\t\t// Update tooltip content & title if it's a dynamic function\r\n\t\tif($.isFunction(contentOptions.text)) { this._updateContent(contentOptions.text, FALSE); }\r\n\t\tif($.isFunction(contentOptions.title)) { this._updateTitle(contentOptions.title, FALSE); }\r\n\r\n\t\t// Cache mousemove events for positioning purposes (if not already tracking)\r\n\t\tif(!trackingBound && posOptions.target === 'mouse' && posOptions.adjust.mouse) {\r\n\t\t\t$(document).bind('mousemove.'+NAMESPACE, this._storeMouse);\r\n\t\t\ttrackingBound = TRUE;\r\n\t\t}\r\n\r\n\t\t// Update the tooltip position (set width first to prevent viewport/max-width issues)\r\n\t\tif(!width) { tooltip.css('width', tooltip.outerWidth(FALSE)); }\r\n\t\tthis.reposition(event, arguments[2]);\r\n\t\tif(!width) { tooltip.css('width', ''); }\r\n\r\n\t\t// Hide other tooltips if tooltip is solo\r\n\t\tif(!!opts.solo) {\r\n\t\t\t(typeof opts.solo === 'string' ? $(opts.solo) : $(SELECTOR, opts.solo))\r\n\t\t\t\t.not(tooltip).not(opts.target).qtip('hide', $.Event('tooltipsolo'));\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\t// Clear show timer if we're hiding\r\n\t\tclearTimeout(this.timers.show);\r\n\r\n\t\t// Remove cached origin on hide\r\n\t\tdelete cache.origin;\r\n\r\n\t\t// Remove mouse tracking event if not needed (all tracking qTips are hidden)\r\n\t\tif(trackingBound && !$(SELECTOR+'[tracking=\"true\"]:visible', opts.solo).not(tooltip).length) {\r\n\t\t\t$(document).unbind('mousemove.'+NAMESPACE);\r\n\t\t\ttrackingBound = FALSE;\r\n\t\t}\r\n\r\n\t\t// Blur the tooltip\r\n\t\tthis.blur(event);\r\n\t}\r\n\r\n\t// Define post-animation, state specific properties\r\n\tafter = $.proxy(function() {\r\n\t\tif(state) {\r\n\t\t\t// Prevent antialias from disappearing in IE by removing filter\r\n\t\t\tif(BROWSER.ie) { tooltip[0].style.removeAttribute('filter'); }\r\n\r\n\t\t\t// Remove overflow setting to prevent tip bugs\r\n\t\t\ttooltip.css('overflow', '');\r\n\r\n\t\t\t// Autofocus elements if enabled\r\n\t\t\tif('string' === typeof opts.autofocus) {\r\n\t\t\t\t$(this.options.show.autofocus, tooltip).focus();\r\n\t\t\t}\r\n\r\n\t\t\t// If set, hide tooltip when inactive for delay period\r\n\t\t\tthis.options.show.target.trigger('qtip-'+this.id+'-inactive');\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// Reset CSS states\r\n\t\t\ttooltip.css({\r\n\t\t\t\tdisplay: '',\r\n\t\t\t\tvisibility: '',\r\n\t\t\t\topacity: '',\r\n\t\t\t\tleft: '',\r\n\t\t\t\ttop: ''\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// tooltipvisible/tooltiphidden events\r\n\t\tthis._trigger(state ? 'visible' : 'hidden');\r\n\t}, this);\r\n\r\n\t// If no effect type is supplied, use a simple toggle\r\n\tif(opts.effect === FALSE || animate === FALSE) {\r\n\t\ttooltip[ type ]();\r\n\t\tafter();\r\n\t}\r\n\r\n\t// Use custom function if provided\r\n\telse if($.isFunction(opts.effect)) {\r\n\t\ttooltip.stop(1, 1);\r\n\t\topts.effect.call(tooltip, this);\r\n\t\ttooltip.queue('fx', function(n) {\r\n\t\t\tafter(); n();\r\n\t\t});\r\n\t}\r\n\r\n\t// Use basic fade function by default\r\n\telse { tooltip.fadeTo(90, state ? 1 : 0, after); }\r\n\r\n\t// If inactive hide method is set, active it\r\n\tif(state) { opts.target.trigger('qtip-'+this.id+'-inactive'); }\r\n\r\n\treturn this;\r\n};\r\n\r\nPROTOTYPE.show = function(event) { return this.toggle(TRUE, event); };\r\n\r\nPROTOTYPE.hide = function(event) { return this.toggle(FALSE, event); };\r\n;PROTOTYPE.focus = function(event) {\r\n\tif(!this.rendered || this.destroyed) { return this; }\r\n\r\n\tvar qtips = $(SELECTOR),\r\n\t\ttooltip = this.tooltip,\r\n\t\tcurIndex = parseInt(tooltip[0].style.zIndex, 10),\r\n\t\tnewIndex = QTIP.zindex + qtips.length,\r\n\t\tfocusedElem;\r\n\r\n\t// Only update the z-index if it has changed and tooltip is not already focused\r\n\tif(!tooltip.hasClass(CLASS_FOCUS)) {\r\n\t\t// tooltipfocus event\r\n\t\tif(this._trigger('focus', [newIndex], event)) {\r\n\t\t\t// Only update z-index's if they've changed\r\n\t\t\tif(curIndex !== newIndex) {\r\n\t\t\t\t// Reduce our z-index's and keep them properly ordered\r\n\t\t\t\tqtips.each(function() {\r\n\t\t\t\t\tif(this.style.zIndex > curIndex) {\r\n\t\t\t\t\t\tthis.style.zIndex = this.style.zIndex - 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Fire blur event for focused tooltip\r\n\t\t\t\tqtips.filter('.' + CLASS_FOCUS).qtip('blur', event);\r\n\t\t\t}\r\n\r\n\t\t\t// Set the new z-index\r\n\t\t\ttooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex;\r\n\t\t}\r\n\t}\r\n\r\n\treturn this;\r\n};\r\n\r\nPROTOTYPE.blur = function(event) {\r\n\tif(!this.rendered || this.destroyed) { return this; }\r\n\r\n\t// Set focused status to FALSE\r\n\tthis.tooltip.removeClass(CLASS_FOCUS);\r\n\r\n\t// tooltipblur event\r\n\tthis._trigger('blur', [ this.tooltip.css('zIndex') ], event);\r\n\r\n\treturn this;\r\n};\r\n;PROTOTYPE.disable = function(state) {\r\n\tif(this.destroyed) { return this; }\r\n\r\n\t// If 'toggle' is passed, toggle the current state\r\n\tif(state === 'toggle') {\r\n\t\tstate = !(this.rendered ? this.tooltip.hasClass(CLASS_DISABLED) : this.disabled);\r\n\t}\r\n\r\n\t// Disable if no state passed\r\n\telse if('boolean' !== typeof state) {\r\n\t\tstate = TRUE;\r\n\t}\r\n\r\n\tif(this.rendered) {\r\n\t\tthis.tooltip.toggleClass(CLASS_DISABLED, state)\r\n\t\t\t.attr('aria-disabled', state);\r\n\t}\r\n\r\n\tthis.disabled = !!state;\r\n\r\n\treturn this;\r\n};\r\n\r\nPROTOTYPE.enable = function() { return this.disable(FALSE); };\r\n;PROTOTYPE._createButton = function()\r\n{\r\n\tvar self = this,\r\n\t\telements = this.elements,\r\n\t\ttooltip = elements.tooltip,\r\n\t\tbutton = this.options.content.button,\r\n\t\tisString = typeof button === 'string',\r\n\t\tclose = isString ? button : 'Close tooltip';\r\n\r\n\tif(elements.button) { elements.button.remove(); }\r\n\r\n\t// Use custom button if one was supplied by user, else use default\r\n\tif(button.jquery) {\r\n\t\telements.button = button;\r\n\t}\r\n\telse {\r\n\t\telements.button = $('<a />', {\r\n\t\t\t'class': 'qtip-close ' + (this.options.style.widget ? '' : NAMESPACE+'-icon'),\r\n\t\t\t'title': close,\r\n\t\t\t'aria-label': close\r\n\t\t})\r\n\t\t.prepend(\r\n\t\t\t$('<span />', {\r\n\t\t\t\t'class': 'ui-icon ui-icon-close',\r\n\t\t\t\t'html': '&times;'\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\t// Create button and setup attributes\r\n\telements.button.appendTo(elements.titlebar || tooltip)\r\n\t\t.attr('role', 'button')\r\n\t\t.click(function(event) {\r\n\t\t\tif(!tooltip.hasClass(CLASS_DISABLED)) { self.hide(event); }\r\n\t\t\treturn FALSE;\r\n\t\t});\r\n};\r\n\r\nPROTOTYPE._updateButton = function(button)\r\n{\r\n\t// Make sure tooltip is rendered and if not, return\r\n\tif(!this.rendered) { return FALSE; }\r\n\r\n\tvar elem = this.elements.button;\r\n\tif(button) { this._createButton(); }\r\n\telse { elem.remove(); }\r\n};\r\n;// Widget class creator\r\nfunction createWidgetClass(cls) {\r\n\treturn WIDGET.concat('').join(cls ? '-'+cls+' ' : ' ');\r\n}\r\n\r\n// Widget class setter method\r\nPROTOTYPE._setWidget = function()\r\n{\r\n\tvar on = this.options.style.widget,\r\n\t\telements = this.elements,\r\n\t\ttooltip = elements.tooltip,\r\n\t\tdisabled = tooltip.hasClass(CLASS_DISABLED);\r\n\r\n\ttooltip.removeClass(CLASS_DISABLED);\r\n\tCLASS_DISABLED = on ? 'ui-state-disabled' : 'qtip-disabled';\r\n\ttooltip.toggleClass(CLASS_DISABLED, disabled);\r\n\r\n\ttooltip.toggleClass('ui-helper-reset '+createWidgetClass(), on).toggleClass(CLASS_DEFAULT, this.options.style.def && !on);\r\n\r\n\tif(elements.content) {\r\n\t\telements.content.toggleClass( createWidgetClass('content'), on);\r\n\t}\r\n\tif(elements.titlebar) {\r\n\t\telements.titlebar.toggleClass( createWidgetClass('header'), on);\r\n\t}\r\n\tif(elements.button) {\r\n\t\telements.button.toggleClass(NAMESPACE+'-icon', !on);\r\n\t}\r\n};\r\n;function delay(callback, duration) {\r\n\t// If tooltip has displayed, start hide timer\r\n\tif(duration > 0) {\r\n\t\treturn setTimeout(\r\n\t\t\t$.proxy(callback, this), duration\r\n\t\t);\r\n\t}\r\n\telse{ callback.call(this); }\r\n}\r\n\r\nfunction showMethod(event) {\r\n\tif(this.tooltip.hasClass(CLASS_DISABLED)) { return; }\r\n\r\n\t// Clear hide timers\r\n\tclearTimeout(this.timers.show);\r\n\tclearTimeout(this.timers.hide);\r\n\r\n\t// Start show timer\r\n\tthis.timers.show = delay.call(this,\r\n\t\tfunction() { this.toggle(TRUE, event); },\r\n\t\tthis.options.show.delay\r\n\t);\r\n}\r\n\r\nfunction hideMethod(event) {\r\n\tif(this.tooltip.hasClass(CLASS_DISABLED) || this.destroyed) { return; }\r\n\r\n\t// Check if new target was actually the tooltip element\r\n\tvar relatedTarget = $(event.relatedTarget),\r\n\t\tontoTooltip = relatedTarget.closest(SELECTOR)[0] === this.tooltip[0],\r\n\t\tontoTarget = relatedTarget[0] === this.options.show.target[0];\r\n\r\n\t// Clear timers and stop animation queue\r\n\tclearTimeout(this.timers.show);\r\n\tclearTimeout(this.timers.hide);\r\n\r\n\t// Prevent hiding if tooltip is fixed and event target is the tooltip.\r\n\t// Or if mouse positioning is enabled and cursor momentarily overlaps\r\n\tif(this !== relatedTarget[0] &&\r\n\t\t(this.options.position.target === 'mouse' && ontoTooltip) ||\r\n\t\t(this.options.hide.fixed && (\r\n\t\t\t(/mouse(out|leave|move)/).test(event.type) && (ontoTooltip || ontoTarget))\r\n\t\t))\r\n\t{\r\n\t\ttry {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopImmediatePropagation();\r\n\t\t} catch(e) {}\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\t// If tooltip has displayed, start hide timer\r\n\tthis.timers.hide = delay.call(this,\r\n\t\tfunction() { this.toggle(FALSE, event); },\r\n\t\tthis.options.hide.delay,\r\n\t\tthis\r\n\t);\r\n}\r\n\r\nfunction inactiveMethod(event) {\r\n\tif(this.tooltip.hasClass(CLASS_DISABLED) || !this.options.hide.inactive) { return; }\r\n\r\n\t// Clear timer\r\n\tclearTimeout(this.timers.inactive);\r\n\r\n\tthis.timers.inactive = delay.call(this,\r\n\t\tfunction(){ this.hide(event); },\r\n\t\tthis.options.hide.inactive\r\n\t);\r\n}\r\n\r\nfunction repositionMethod(event) {\r\n\tif(this.rendered && this.tooltip[0].offsetWidth > 0) { this.reposition(event); }\r\n}\r\n\r\n// Store mouse coordinates\r\nPROTOTYPE._storeMouse = function(event) {\r\n\t(this.mouse = $.event.fix(event)).type = 'mousemove';\r\n\treturn this;\r\n};\r\n\r\n// Bind events\r\nPROTOTYPE._bind = function(targets, events, method, suffix, context) {\r\n\tif(!targets || !method || !events.length) { return; }\r\n\tvar ns = '.' + this._id + (suffix ? '-'+suffix : '');\r\n\t$(targets).bind(\r\n\t\t(events.split ? events : events.join(ns + ' ')) + ns,\r\n\t\t$.proxy(method, context || this)\r\n\t);\r\n\treturn this;\r\n};\r\nPROTOTYPE._unbind = function(targets, suffix) {\r\n\ttargets && $(targets).unbind('.' + this._id + (suffix ? '-'+suffix : ''));\r\n\treturn this;\r\n};\r\n\r\n// Global delegation helper\r\nfunction delegate(selector, events, method) {\r\n\t$(document.body).delegate(selector,\r\n\t\t(events.split ? events : events.join('.'+NAMESPACE + ' ')) + '.'+NAMESPACE,\r\n\t\tfunction() {\r\n\t\t\tvar api = QTIP.api[ $.attr(this, ATTR_ID) ];\r\n\t\t\tapi && !api.disabled && method.apply(api, arguments);\r\n\t\t}\r\n\t);\r\n}\r\n// Event trigger\r\nPROTOTYPE._trigger = function(type, args, event) {\r\n\tvar callback = $.Event('tooltip'+type);\r\n\tcallback.originalEvent = (event && $.extend({}, event)) || this.cache.event || NULL;\r\n\r\n\tthis.triggering = type;\r\n\tthis.tooltip.trigger(callback, [this].concat(args || []));\r\n\tthis.triggering = FALSE;\r\n\r\n\treturn !callback.isDefaultPrevented();\r\n};\r\n\r\nPROTOTYPE._bindEvents = function(showEvents, hideEvents, showTargets, hideTargets, showMethod, hideMethod) {\r\n\t// Get tasrgets that lye within both\r\n\tvar similarTargets = showTargets.filter( hideTargets ).add( hideTargets.filter(showTargets) ),\r\n\t\ttoggleEvents = [];\r\n\r\n\t// If hide and show targets are the same...\r\n\tif(similarTargets.length) {\r\n\r\n\t\t// Filter identical show/hide events\r\n\t\t$.each(hideEvents, function(i, type) {\r\n\t\t\tvar showIndex = $.inArray(type, showEvents);\r\n\r\n\t\t\t// Both events are identical, remove from both hide and show events\r\n\t\t\t// and append to toggleEvents\r\n\t\t\tshowIndex > -1 && toggleEvents.push( showEvents.splice( showIndex, 1 )[0] );\r\n\t\t});\r\n\r\n\t\t// Toggle events are special case of identical show/hide events, which happen in sequence\r\n\t\tif(toggleEvents.length) {\r\n\t\t\t// Bind toggle events to the similar targets\r\n\t\t\tthis._bind(similarTargets, toggleEvents, function(event) {\r\n\t\t\t\tvar state = this.rendered ? this.tooltip[0].offsetWidth > 0 : false;\r\n\t\t\t\t(state ? hideMethod : showMethod).call(this, event);\r\n\t\t\t});\r\n\r\n\t\t\t// Remove the similar targets from the regular show/hide bindings\r\n\t\t\tshowTargets = showTargets.not(similarTargets);\r\n\t\t\thideTargets = hideTargets.not(similarTargets);\r\n\t\t}\r\n\t}\r\n\r\n\t// Apply show/hide/toggle events\r\n\tthis._bind(showTargets, showEvents, showMethod);\r\n\tthis._bind(hideTargets, hideEvents, hideMethod);\r\n};\r\n\r\nPROTOTYPE._assignInitialEvents = function(event) {\r\n\tvar options = this.options,\r\n\t\tshowTarget = options.show.target,\r\n\t\thideTarget = options.hide.target,\r\n\t\tshowEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [],\r\n\t\thideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : [];\r\n\r\n\t// Catch remove/removeqtip events on target element to destroy redundant tooltips\r\n\tthis._bind(this.elements.target, ['remove', 'removeqtip'], function(event) {\r\n\t\tthis.destroy(true);\r\n\t}, 'destroy');\r\n\r\n\t/*\r\n\t * Make sure hoverIntent functions properly by using mouseleave as a hide event if\r\n\t * mouseenter/mouseout is used for show.event, even if it isn't in the users options.\r\n\t */\r\n\tif(/mouse(over|enter)/i.test(options.show.event) && !/mouse(out|leave)/i.test(options.hide.event)) {\r\n\t\thideEvents.push('mouseleave');\r\n\t}\r\n\r\n\t/*\r\n\t * Also make sure initial mouse targetting works correctly by caching mousemove coords\r\n\t * on show targets before the tooltip has rendered. Also set onTarget when triggered to\r\n\t * keep mouse tracking working.\r\n\t */\r\n\tthis._bind(showTarget, 'mousemove', function(event) {\r\n\t\tthis._storeMouse(event);\r\n\t\tthis.cache.onTarget = TRUE;\r\n\t});\r\n\r\n\t// Define hoverIntent function\r\n\tfunction hoverIntent(event) {\r\n\t\t// Only continue if tooltip isn't disabled\r\n\t\tif(this.disabled || this.destroyed) { return FALSE; }\r\n\r\n\t\t// Cache the event data\r\n\t\tthis.cache.event = event && $.event.fix(event);\r\n\t\tthis.cache.target = event && $(event.target);\r\n\r\n\t\t// Start the event sequence\r\n\t\tclearTimeout(this.timers.show);\r\n\t\tthis.timers.show = delay.call(this,\r\n\t\t\tfunction() { this.render(typeof event === 'object' || options.show.ready); },\r\n\t\t\toptions.prerender ? 0 : options.show.delay\r\n\t\t);\r\n\t}\r\n\r\n\t// Filter and bind events\r\n\tthis._bindEvents(showEvents, hideEvents, showTarget, hideTarget, hoverIntent, function() {\r\n\t\tif(!this.timers) { return FALSE; }\r\n\t\tclearTimeout(this.timers.show);\r\n\t});\r\n\r\n\t// Prerendering is enabled, create tooltip now\r\n\tif(options.show.ready || options.prerender) { hoverIntent.call(this, event); }\r\n};\r\n\r\n// Event assignment method\r\nPROTOTYPE._assignEvents = function() {\r\n\tvar self = this,\r\n\t\toptions = this.options,\r\n\t\tposOptions = options.position,\r\n\r\n\t\ttooltip = this.tooltip,\r\n\t\tshowTarget = options.show.target,\r\n\t\thideTarget = options.hide.target,\r\n\t\tcontainerTarget = posOptions.container,\r\n\t\tviewportTarget = posOptions.viewport,\r\n\t\tdocumentTarget = $(document),\r\n\t\tbodyTarget = $(document.body),\r\n\t\twindowTarget = $(window),\r\n\r\n\t\tshowEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [],\r\n\t\thideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : [];\r\n\r\n\r\n\t// Assign passed event callbacks\r\n\t$.each(options.events, function(name, callback) {\r\n\t\tself._bind(tooltip, name === 'toggle' ? ['tooltipshow','tooltiphide'] : ['tooltip'+name], callback, null, tooltip);\r\n\t});\r\n\r\n\t// Hide tooltips when leaving current window/frame (but not select/option elements)\r\n\tif(/mouse(out|leave)/i.test(options.hide.event) && options.hide.leave === 'window') {\r\n\t\tthis._bind(documentTarget, ['mouseout', 'blur'], function(event) {\r\n\t\t\tif(!/select|option/.test(event.target.nodeName) && !event.relatedTarget) {\r\n\t\t\t\tthis.hide(event);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Enable hide.fixed by adding appropriate class\r\n\tif(options.hide.fixed) {\r\n\t\thideTarget = hideTarget.add( tooltip.addClass(CLASS_FIXED) );\r\n\t}\r\n\r\n\t/*\r\n\t * Make sure hoverIntent functions properly by using mouseleave to clear show timer if\r\n\t * mouseenter/mouseout is used for show.event, even if it isn't in the users options.\r\n\t */\r\n\telse if(/mouse(over|enter)/i.test(options.show.event)) {\r\n\t\tthis._bind(hideTarget, 'mouseleave', function() {\r\n\t\t\tclearTimeout(this.timers.show);\r\n\t\t});\r\n\t}\r\n\r\n\t// Hide tooltip on document mousedown if unfocus events are enabled\r\n\tif(('' + options.hide.event).indexOf('unfocus') > -1) {\r\n\t\tthis._bind(containerTarget.closest('html'), ['mousedown', 'touchstart'], function(event) {\r\n\t\t\tvar elem = $(event.target),\r\n\t\t\t\tenabled = this.rendered && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0,\r\n\t\t\t\tisAncestor = elem.parents(SELECTOR).filter(this.tooltip[0]).length > 0;\r\n\r\n\t\t\tif(elem[0] !== this.target[0] && elem[0] !== this.tooltip[0] && !isAncestor &&\r\n\t\t\t\t!this.target.has(elem[0]).length && enabled\r\n\t\t\t) {\r\n\t\t\t\tthis.hide(event);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Check if the tooltip hides when inactive\r\n\tif('number' === typeof options.hide.inactive) {\r\n\t\t// Bind inactive method to show target(s) as a custom event\r\n\t\tthis._bind(showTarget, 'qtip-'+this.id+'-inactive', inactiveMethod, 'inactive');\r\n\r\n\t\t// Define events which reset the 'inactive' event handler\r\n\t\tthis._bind(hideTarget.add(tooltip), QTIP.inactiveEvents, inactiveMethod);\r\n\t}\r\n\r\n\t// Filter and bind events\r\n\tthis._bindEvents(showEvents, hideEvents, showTarget, hideTarget, showMethod, hideMethod);\r\n\r\n\t// Mouse movement bindings\r\n\tthis._bind(showTarget.add(tooltip), 'mousemove', function(event) {\r\n\t\t// Check if the tooltip hides when mouse is moved a certain distance\r\n\t\tif('number' === typeof options.hide.distance) {\r\n\t\t\tvar origin = this.cache.origin || {},\r\n\t\t\t\tlimit = this.options.hide.distance,\r\n\t\t\t\tabs = Math.abs;\r\n\r\n\t\t\t// Check if the movement has gone beyond the limit, and hide it if so\r\n\t\t\tif(abs(event.pageX - origin.pageX) >= limit || abs(event.pageY - origin.pageY) >= limit) {\r\n\t\t\t\tthis.hide(event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Cache mousemove coords on show targets\r\n\t\tthis._storeMouse(event);\r\n\t});\r\n\r\n\t// Mouse positioning events\r\n\tif(posOptions.target === 'mouse') {\r\n\t\t// If mouse adjustment is on...\r\n\t\tif(posOptions.adjust.mouse) {\r\n\t\t\t// Apply a mouseleave event so we don't get problems with overlapping\r\n\t\t\tif(options.hide.event) {\r\n\t\t\t\t// Track if we're on the target or not\r\n\t\t\t\tthis._bind(showTarget, ['mouseenter', 'mouseleave'], function(event) {\r\n\t\t\t\t\tif(!this.cache) {return FALSE; }\r\n\t\t\t\t\tthis.cache.onTarget = event.type === 'mouseenter';\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Update tooltip position on mousemove\r\n\t\t\tthis._bind(documentTarget, 'mousemove', function(event) {\r\n\t\t\t\t// Update the tooltip position only if the tooltip is visible and adjustment is enabled\r\n\t\t\t\tif(this.rendered && this.cache.onTarget && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0) {\r\n\t\t\t\t\tthis.reposition(event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Adjust positions of the tooltip on window resize if enabled\r\n\tif(posOptions.adjust.resize || viewportTarget.length) {\r\n\t\tthis._bind( $.event.special.resize ? viewportTarget : windowTarget, 'resize', repositionMethod );\r\n\t}\r\n\r\n\t// Adjust tooltip position on scroll of the window or viewport element if present\r\n\tif(posOptions.adjust.scroll) {\r\n\t\tthis._bind( windowTarget.add(posOptions.container), 'scroll', repositionMethod );\r\n\t}\r\n};\r\n\r\n// Un-assignment method\r\nPROTOTYPE._unassignEvents = function() {\r\n\tvar options = this.options,\r\n\t\tshowTargets = options.show.target,\r\n\t\thideTargets = options.hide.target,\r\n\t\ttargets = $.grep([\r\n\t\t\tthis.elements.target[0],\r\n\t\t\tthis.rendered && this.tooltip[0],\r\n\t\t\toptions.position.container[0],\r\n\t\t\toptions.position.viewport[0],\r\n\t\t\toptions.position.container.closest('html')[0], // unfocus\r\n\t\t\twindow,\r\n\t\t\tdocument\r\n\t\t], function(i) {\r\n\t\t\treturn typeof i === 'object';\r\n\t\t});\r\n\r\n\t// Add show and hide targets if they're valid\r\n\tif(showTargets && showTargets.toArray) {\r\n\t\ttargets = targets.concat(showTargets.toArray());\r\n\t}\r\n\tif(hideTargets && hideTargets.toArray) {\r\n\t\ttargets = targets.concat(hideTargets.toArray());\r\n\t}\r\n\r\n\t// Unbind the events\r\n\tthis._unbind(targets)\r\n\t\t._unbind(targets, 'destroy')\r\n\t\t._unbind(targets, 'inactive');\r\n};\r\n\r\n// Apply common event handlers using delegate (avoids excessive .bind calls!)\r\n$(function() {\r\n\tdelegate(SELECTOR, ['mouseenter', 'mouseleave'], function(event) {\r\n\t\tvar state = event.type === 'mouseenter',\r\n\t\t\ttooltip = $(event.currentTarget),\r\n\t\t\ttarget = $(event.relatedTarget || event.target),\r\n\t\t\toptions = this.options;\r\n\r\n\t\t// On mouseenter...\r\n\t\tif(state) {\r\n\t\t\t// Focus the tooltip on mouseenter (z-index stacking)\r\n\t\t\tthis.focus(event);\r\n\r\n\t\t\t// Clear hide timer on tooltip hover to prevent it from closing\r\n\t\t\ttooltip.hasClass(CLASS_FIXED) && !tooltip.hasClass(CLASS_DISABLED) && clearTimeout(this.timers.hide);\r\n\t\t}\r\n\r\n\t\t// On mouseleave...\r\n\t\telse {\r\n\t\t\t// When mouse tracking is enabled, hide when we leave the tooltip and not onto the show target (if a hide event is set)\r\n\t\t\tif(options.position.target === 'mouse' && options.position.adjust.mouse &&\r\n\t\t\t\toptions.hide.event && options.show.target && !target.closest(options.show.target[0]).length) {\r\n\t\t\t\tthis.hide(event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Add hover class\r\n\t\ttooltip.toggleClass(CLASS_HOVER, state);\r\n\t});\r\n\r\n\t// Define events which reset the 'inactive' event handler\r\n\tdelegate('['+ATTR_ID+']', INACTIVE_EVENTS, inactiveMethod);\r\n});\r\n;// Initialization method\r\nfunction init(elem, id, opts) {\r\n\tvar obj, posOptions, attr, config, title,\r\n\r\n\t// Setup element references\r\n\tdocBody = $(document.body),\r\n\r\n\t// Use document body instead of document element if needed\r\n\tnewTarget = elem[0] === document ? docBody : elem,\r\n\r\n\t// Grab metadata from element if plugin is present\r\n\tmetadata = (elem.metadata) ? elem.metadata(opts.metadata) : NULL,\r\n\r\n\t// If metadata type if HTML5, grab 'name' from the object instead, or use the regular data object otherwise\r\n\tmetadata5 = opts.metadata.type === 'html5' && metadata ? metadata[opts.metadata.name] : NULL,\r\n\r\n\t// Grab data from metadata.name (or data-qtipopts as fallback) using .data() method,\r\n\thtml5 = elem.data(opts.metadata.name || 'qtipopts');\r\n\r\n\t// If we don't get an object returned attempt to parse it manualyl without parseJSON\r\n\ttry { html5 = typeof html5 === 'string' ? $.parseJSON(html5) : html5; } catch(e) {}\r\n\r\n\t// Merge in and sanitize metadata\r\n\tconfig = $.extend(TRUE, {}, QTIP.defaults, opts,\r\n\t\ttypeof html5 === 'object' ? sanitizeOptions(html5) : NULL,\r\n\t\tsanitizeOptions(metadata5 || metadata));\r\n\r\n\t// Re-grab our positioning options now we've merged our metadata and set id to passed value\r\n\tposOptions = config.position;\r\n\tconfig.id = id;\r\n\r\n\t// Setup missing content if none is detected\r\n\tif('boolean' === typeof config.content.text) {\r\n\t\tattr = elem.attr(config.content.attr);\r\n\r\n\t\t// Grab from supplied attribute if available\r\n\t\tif(config.content.attr !== FALSE && attr) { config.content.text = attr; }\r\n\r\n\t\t// No valid content was found, abort render\r\n\t\telse { return FALSE; }\r\n\t}\r\n\r\n\t// Setup target options\r\n\tif(!posOptions.container.length) { posOptions.container = docBody; }\r\n\tif(posOptions.target === FALSE) { posOptions.target = newTarget; }\r\n\tif(config.show.target === FALSE) { config.show.target = newTarget; }\r\n\tif(config.show.solo === TRUE) { config.show.solo = posOptions.container.closest('body'); }\r\n\tif(config.hide.target === FALSE) { config.hide.target = newTarget; }\r\n\tif(config.position.viewport === TRUE) { config.position.viewport = posOptions.container; }\r\n\r\n\t// Ensure we only use a single container\r\n\tposOptions.container = posOptions.container.eq(0);\r\n\r\n\t// Convert position corner values into x and y strings\r\n\tposOptions.at = new CORNER(posOptions.at, TRUE);\r\n\tposOptions.my = new CORNER(posOptions.my);\r\n\r\n\t// Destroy previous tooltip if overwrite is enabled, or skip element if not\r\n\tif(elem.data(NAMESPACE)) {\r\n\t\tif(config.overwrite) {\r\n\t\t\telem.qtip('destroy', true);\r\n\t\t}\r\n\t\telse if(config.overwrite === FALSE) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\t// Add has-qtip attribute\r\n\telem.attr(ATTR_HAS, id);\r\n\r\n\t// Remove title attribute and store it if present\r\n\tif(config.suppress && (title = elem.attr('title'))) {\r\n\t\t// Final attr call fixes event delegatiom and IE default tooltip showing problem\r\n\t\telem.removeAttr('title').attr(oldtitle, title).attr('title', '');\r\n\t}\r\n\r\n\t// Initialize the tooltip and add API reference\r\n\tobj = new QTip(elem, config, id, !!attr);\r\n\telem.data(NAMESPACE, obj);\r\n\r\n\treturn obj;\r\n}\r\n\r\n// jQuery $.fn extension method\r\nQTIP = $.fn.qtip = function(options, notation, newValue)\r\n{\r\n\tvar command = ('' + options).toLowerCase(), // Parse command\r\n\t\treturned = NULL,\r\n\t\targs = $.makeArray(arguments).slice(1),\r\n\t\tevent = args[args.length - 1],\r\n\t\topts = this[0] ? $.data(this[0], NAMESPACE) : NULL;\r\n\r\n\t// Check for API request\r\n\tif((!arguments.length && opts) || command === 'api') {\r\n\t\treturn opts;\r\n\t}\r\n\r\n\t// Execute API command if present\r\n\telse if('string' === typeof options) {\r\n\t\tthis.each(function() {\r\n\t\t\tvar api = $.data(this, NAMESPACE);\r\n\t\t\tif(!api) { return TRUE; }\r\n\r\n\t\t\t// Cache the event if possible\r\n\t\t\tif(event && event.timeStamp) { api.cache.event = event; }\r\n\r\n\t\t\t// Check for specific API commands\r\n\t\t\tif(notation && (command === 'option' || command === 'options')) {\r\n\t\t\t\tif(newValue !== undefined || $.isPlainObject(notation)) {\r\n\t\t\t\t\tapi.set(notation, newValue);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturned = api.get(notation);\r\n\t\t\t\t\treturn FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Execute API command\r\n\t\t\telse if(api[command]) {\r\n\t\t\t\tapi[command].apply(api, args);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn returned !== NULL ? returned : this;\r\n\t}\r\n\r\n\t// No API commands. validate provided options and setup qTips\r\n\telse if('object' === typeof options || !arguments.length) {\r\n\t\t// Sanitize options first\r\n\t\topts = sanitizeOptions($.extend(TRUE, {}, options));\r\n\r\n\t\treturn this.each(function(i) {\r\n\t\t\tvar api, id;\r\n\r\n\t\t\t// Find next available ID, or use custom ID if provided\r\n\t\t\tid = $.isArray(opts.id) ? opts.id[i] : opts.id;\r\n\t\t\tid = !id || id === FALSE || id.length < 1 || QTIP.api[id] ? QTIP.nextid++ : id;\r\n\r\n\t\t\t// Initialize the qTip and re-grab newly sanitized options\r\n\t\t\tapi = init($(this), id, opts);\r\n\t\t\tif(api === FALSE) { return TRUE; }\r\n\t\t\telse { QTIP.api[id] = api; }\r\n\r\n\t\t\t// Initialize plugins\r\n\t\t\t$.each(PLUGINS, function() {\r\n\t\t\t\tif(this.initialize === 'initialize') { this(api); }\r\n\t\t\t});\r\n\r\n\t\t\t// Assign initial pre-render events\r\n\t\t\tapi._assignInitialEvents(event);\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// Expose class\r\n$.qtip = QTip;\r\n\r\n// Populated in render method\r\nQTIP.api = {};\r\n;$.each({\r\n\t/* Allow other plugins to successfully retrieve the title of an element with a qTip applied */\r\n\tattr: function(attr, val) {\r\n\t\tif(this.length) {\r\n\t\t\tvar self = this[0],\r\n\t\t\t\ttitle = 'title',\r\n\t\t\t\tapi = $.data(self, 'qtip');\r\n\r\n\t\t\tif(attr === title && api && 'object' === typeof api && api.options.suppress) {\r\n\t\t\t\tif(arguments.length < 2) {\r\n\t\t\t\t\treturn $.attr(self, oldtitle);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If qTip is rendered and title was originally used as content, update it\r\n\t\t\t\tif(api && api.options.content.attr === title && api.cache.attr) {\r\n\t\t\t\t\tapi.set('content.text', val);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Use the regular attr method to set, then cache the result\r\n\t\t\t\treturn this.attr(oldtitle, val);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn $.fn['attr'+replaceSuffix].apply(this, arguments);\r\n\t},\r\n\r\n\t/* Allow clone to correctly retrieve cached title attributes */\r\n\tclone: function(keepData) {\r\n\t\tvar titles = $([]), title = 'title',\r\n\r\n\t\t// Clone our element using the real clone method\r\n\t\telems = $.fn['clone'+replaceSuffix].apply(this, arguments);\r\n\r\n\t\t// Grab all elements with an oldtitle set, and change it to regular title attribute, if keepData is false\r\n\t\tif(!keepData) {\r\n\t\t\telems.filter('['+oldtitle+']').attr('title', function() {\r\n\t\t\t\treturn $.attr(this, oldtitle);\r\n\t\t\t})\r\n\t\t\t.removeAttr(oldtitle);\r\n\t\t}\r\n\r\n\t\treturn elems;\r\n\t}\r\n}, function(name, func) {\r\n\tif(!func || $.fn[name+replaceSuffix]) { return TRUE; }\r\n\r\n\tvar old = $.fn[name+replaceSuffix] = $.fn[name];\r\n\t$.fn[name] = function() {\r\n\t\treturn func.apply(this, arguments) || old.apply(this, arguments);\r\n\t};\r\n});\r\n\r\n/* Fire off 'removeqtip' handler in $.cleanData if jQuery UI not present (it already does similar).\r\n * This snippet is taken directly from jQuery UI source code found here:\r\n *     http://code.jquery.com/ui/jquery-ui-git.js\r\n */\r\nif(!$.ui) {\r\n\t$['cleanData'+replaceSuffix] = $.cleanData;\r\n\t$.cleanData = function( elems ) {\r\n\t\tfor(var i = 0, elem; (elem = $( elems[i] )).length; i++) {\r\n\t\t\tif(elem.attr(ATTR_HAS)) {\r\n\t\t\t\ttry { elem.triggerHandler('removeqtip'); }\r\n\t\t\t\tcatch( e ) {}\r\n\t\t\t}\r\n\t\t}\r\n\t\t$['cleanData'+replaceSuffix].apply(this, arguments);\r\n\t};\r\n}\r\n;// qTip version\r\nQTIP.version = '2.2.1';\r\n\r\n// Base ID for all qTips\r\nQTIP.nextid = 0;\r\n\r\n// Inactive events array\r\nQTIP.inactiveEvents = INACTIVE_EVENTS;\r\n\r\n// Base z-index for all qTips\r\nQTIP.zindex = 15000;\r\n\r\n// Define configuration defaults\r\nQTIP.defaults = {\r\n\tprerender: FALSE,\r\n\tid: FALSE,\r\n\toverwrite: TRUE,\r\n\tsuppress: TRUE,\r\n\tcontent: {\r\n\t\ttext: TRUE,\r\n\t\tattr: 'title',\r\n\t\ttitle: FALSE,\r\n\t\tbutton: FALSE\r\n\t},\r\n\tposition: {\r\n\t\tmy: 'top left',\r\n\t\tat: 'bottom right',\r\n\t\ttarget: FALSE,\r\n\t\tcontainer: FALSE,\r\n\t\tviewport: FALSE,\r\n\t\tadjust: {\r\n\t\t\tx: 0, y: 0,\r\n\t\t\tmouse: TRUE,\r\n\t\t\tscroll: TRUE,\r\n\t\t\tresize: TRUE,\r\n\t\t\tmethod: 'flipinvert flipinvert'\r\n\t\t},\r\n\t\teffect: function(api, pos, viewport) {\r\n\t\t\t$(this).animate(pos, {\r\n\t\t\t\tduration: 200,\r\n\t\t\t\tqueue: FALSE\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\tshow: {\r\n\t\ttarget: FALSE,\r\n\t\tevent: 'mouseenter',\r\n\t\teffect: TRUE,\r\n\t\tdelay: 90,\r\n\t\tsolo: FALSE,\r\n\t\tready: FALSE,\r\n\t\tautofocus: FALSE\r\n\t},\r\n\thide: {\r\n\t\ttarget: FALSE,\r\n\t\tevent: 'mouseleave',\r\n\t\teffect: TRUE,\r\n\t\tdelay: 0,\r\n\t\tfixed: FALSE,\r\n\t\tinactive: FALSE,\r\n\t\tleave: 'window',\r\n\t\tdistance: FALSE\r\n\t},\r\n\tstyle: {\r\n\t\tclasses: '',\r\n\t\twidget: FALSE,\r\n\t\twidth: FALSE,\r\n\t\theight: FALSE,\r\n\t\tdef: TRUE\r\n\t},\r\n\tevents: {\r\n\t\trender: NULL,\r\n\t\tmove: NULL,\r\n\t\tshow: NULL,\r\n\t\thide: NULL,\r\n\t\ttoggle: NULL,\r\n\t\tvisible: NULL,\r\n\t\thidden: NULL,\r\n\t\tfocus: NULL,\r\n\t\tblur: NULL\r\n\t}\r\n};\r\n;var TIP,\r\n\r\n// .bind()/.on() namespace\r\nTIPNS = '.qtip-tip',\r\n\r\n// Common CSS strings\r\nMARGIN = 'margin',\r\nBORDER = 'border',\r\nCOLOR = 'color',\r\nBG_COLOR = 'background-color',\r\nTRANSPARENT = 'transparent',\r\nIMPORTANT = ' !important',\r\n\r\n// Check if the browser supports <canvas/> elements\r\nHASCANVAS = !!document.createElement('canvas').getContext,\r\n\r\n// Invalid colour values used in parseColours()\r\nINVALID = /rgba?\\(0, 0, 0(, 0)?\\)|transparent|#123456/i;\r\n\r\n// Camel-case method, taken from jQuery source\r\n// http://code.jquery.com/jquery-1.8.0.js\r\nfunction camel(s) { return s.charAt(0).toUpperCase() + s.slice(1); }\r\n\r\n/*\r\n * Modified from Modernizr's testPropsAll()\r\n * http://modernizr.com/downloads/modernizr-latest.js\r\n */\r\nvar cssProps = {}, cssPrefixes = [\"Webkit\", \"O\", \"Moz\", \"ms\"];\r\nfunction vendorCss(elem, prop) {\r\n\tvar ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),\r\n\t\tprops = (prop + ' ' + cssPrefixes.join(ucProp + ' ') + ucProp).split(' '),\r\n\t\tcur, val, i = 0;\r\n\r\n\t// If the property has already been mapped...\r\n\tif(cssProps[prop]) { return elem.css(cssProps[prop]); }\r\n\r\n\twhile((cur = props[i++])) {\r\n\t\tif((val = elem.css(cur)) !== undefined) {\r\n\t\t\treturn cssProps[prop] = cur, val;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Parse a given elements CSS property into an int\r\nfunction intCss(elem, prop) {\r\n\treturn Math.ceil(parseFloat(vendorCss(elem, prop)));\r\n}\r\n\r\n\r\n// VML creation (for IE only)\r\nif(!HASCANVAS) {\r\n\tvar createVML = function(tag, props, style) {\r\n\t\treturn '<qtipvml:'+tag+' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"qtip-vml\" '+(props||'')+\r\n\t\t\t' style=\"behavior: url(#default#VML); '+(style||'')+ '\" />';\r\n\t};\r\n}\r\n\r\n// Canvas only definitions\r\nelse {\r\n\tvar PIXEL_RATIO = window.devicePixelRatio || 1,\r\n\t\tBACKING_STORE_RATIO = (function() {\r\n\t\t\tvar context = document.createElement('canvas').getContext('2d');\r\n\t\t\treturn context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio ||\r\n\t\t\t\t\tcontext.msBackingStorePixelRatio || context.oBackingStorePixelRatio || 1;\r\n\t\t}()),\r\n\t\tSCALE = PIXEL_RATIO / BACKING_STORE_RATIO;\r\n}\r\n\r\n\r\nfunction Tip(qtip, options) {\r\n\tthis._ns = 'tip';\r\n\tthis.options = options;\r\n\tthis.offset = options.offset;\r\n\tthis.size = [ options.width, options.height ];\r\n\r\n\t// Initialize\r\n\tthis.init( (this.qtip = qtip) );\r\n}\r\n\r\n$.extend(Tip.prototype, {\r\n\tinit: function(qtip) {\r\n\t\tvar context, tip;\r\n\r\n\t\t// Create tip element and prepend to the tooltip\r\n\t\ttip = this.element = qtip.elements.tip = $('<div />', { 'class': NAMESPACE+'-tip' }).prependTo(qtip.tooltip);\r\n\r\n\t\t// Create tip drawing element(s)\r\n\t\tif(HASCANVAS) {\r\n\t\t\t// save() as soon as we create the canvas element so FF2 doesn't bork on our first restore()!\r\n\t\t\tcontext = $('<canvas />').appendTo(this.element)[0].getContext('2d');\r\n\r\n\t\t\t// Setup constant parameters\r\n\t\t\tcontext.lineJoin = 'miter';\r\n\t\t\tcontext.miterLimit = 100000;\r\n\t\t\tcontext.save();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcontext = createVML('shape', 'coordorigin=\"0,0\"', 'position:absolute;');\r\n\t\t\tthis.element.html(context + context);\r\n\r\n\t\t\t// Prevent mousing down on the tip since it causes problems with .live() handling in IE due to VML\r\n\t\t\tqtip._bind( $('*', tip).add(tip), ['click', 'mousedown'], function(event) { event.stopPropagation(); }, this._ns);\r\n\t\t}\r\n\r\n\t\t// Bind update events\r\n\t\tqtip._bind(qtip.tooltip, 'tooltipmove', this.reposition, this._ns, this);\r\n\r\n\t\t// Create it\r\n\t\tthis.create();\r\n\t},\r\n\r\n\t_swapDimensions: function() {\r\n\t\tthis.size[0] = this.options.height;\r\n\t\tthis.size[1] = this.options.width;\r\n\t},\r\n\t_resetDimensions: function() {\r\n\t\tthis.size[0] = this.options.width;\r\n\t\tthis.size[1] = this.options.height;\r\n\t},\r\n\r\n\t_useTitle: function(corner) {\r\n\t\tvar titlebar = this.qtip.elements.titlebar;\r\n\t\treturn titlebar && (\r\n\t\t\tcorner.y === TOP || (corner.y === CENTER && this.element.position().top + (this.size[1] / 2) + this.options.offset < titlebar.outerHeight(TRUE))\r\n\t\t);\r\n\t},\r\n\r\n\t_parseCorner: function(corner) {\r\n\t\tvar my = this.qtip.options.position.my;\r\n\r\n\t\t// Detect corner and mimic properties\r\n\t\tif(corner === FALSE || my === FALSE) {\r\n\t\t\tcorner = FALSE;\r\n\t\t}\r\n\t\telse if(corner === TRUE) {\r\n\t\t\tcorner = new CORNER( my.string() );\r\n\t\t}\r\n\t\telse if(!corner.string) {\r\n\t\t\tcorner = new CORNER(corner);\r\n\t\t\tcorner.fixed = TRUE;\r\n\t\t}\r\n\r\n\t\treturn corner;\r\n\t},\r\n\r\n\t_parseWidth: function(corner, side, use) {\r\n\t\tvar elements = this.qtip.elements,\r\n\t\t\tprop = BORDER + camel(side) + 'Width';\r\n\r\n\t\treturn (use ? intCss(use, prop) : (\r\n\t\t\tintCss(elements.content, prop) ||\r\n\t\t\tintCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) ||\r\n\t\t\tintCss(elements.tooltip, prop)\r\n\t\t)) || 0;\r\n\t},\r\n\r\n\t_parseRadius: function(corner) {\r\n\t\tvar elements = this.qtip.elements,\r\n\t\t\tprop = BORDER + camel(corner.y) + camel(corner.x) + 'Radius';\r\n\r\n\t\treturn BROWSER.ie < 9 ? 0 :\r\n\t\t\tintCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) ||\r\n\t\t\tintCss(elements.tooltip, prop) || 0;\r\n\t},\r\n\r\n\t_invalidColour: function(elem, prop, compare) {\r\n\t\tvar val = elem.css(prop);\r\n\t\treturn !val || (compare && val === elem.css(compare)) || INVALID.test(val) ? FALSE : val;\r\n\t},\r\n\r\n\t_parseColours: function(corner) {\r\n\t\tvar elements = this.qtip.elements,\r\n\t\t\ttip = this.element.css('cssText', ''),\r\n\t\t\tborderSide = BORDER + camel(corner[ corner.precedance ]) + camel(COLOR),\r\n\t\t\tcolorElem = this._useTitle(corner) && elements.titlebar || elements.content,\r\n\t\t\tcss = this._invalidColour, color = [];\r\n\r\n\t\t// Attempt to detect the background colour from various elements, left-to-right precedance\r\n\t\tcolor[0] = css(tip, BG_COLOR) || css(colorElem, BG_COLOR) || css(elements.content, BG_COLOR) ||\r\n\t\t\tcss(elements.tooltip, BG_COLOR) || tip.css(BG_COLOR);\r\n\r\n\t\t// Attempt to detect the correct border side colour from various elements, left-to-right precedance\r\n\t\tcolor[1] = css(tip, borderSide, COLOR) || css(colorElem, borderSide, COLOR) ||\r\n\t\t\tcss(elements.content, borderSide, COLOR) || css(elements.tooltip, borderSide, COLOR) || elements.tooltip.css(borderSide);\r\n\r\n\t\t// Reset background and border colours\r\n\t\t$('*', tip).add(tip).css('cssText', BG_COLOR+':'+TRANSPARENT+IMPORTANT+';'+BORDER+':0'+IMPORTANT+';');\r\n\r\n\t\treturn color;\r\n\t},\r\n\r\n\t_calculateSize: function(corner) {\r\n\t\tvar y = corner.precedance === Y,\r\n\t\t\twidth = this.options['width'],\r\n\t\t\theight = this.options['height'],\r\n\t\t\tisCenter = corner.abbrev() === 'c',\r\n\t\t\tbase = (y ? width: height) * (isCenter ? 0.5 : 1),\r\n\t\t\tpow = Math.pow,\r\n\t\t\tround = Math.round,\r\n\t\t\tbigHyp, ratio, result,\r\n\r\n\t\tsmallHyp = Math.sqrt( pow(base, 2) + pow(height, 2) ),\r\n\t\thyp = [ (this.border / base) * smallHyp, (this.border / height) * smallHyp ];\r\n\r\n\t\thyp[2] = Math.sqrt( pow(hyp[0], 2) - pow(this.border, 2) );\r\n\t\thyp[3] = Math.sqrt( pow(hyp[1], 2) - pow(this.border, 2) );\r\n\r\n\t\tbigHyp = smallHyp + hyp[2] + hyp[3] + (isCenter ? 0 : hyp[0]);\r\n\t\tratio = bigHyp / smallHyp;\r\n\r\n\t\tresult = [ round(ratio * width), round(ratio * height) ];\r\n\t\treturn y ? result : result.reverse();\r\n\t},\r\n\r\n\t// Tip coordinates calculator\r\n\t_calculateTip: function(corner, size, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tsize = size || this.size;\r\n\r\n\t\tvar width = size[0] * scale,\r\n\t\t\theight = size[1] * scale,\r\n\t\t\twidth2 = Math.ceil(width / 2), height2 = Math.ceil(height / 2),\r\n\r\n\t\t// Define tip coordinates in terms of height and width values\r\n\t\ttips = {\r\n\t\t\tbr:\t[0,0,\t\twidth,height,\twidth,0],\r\n\t\t\tbl:\t[0,0,\t\twidth,0,\t\t0,height],\r\n\t\t\ttr:\t[0,height,\twidth,0,\t\twidth,height],\r\n\t\t\ttl:\t[0,0,\t\t0,height,\t\twidth,height],\r\n\t\t\ttc:\t[0,height,\twidth2,0,\t\twidth,height],\r\n\t\t\tbc:\t[0,0,\t\twidth,0,\t\twidth2,height],\r\n\t\t\trc:\t[0,0,\t\twidth,height2,\t0,height],\r\n\t\t\tlc:\t[width,0,\twidth,height,\t0,height2]\r\n\t\t};\r\n\r\n\t\t// Set common side shapes\r\n\t\ttips.lt = tips.br; tips.rt = tips.bl;\r\n\t\ttips.lb = tips.tr; tips.rb = tips.tl;\r\n\r\n\t\treturn tips[ corner.abbrev() ];\r\n\t},\r\n\r\n\t// Tip coordinates drawer (canvas)\r\n\t_drawCoords: function(context, coords) {\r\n\t\tcontext.beginPath();\r\n\t\tcontext.moveTo(coords[0], coords[1]);\r\n\t\tcontext.lineTo(coords[2], coords[3]);\r\n\t\tcontext.lineTo(coords[4], coords[5]);\r\n\t\tcontext.closePath();\r\n\t},\r\n\r\n\tcreate: function() {\r\n\t\t// Determine tip corner\r\n\t\tvar c = this.corner = (HASCANVAS || BROWSER.ie) && this._parseCorner(this.options.corner);\r\n\r\n\t\t// If we have a tip corner...\r\n\t\tif( (this.enabled = !!this.corner && this.corner.abbrev() !== 'c') ) {\r\n\t\t\t// Cache it\r\n\t\t\tthis.qtip.cache.corner = c.clone();\r\n\r\n\t\t\t// Create it\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\t// Toggle tip element\r\n\t\tthis.element.toggle(this.enabled);\r\n\r\n\t\treturn this.corner;\r\n\t},\r\n\r\n\tupdate: function(corner, position) {\r\n\t\tif(!this.enabled) { return this; }\r\n\r\n\t\tvar elements = this.qtip.elements,\r\n\t\t\ttip = this.element,\r\n\t\t\tinner = tip.children(),\r\n\t\t\toptions = this.options,\r\n\t\t\tcurSize = this.size,\r\n\t\t\tmimic = options.mimic,\r\n\t\t\tround = Math.round,\r\n\t\t\tcolor, precedance, context,\r\n\t\t\tcoords, bigCoords, translate, newSize, border, BACKING_STORE_RATIO;\r\n\r\n\t\t// Re-determine tip if not already set\r\n\t\tif(!corner) { corner = this.qtip.cache.corner || this.corner; }\r\n\r\n\t\t// Use corner property if we detect an invalid mimic value\r\n\t\tif(mimic === FALSE) { mimic = corner; }\r\n\r\n\t\t// Otherwise inherit mimic properties from the corner object as necessary\r\n\t\telse {\r\n\t\t\tmimic = new CORNER(mimic);\r\n\t\t\tmimic.precedance = corner.precedance;\r\n\r\n\t\t\tif(mimic.x === 'inherit') { mimic.x = corner.x; }\r\n\t\t\telse if(mimic.y === 'inherit') { mimic.y = corner.y; }\r\n\t\t\telse if(mimic.x === mimic.y) {\r\n\t\t\t\tmimic[ corner.precedance ] = corner[ corner.precedance ];\r\n\t\t\t}\r\n\t\t}\r\n\t\tprecedance = mimic.precedance;\r\n\r\n\t\t// Ensure the tip width.height are relative to the tip position\r\n\t\tif(corner.precedance === X) { this._swapDimensions(); }\r\n\t\telse { this._resetDimensions(); }\r\n\r\n\t\t// Update our colours\r\n\t\tcolor = this.color = this._parseColours(corner);\r\n\r\n\t\t// Detect border width, taking into account colours\r\n\t\tif(color[1] !== TRANSPARENT) {\r\n\t\t\t// Grab border width\r\n\t\t\tborder = this.border = this._parseWidth(corner, corner[corner.precedance]);\r\n\r\n\t\t\t// If border width isn't zero, use border color as fill if it's not invalid (1.0 style tips)\r\n\t\t\tif(options.border && border < 1 && !INVALID.test(color[1])) { color[0] = color[1]; }\r\n\r\n\t\t\t// Set border width (use detected border width if options.border is true)\r\n\t\t\tthis.border = border = options.border !== TRUE ? options.border : border;\r\n\t\t}\r\n\r\n\t\t// Border colour was invalid, set border to zero\r\n\t\telse { this.border = border = 0; }\r\n\r\n\t\t// Determine tip size\r\n\t\tnewSize = this.size = this._calculateSize(corner);\r\n\t\ttip.css({\r\n\t\t\twidth: newSize[0],\r\n\t\t\theight: newSize[1],\r\n\t\t\tlineHeight: newSize[1]+'px'\r\n\t\t});\r\n\r\n\t\t// Calculate tip translation\r\n\t\tif(corner.precedance === Y) {\r\n\t\t\ttranslate = [\r\n\t\t\t\tround(mimic.x === LEFT ? border : mimic.x === RIGHT ? newSize[0] - curSize[0] - border : (newSize[0] - curSize[0]) / 2),\r\n\t\t\t\tround(mimic.y === TOP ? newSize[1] - curSize[1] : 0)\r\n\t\t\t];\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttranslate = [\r\n\t\t\t\tround(mimic.x === LEFT ? newSize[0] - curSize[0] : 0),\r\n\t\t\t\tround(mimic.y === TOP ? border : mimic.y === BOTTOM ? newSize[1] - curSize[1] - border : (newSize[1] - curSize[1]) / 2)\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\t// Canvas drawing implementation\r\n\t\tif(HASCANVAS) {\r\n\t\t\t// Grab canvas context and clear/save it\r\n\t\t\tcontext = inner[0].getContext('2d');\r\n\t\t\tcontext.restore(); context.save();\r\n\t\t\tcontext.clearRect(0,0,6000,6000);\r\n\r\n\t\t\t// Calculate coordinates\r\n\t\t\tcoords = this._calculateTip(mimic, curSize, SCALE);\r\n\t\t\tbigCoords = this._calculateTip(mimic, this.size, SCALE);\r\n\r\n\t\t\t// Set the canvas size using calculated size\r\n\t\t\tinner.attr(WIDTH, newSize[0] * SCALE).attr(HEIGHT, newSize[1] * SCALE);\r\n\t\t\tinner.css(WIDTH, newSize[0]).css(HEIGHT, newSize[1]);\r\n\r\n\t\t\t// Draw the outer-stroke tip\r\n\t\t\tthis._drawCoords(context, bigCoords);\r\n\t\t\tcontext.fillStyle = color[1];\r\n\t\t\tcontext.fill();\r\n\r\n\t\t\t// Draw the actual tip\r\n\t\t\tcontext.translate(translate[0] * SCALE, translate[1] * SCALE);\r\n\t\t\tthis._drawCoords(context, coords);\r\n\t\t\tcontext.fillStyle = color[0];\r\n\t\t\tcontext.fill();\r\n\t\t}\r\n\r\n\t\t// VML (IE Proprietary implementation)\r\n\t\telse {\r\n\t\t\t// Calculate coordinates\r\n\t\t\tcoords = this._calculateTip(mimic);\r\n\r\n\t\t\t// Setup coordinates string\r\n\t\t\tcoords = 'm' + coords[0] + ',' + coords[1] + ' l' + coords[2] +\r\n\t\t\t\t',' + coords[3] + ' ' + coords[4] + ',' + coords[5] + ' xe';\r\n\r\n\t\t\t// Setup VML-specific offset for pixel-perfection\r\n\t\t\ttranslate[2] = border && /^(r|b)/i.test(corner.string()) ?\r\n\t\t\t\tBROWSER.ie === 8 ? 2 : 1 : 0;\r\n\r\n\t\t\t// Set initial CSS\r\n\t\t\tinner.css({\r\n\t\t\t\tcoordsize: (newSize[0]+border) + ' ' + (newSize[1]+border),\r\n\t\t\t\tantialias: ''+(mimic.string().indexOf(CENTER) > -1),\r\n\t\t\t\tleft: translate[0] - (translate[2] * Number(precedance === X)),\r\n\t\t\t\ttop: translate[1] - (translate[2] * Number(precedance === Y)),\r\n\t\t\t\twidth: newSize[0] + border,\r\n\t\t\t\theight: newSize[1] + border\r\n\t\t\t})\r\n\t\t\t.each(function(i) {\r\n\t\t\t\tvar $this = $(this);\r\n\r\n\t\t\t\t// Set shape specific attributes\r\n\t\t\t\t$this[ $this.prop ? 'prop' : 'attr' ]({\r\n\t\t\t\t\tcoordsize: (newSize[0]+border) + ' ' + (newSize[1]+border),\r\n\t\t\t\t\tpath: coords,\r\n\t\t\t\t\tfillcolor: color[0],\r\n\t\t\t\t\tfilled: !!i,\r\n\t\t\t\t\tstroked: !i\r\n\t\t\t\t})\r\n\t\t\t\t.toggle(!!(border || i));\r\n\r\n\t\t\t\t// Check if border is enabled and add stroke element\r\n\t\t\t\t!i && $this.html( createVML(\r\n\t\t\t\t\t'stroke', 'weight=\"'+(border*2)+'px\" color=\"'+color[1]+'\" miterlimit=\"1000\" joinstyle=\"miter\"'\r\n\t\t\t\t) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Opera bug #357 - Incorrect tip position\r\n\t\t// https://github.com/Craga89/qTip2/issues/367\r\n\t\twindow.opera && setTimeout(function() {\r\n\t\t\telements.tip.css({\r\n\t\t\t\tdisplay: 'inline-block',\r\n\t\t\t\tvisibility: 'visible'\r\n\t\t\t});\r\n\t\t}, 1);\r\n\r\n\t\t// Position if needed\r\n\t\tif(position !== FALSE) { this.calculate(corner, newSize); }\r\n\t},\r\n\r\n\tcalculate: function(corner, size) {\r\n\t\tif(!this.enabled) { return FALSE; }\r\n\r\n\t\tvar self = this,\r\n\t\t\telements = this.qtip.elements,\r\n\t\t\ttip = this.element,\r\n\t\t\tuserOffset = this.options.offset,\r\n\t\t\tisWidget = elements.tooltip.hasClass('ui-widget'),\r\n\t\t\tposition = {  },\r\n\t\t\tprecedance, corners;\r\n\r\n\t\t// Inherit corner if not provided\r\n\t\tcorner = corner || this.corner;\r\n\t\tprecedance = corner.precedance;\r\n\r\n\t\t// Determine which tip dimension to use for adjustment\r\n\t\tsize = size || this._calculateSize(corner);\r\n\r\n\t\t// Setup corners and offset array\r\n\t\tcorners = [ corner.x, corner.y ];\r\n\t\tif(precedance === X) { corners.reverse(); }\r\n\r\n\t\t// Calculate tip position\r\n\t\t$.each(corners, function(i, side) {\r\n\t\t\tvar b, bc, br;\r\n\r\n\t\t\tif(side === CENTER) {\r\n\t\t\t\tb = precedance === Y ? LEFT : TOP;\r\n\t\t\t\tposition[ b ] = '50%';\r\n\t\t\t\tposition[MARGIN+'-' + b] = -Math.round(size[ precedance === Y ? 0 : 1 ] / 2) + userOffset;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tb = self._parseWidth(corner, side, elements.tooltip);\r\n\t\t\t\tbc = self._parseWidth(corner, side, elements.content);\r\n\t\t\t\tbr = self._parseRadius(corner);\r\n\r\n\t\t\t\tposition[ side ] = Math.max(-self.border, i ? bc : (userOffset + (br > b ? br : -b)));\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Adjust for tip size\r\n\t\tposition[ corner[precedance] ] -= size[ precedance === X ? 0 : 1 ];\r\n\r\n\t\t// Set and return new position\r\n\t\ttip.css({ margin: '', top: '', bottom: '', left: '', right: '' }).css(position);\r\n\t\treturn position;\r\n\t},\r\n\r\n\treposition: function(event, api, pos, viewport) {\r\n\t\tif(!this.enabled) { return; }\r\n\r\n\t\tvar cache = api.cache,\r\n\t\t\tnewCorner = this.corner.clone(),\r\n\t\t\tadjust = pos.adjusted,\r\n\t\t\tmethod = api.options.position.adjust.method.split(' '),\r\n\t\t\thorizontal = method[0],\r\n\t\t\tvertical = method[1] || method[0],\r\n\t\t\tshift = { left: FALSE, top: FALSE, x: 0, y: 0 },\r\n\t\t\toffset, css = {}, props;\r\n\r\n\t\tfunction shiftflip(direction, precedance, popposite, side, opposite) {\r\n\t\t\t// Horizontal - Shift or flip method\r\n\t\t\tif(direction === SHIFT && newCorner.precedance === precedance && adjust[side] && newCorner[popposite] !== CENTER) {\r\n\t\t\t\tnewCorner.precedance = newCorner.precedance === X ? Y : X;\r\n\t\t\t}\r\n\t\t\telse if(direction !== SHIFT && adjust[side]){\r\n\t\t\t\tnewCorner[precedance] = newCorner[precedance] === CENTER ?\r\n\t\t\t\t\t(adjust[side] > 0 ? side : opposite) : (newCorner[precedance] === side ? opposite : side);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction shiftonly(xy, side, opposite) {\r\n\t\t\tif(newCorner[xy] === CENTER) {\r\n\t\t\t\tcss[MARGIN+'-'+side] = shift[xy] = offset[MARGIN+'-'+side] - adjust[side];\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tprops = offset[opposite] !== undefined ?\r\n\t\t\t\t\t[ adjust[side], -offset[side] ] : [ -adjust[side], offset[side] ];\r\n\r\n\t\t\t\tif( (shift[xy] = Math.max(props[0], props[1])) > props[0] ) {\r\n\t\t\t\t\tpos[side] -= adjust[side];\r\n\t\t\t\t\tshift[side] = FALSE;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcss[ offset[opposite] !== undefined ? opposite : side ] = shift[xy];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If our tip position isn't fixed e.g. doesn't adjust with viewport...\r\n\t\tif(this.corner.fixed !== TRUE) {\r\n\t\t\t// Perform shift/flip adjustments\r\n\t\t\tshiftflip(horizontal, X, Y, LEFT, RIGHT);\r\n\t\t\tshiftflip(vertical, Y, X, TOP, BOTTOM);\r\n\r\n\t\t\t// Update and redraw the tip if needed (check cached details of last drawn tip)\r\n\t\t\tif(newCorner.string() !== cache.corner.string() || cache.cornerTop !== adjust.top || cache.cornerLeft !== adjust.left) {\r\n\t\t\t\tthis.update(newCorner, FALSE);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Setup tip offset properties\r\n\t\toffset = this.calculate(newCorner);\r\n\r\n\t\t// Readjust offset object to make it left/top\r\n\t\tif(offset.right !== undefined) { offset.left = -offset.right; }\r\n\t\tif(offset.bottom !== undefined) { offset.top = -offset.bottom; }\r\n\t\toffset.user = this.offset;\r\n\r\n\t\t// Perform shift adjustments\r\n\t\tif(shift.left = (horizontal === SHIFT && !!adjust.left)) { shiftonly(X, LEFT, RIGHT); }\r\n\t\tif(shift.top = (vertical === SHIFT && !!adjust.top)) { shiftonly(Y, TOP, BOTTOM); }\r\n\r\n\t\t/*\r\n\t\t* If the tip is adjusted in both dimensions, or in a\r\n\t\t* direction that would cause it to be anywhere but the\r\n\t\t* outer border, hide it!\r\n\t\t*/\r\n\t\tthis.element.css(css).toggle(\r\n\t\t\t!((shift.x && shift.y) || (newCorner.x === CENTER && shift.y) || (newCorner.y === CENTER && shift.x))\r\n\t\t);\r\n\r\n\t\t// Adjust position to accomodate tip dimensions\r\n\t\tpos.left -= offset.left.charAt ? offset.user :\r\n\t\t\thorizontal !== SHIFT || shift.top || !shift.left && !shift.top ? offset.left + this.border : 0;\r\n\t\tpos.top -= offset.top.charAt ? offset.user :\r\n\t\t\tvertical !== SHIFT || shift.left || !shift.left && !shift.top ? offset.top + this.border : 0;\r\n\r\n\t\t// Cache details\r\n\t\tcache.cornerLeft = adjust.left; cache.cornerTop = adjust.top;\r\n\t\tcache.corner = newCorner.clone();\r\n\t},\r\n\r\n\tdestroy: function() {\r\n\t\t// Unbind events\r\n\t\tthis.qtip._unbind(this.qtip.tooltip, this._ns);\r\n\r\n\t\t// Remove the tip element(s)\r\n\t\tif(this.qtip.elements.tip) {\r\n\t\t\tthis.qtip.elements.tip.find('*')\r\n\t\t\t\t.remove().end().remove();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nTIP = PLUGINS.tip = function(api) {\r\n\treturn new Tip(api, api.options.style.tip);\r\n};\r\n\r\n// Initialize tip on render\r\nTIP.initialize = 'render';\r\n\r\n// Setup plugin sanitization options\r\nTIP.sanitize = function(options) {\r\n\tif(options.style && 'tip' in options.style) {\r\n\t\tvar opts = options.style.tip;\r\n\t\tif(typeof opts !== 'object') { opts = options.style.tip = { corner: opts }; }\r\n\t\tif(!(/string|boolean/i).test(typeof opts.corner)) { opts.corner = TRUE; }\r\n\t}\r\n};\r\n\r\n// Add new option checks for the plugin\r\nCHECKS.tip = {\r\n\t'^position.my|style.tip.(corner|mimic|border)$': function() {\r\n\t\t// Make sure a tip can be drawn\r\n\t\tthis.create();\r\n\r\n\t\t// Reposition the tooltip\r\n\t\tthis.qtip.reposition();\r\n\t},\r\n\t'^style.tip.(height|width)$': function(obj) {\r\n\t\t// Re-set dimensions and redraw the tip\r\n\t\tthis.size = [ obj.width, obj.height ];\r\n\t\tthis.update();\r\n\r\n\t\t// Reposition the tooltip\r\n\t\tthis.qtip.reposition();\r\n\t},\r\n\t'^content.title|style.(classes|widget)$': function() {\r\n\t\tthis.update();\r\n\t}\r\n};\r\n\r\n// Extend original qTip defaults\r\n$.extend(TRUE, QTIP.defaults, {\r\n\tstyle: {\r\n\t\ttip: {\r\n\t\t\tcorner: TRUE,\r\n\t\t\tmimic: FALSE,\r\n\t\t\twidth: 6,\r\n\t\t\theight: 6,\r\n\t\t\tborder: TRUE,\r\n\t\t\toffset: 0\r\n\t\t}\r\n\t}\r\n});\r\n;PLUGINS.viewport = function(api, position, posOptions, targetWidth, targetHeight, elemWidth, elemHeight)\r\n{\r\n\tvar target = posOptions.target,\r\n\t\ttooltip = api.elements.tooltip,\r\n\t\tmy = posOptions.my,\r\n\t\tat = posOptions.at,\r\n\t\tadjust = posOptions.adjust,\r\n\t\tmethod = adjust.method.split(' '),\r\n\t\tmethodX = method[0],\r\n\t\tmethodY = method[1] || method[0],\r\n\t\tviewport = posOptions.viewport,\r\n\t\tcontainer = posOptions.container,\r\n\t\tcache = api.cache,\r\n\t\tadjusted = { left: 0, top: 0 },\r\n\t\tfixed, newMy, containerOffset, containerStatic,\r\n\t\tviewportWidth, viewportHeight, viewportScroll, viewportOffset;\r\n\r\n\t// If viewport is not a jQuery element, or it's the window/document, or no adjustment method is used... return\r\n\tif(!viewport.jquery || target[0] === window || target[0] === document.body || adjust.method === 'none') {\r\n\t\treturn adjusted;\r\n\t}\r\n\r\n\t// Cach container details\r\n\tcontainerOffset = container.offset() || adjusted;\r\n\tcontainerStatic = container.css('position') === 'static';\r\n\r\n\t// Cache our viewport details\r\n\tfixed = tooltip.css('position') === 'fixed';\r\n\tviewportWidth = viewport[0] === window ? viewport.width() : viewport.outerWidth(FALSE);\r\n\tviewportHeight = viewport[0] === window ? viewport.height() : viewport.outerHeight(FALSE);\r\n\tviewportScroll = { left: fixed ? 0 : viewport.scrollLeft(), top: fixed ? 0 : viewport.scrollTop() };\r\n\tviewportOffset = viewport.offset() || adjusted;\r\n\r\n\t// Generic calculation method\r\n\tfunction calculate(side, otherSide, type, adjust, side1, side2, lengthName, targetLength, elemLength) {\r\n\t\tvar initialPos = position[side1],\r\n\t\t\tmySide = my[side],\r\n\t\t\tatSide = at[side],\r\n\t\t\tisShift = type === SHIFT,\r\n\t\t\tmyLength = mySide === side1 ? elemLength : mySide === side2 ? -elemLength : -elemLength / 2,\r\n\t\t\tatLength = atSide === side1 ? targetLength : atSide === side2 ? -targetLength : -targetLength / 2,\r\n\t\t\tsideOffset = viewportScroll[side1] + viewportOffset[side1] - (containerStatic ? 0 : containerOffset[side1]),\r\n\t\t\toverflow1 = sideOffset - initialPos,\r\n\t\t\toverflow2 = initialPos + elemLength - (lengthName === WIDTH ? viewportWidth : viewportHeight) - sideOffset,\r\n\t\t\toffset = myLength - (my.precedance === side || mySide === my[otherSide] ? atLength : 0) - (atSide === CENTER ? targetLength / 2 : 0);\r\n\r\n\t\t// shift\r\n\t\tif(isShift) {\r\n\t\t\toffset = (mySide === side1 ? 1 : -1) * myLength;\r\n\r\n\t\t\t// Adjust position but keep it within viewport dimensions\r\n\t\t\tposition[side1] += overflow1 > 0 ? overflow1 : overflow2 > 0 ? -overflow2 : 0;\r\n\t\t\tposition[side1] = Math.max(\r\n\t\t\t\t-containerOffset[side1] + viewportOffset[side1],\r\n\t\t\t\tinitialPos - offset,\r\n\t\t\t\tMath.min(\r\n\t\t\t\t\tMath.max(\r\n\t\t\t\t\t\t-containerOffset[side1] + viewportOffset[side1] + (lengthName === WIDTH ? viewportWidth : viewportHeight),\r\n\t\t\t\t\t\tinitialPos + offset\r\n\t\t\t\t\t),\r\n\t\t\t\t\tposition[side1],\r\n\r\n\t\t\t\t\t// Make sure we don't adjust complete off the element when using 'center'\r\n\t\t\t\t\tmySide === 'center' ? initialPos - myLength : 1E9\r\n\t\t\t\t)\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\t// flip/flipinvert\r\n\t\telse {\r\n\t\t\t// Update adjustment amount depending on if using flipinvert or flip\r\n\t\t\tadjust *= (type === FLIPINVERT ? 2 : 0);\r\n\r\n\t\t\t// Check for overflow on the left/top\r\n\t\t\tif(overflow1 > 0 && (mySide !== side1 || overflow2 > 0)) {\r\n\t\t\t\tposition[side1] -= offset + adjust;\r\n\t\t\t\tnewMy.invert(side, side1);\r\n\t\t\t}\r\n\r\n\t\t\t// Check for overflow on the bottom/right\r\n\t\t\telse if(overflow2 > 0 && (mySide !== side2 || overflow1 > 0)  ) {\r\n\t\t\t\tposition[side1] -= (mySide === CENTER ? -offset : offset) + adjust;\r\n\t\t\t\tnewMy.invert(side, side2);\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure we haven't made things worse with the adjustment and reset if so\r\n\t\t\tif(position[side1] < viewportScroll && -position[side1] > overflow2) {\r\n\t\t\t\tposition[side1] = initialPos; newMy = my.clone();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn position[side1] - initialPos;\r\n\t}\r\n\r\n\t// Set newMy if using flip or flipinvert methods\r\n\tif(methodX !== 'shift' || methodY !== 'shift') { newMy = my.clone(); }\r\n\r\n\t// Adjust position based onviewport and adjustment options\r\n\tadjusted = {\r\n\t\tleft: methodX !== 'none' ? calculate( X, Y, methodX, adjust.x, LEFT, RIGHT, WIDTH, targetWidth, elemWidth ) : 0,\r\n\t\ttop: methodY !== 'none' ? calculate( Y, X, methodY, adjust.y, TOP, BOTTOM, HEIGHT, targetHeight, elemHeight ) : 0,\r\n\t\tmy: newMy\r\n\t};\r\n\r\n\treturn adjusted;\r\n};\r\n;PLUGINS.polys = {\r\n\t// POLY area coordinate calculator\r\n\t//\tSpecial thanks to Ed Cradock for helping out with this.\r\n\t//\tUses a binary search algorithm to find suitable coordinates.\r\n\tpolygon: function(baseCoords, corner) {\r\n\t\tvar result = {\r\n\t\t\twidth: 0, height: 0,\r\n\t\t\tposition: {\r\n\t\t\t\ttop: 1e10, right: 0,\r\n\t\t\t\tbottom: 0, left: 1e10\r\n\t\t\t},\r\n\t\t\tadjustable: FALSE\r\n\t\t},\r\n\t\ti = 0, next,\r\n\t\tcoords = [],\r\n\t\tcompareX = 1, compareY = 1,\r\n\t\trealX = 0, realY = 0,\r\n\t\tnewWidth, newHeight;\r\n\r\n\t\t// First pass, sanitize coords and determine outer edges\r\n\t\ti = baseCoords.length; while(i--) {\r\n\t\t\tnext = [ parseInt(baseCoords[--i], 10), parseInt(baseCoords[i+1], 10) ];\r\n\r\n\t\t\tif(next[0] > result.position.right){ result.position.right = next[0]; }\r\n\t\t\tif(next[0] < result.position.left){ result.position.left = next[0]; }\r\n\t\t\tif(next[1] > result.position.bottom){ result.position.bottom = next[1]; }\r\n\t\t\tif(next[1] < result.position.top){ result.position.top = next[1]; }\r\n\r\n\t\t\tcoords.push(next);\r\n\t\t}\r\n\r\n\t\t// Calculate height and width from outer edges\r\n\t\tnewWidth = result.width = Math.abs(result.position.right - result.position.left);\r\n\t\tnewHeight = result.height = Math.abs(result.position.bottom - result.position.top);\r\n\r\n\t\t// If it's the center corner...\r\n\t\tif(corner.abbrev() === 'c') {\r\n\t\t\tresult.position = {\r\n\t\t\t\tleft: result.position.left + (result.width / 2),\r\n\t\t\t\ttop: result.position.top + (result.height / 2)\r\n\t\t\t};\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// Second pass, use a binary search algorithm to locate most suitable coordinate\r\n\t\t\twhile(newWidth > 0 && newHeight > 0 && compareX > 0 && compareY > 0)\r\n\t\t\t{\r\n\t\t\t\tnewWidth = Math.floor(newWidth / 2);\r\n\t\t\t\tnewHeight = Math.floor(newHeight / 2);\r\n\r\n\t\t\t\tif(corner.x === LEFT){ compareX = newWidth; }\r\n\t\t\t\telse if(corner.x === RIGHT){ compareX = result.width - newWidth; }\r\n\t\t\t\telse{ compareX += Math.floor(newWidth / 2); }\r\n\r\n\t\t\t\tif(corner.y === TOP){ compareY = newHeight; }\r\n\t\t\t\telse if(corner.y === BOTTOM){ compareY = result.height - newHeight; }\r\n\t\t\t\telse{ compareY += Math.floor(newHeight / 2); }\r\n\r\n\t\t\t\ti = coords.length; while(i--)\r\n\t\t\t\t{\r\n\t\t\t\t\tif(coords.length < 2){ break; }\r\n\r\n\t\t\t\t\trealX = coords[i][0] - result.position.left;\r\n\t\t\t\t\trealY = coords[i][1] - result.position.top;\r\n\r\n\t\t\t\t\tif((corner.x === LEFT && realX >= compareX) ||\r\n\t\t\t\t\t(corner.x === RIGHT && realX <= compareX) ||\r\n\t\t\t\t\t(corner.x === CENTER && (realX < compareX || realX > (result.width - compareX))) ||\r\n\t\t\t\t\t(corner.y === TOP && realY >= compareY) ||\r\n\t\t\t\t\t(corner.y === BOTTOM && realY <= compareY) ||\r\n\t\t\t\t\t(corner.y === CENTER && (realY < compareY || realY > (result.height - compareY)))) {\r\n\t\t\t\t\t\tcoords.splice(i, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tresult.position = { left: coords[0][0], top: coords[0][1] };\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t},\r\n\r\n\trect: function(ax, ay, bx, by) {\r\n\t\treturn {\r\n\t\t\twidth: Math.abs(bx - ax),\r\n\t\t\theight: Math.abs(by - ay),\r\n\t\t\tposition: {\r\n\t\t\t\tleft: Math.min(ax, bx),\r\n\t\t\t\ttop: Math.min(ay, by)\r\n\t\t\t}\r\n\t\t};\r\n\t},\r\n\r\n\t_angles: {\r\n\t\ttc: 3 / 2, tr: 7 / 4, tl: 5 / 4,\r\n\t\tbc: 1 / 2, br: 1 / 4, bl: 3 / 4,\r\n\t\trc: 2, lc: 1, c: 0\r\n\t},\r\n\tellipse: function(cx, cy, rx, ry, corner) {\r\n\t\tvar c = PLUGINS.polys._angles[ corner.abbrev() ],\r\n\t\t\trxc = c === 0 ? 0 : rx * Math.cos( c * Math.PI ),\r\n\t\t\trys = ry * Math.sin( c * Math.PI );\r\n\r\n\t\treturn {\r\n\t\t\twidth: (rx * 2) - Math.abs(rxc),\r\n\t\t\theight: (ry * 2) - Math.abs(rys),\r\n\t\t\tposition: {\r\n\t\t\t\tleft: cx + rxc,\r\n\t\t\t\ttop: cy + rys\r\n\t\t\t},\r\n\t\t\tadjustable: FALSE\r\n\t\t};\r\n\t},\r\n\tcircle: function(cx, cy, r, corner) {\r\n\t\treturn PLUGINS.polys.ellipse(cx, cy, r, r, corner);\r\n\t}\r\n};\r\n;PLUGINS.imagemap = function(api, area, corner, adjustMethod)\r\n{\r\n\tif(!area.jquery) { area = $(area); }\r\n\r\n\tvar shape = (area.attr('shape') || 'rect').toLowerCase().replace('poly', 'polygon'),\r\n\t\timage = $('img[usemap=\"#'+area.parent('map').attr('name')+'\"]'),\r\n\t\tcoordsString = $.trim(area.attr('coords')),\r\n\t\tcoordsArray = coordsString.replace(/,$/, '').split(','),\r\n\t\timageOffset, coords, i, next, result, len;\r\n\r\n\t// If we can't find the image using the map...\r\n\tif(!image.length) { return FALSE; }\r\n\r\n\t// Pass coordinates string if polygon\r\n\tif(shape === 'polygon') {\r\n\t\tresult = PLUGINS.polys.polygon(coordsArray, corner);\r\n\t}\r\n\r\n\t// Otherwise parse the coordinates and pass them as arguments\r\n\telse if(PLUGINS.polys[shape]) {\r\n\t\tfor(i = -1, len = coordsArray.length, coords = []; ++i < len;) {\r\n\t\t\tcoords.push( parseInt(coordsArray[i], 10) );\r\n\t\t}\r\n\r\n\t\tresult = PLUGINS.polys[shape].apply(\r\n\t\t\tthis, coords.concat(corner)\r\n\t\t);\r\n\t}\r\n\r\n\t// If no shapre calculation method was found, return false\r\n\telse { return FALSE; }\r\n\r\n\t// Make sure we account for padding and borders on the image\r\n\timageOffset = image.offset();\r\n\timageOffset.left += Math.ceil((image.outerWidth(FALSE) - image.width()) / 2);\r\n\timageOffset.top += Math.ceil((image.outerHeight(FALSE) - image.height()) / 2);\r\n\r\n\t// Add image position to offset coordinates\r\n\tresult.position.left += imageOffset.left;\r\n\tresult.position.top += imageOffset.top;\r\n\r\n\treturn result;\r\n};\r\n;var MODAL, OVERLAY,\r\n\tMODALCLASS = 'qtip-modal',\r\n\tMODALSELECTOR = '.'+MODALCLASS;\r\n\r\nOVERLAY = function()\r\n{\r\n\tvar self = this,\r\n\t\tfocusableElems = {},\r\n\t\tcurrent, onLast,\r\n\t\tprevState, elem;\r\n\r\n\t// Modified code from jQuery UI 1.10.0 source\r\n\t// http://code.jquery.com/ui/1.10.0/jquery-ui.js\r\n\tfunction focusable(element) {\r\n\t\t// Use the defined focusable checker when possible\r\n\t\tif($.expr[':'].focusable) { return $.expr[':'].focusable; }\r\n\r\n\t\tvar isTabIndexNotNaN = !isNaN($.attr(element, 'tabindex')),\r\n\t\t\tnodeName = element.nodeName && element.nodeName.toLowerCase(),\r\n\t\t\tmap, mapName, img;\r\n\r\n\t\tif('area' === nodeName) {\r\n\t\t\tmap = element.parentNode;\r\n\t\t\tmapName = map.name;\r\n\t\t\tif(!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\timg = $('img[usemap=#' + mapName + ']')[0];\r\n\t\t\treturn !!img && img.is(':visible');\r\n\t\t}\r\n\t\treturn (/input|select|textarea|button|object/.test( nodeName ) ?\r\n\t\t\t\t!element.disabled :\r\n\t\t\t\t'a' === nodeName ?\r\n\t\t\t\t\telement.href || isTabIndexNotNaN :\r\n\t\t\t\t\tisTabIndexNotNaN\r\n\t\t\t);\r\n\t}\r\n\r\n\t// Focus inputs using cached focusable elements (see update())\r\n\tfunction focusInputs(blurElems) {\r\n\t\t// Blurring body element in IE causes window.open windows to unfocus!\r\n\t\tif(focusableElems.length < 1 && blurElems.length) { blurElems.not('body').blur(); }\r\n\r\n\t\t// Focus the inputs\r\n\t\telse { focusableElems.first().focus(); }\r\n\t}\r\n\r\n\t// Steal focus from elements outside tooltip\r\n\tfunction stealFocus(event) {\r\n\t\tif(!elem.is(':visible')) { return; }\r\n\r\n\t\tvar target = $(event.target),\r\n\t\t\ttooltip = current.tooltip,\r\n\t\t\tcontainer = target.closest(SELECTOR),\r\n\t\t\ttargetOnTop;\r\n\r\n\t\t// Determine if input container target is above this\r\n\t\ttargetOnTop = container.length < 1 ? FALSE :\r\n\t\t\t(parseInt(container[0].style.zIndex, 10) > parseInt(tooltip[0].style.zIndex, 10));\r\n\r\n\t\t// If we're showing a modal, but focus has landed on an input below\r\n\t\t// this modal, divert focus to the first visible input in this modal\r\n\t\t// or if we can't find one... the tooltip itself\r\n\t\tif(!targetOnTop && target.closest(SELECTOR)[0] !== tooltip[0]) {\r\n\t\t\tfocusInputs(target);\r\n\t\t}\r\n\r\n\t\t// Detect when we leave the last focusable element...\r\n\t\tonLast = event.target === focusableElems[focusableElems.length - 1];\r\n\t}\r\n\r\n\t$.extend(self, {\r\n\t\tinit: function() {\r\n\t\t\t// Create document overlay\r\n\t\t\telem = self.elem = $('<div />', {\r\n\t\t\t\tid: 'qtip-overlay',\r\n\t\t\t\thtml: '<div></div>',\r\n\t\t\t\tmousedown: function() { return FALSE; }\r\n\t\t\t})\r\n\t\t\t.hide();\r\n\r\n\t\t\t// Make sure we can't focus anything outside the tooltip\r\n\t\t\t$(document.body).bind('focusin'+MODALSELECTOR, stealFocus);\r\n\r\n\t\t\t// Apply keyboard \"Escape key\" close handler\r\n\t\t\t$(document).bind('keydown'+MODALSELECTOR, function(event) {\r\n\t\t\t\tif(current && current.options.show.modal.escape && event.keyCode === 27) {\r\n\t\t\t\t\tcurrent.hide(event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Apply click handler for blur option\r\n\t\t\telem.bind('click'+MODALSELECTOR, function(event) {\r\n\t\t\t\tif(current && current.options.show.modal.blur) {\r\n\t\t\t\t\tcurrent.hide(event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn self;\r\n\t\t},\r\n\r\n\t\tupdate: function(api) {\r\n\t\t\t// Update current API reference\r\n\t\t\tcurrent = api;\r\n\r\n\t\t\t// Update focusable elements if enabled\r\n\t\t\tif(api.options.show.modal.stealfocus !== FALSE) {\r\n\t\t\t\tfocusableElems = api.tooltip.find('*').filter(function() {\r\n\t\t\t\t\treturn focusable(this);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse { focusableElems = []; }\r\n\t\t},\r\n\r\n\t\ttoggle: function(api, state, duration) {\r\n\t\t\tvar docBody = $(document.body),\r\n\t\t\t\ttooltip = api.tooltip,\r\n\t\t\t\toptions = api.options.show.modal,\r\n\t\t\t\teffect = options.effect,\r\n\t\t\t\ttype = state ? 'show': 'hide',\r\n\t\t\t\tvisible = elem.is(':visible'),\r\n\t\t\t\tvisibleModals = $(MODALSELECTOR).filter(':visible:not(:animated)').not(tooltip),\r\n\t\t\t\tzindex;\r\n\r\n\t\t\t// Set active tooltip API reference\r\n\t\t\tself.update(api);\r\n\r\n\t\t\t// If the modal can steal the focus...\r\n\t\t\t// Blur the current item and focus anything in the modal we an\r\n\t\t\tif(state && options.stealfocus !== FALSE) {\r\n\t\t\t\tfocusInputs( $(':focus') );\r\n\t\t\t}\r\n\r\n\t\t\t// Toggle backdrop cursor style on show\r\n\t\t\telem.toggleClass('blurs', options.blur);\r\n\r\n\t\t\t// Append to body on show\r\n\t\t\tif(state) {\r\n\t\t\t\telem.appendTo(document.body);\r\n\t\t\t}\r\n\r\n\t\t\t// Prevent modal from conflicting with show.solo, and don't hide backdrop is other modals are visible\r\n\t\t\tif((elem.is(':animated') && visible === state && prevState !== FALSE) || (!state && visibleModals.length)) {\r\n\t\t\t\treturn self;\r\n\t\t\t}\r\n\r\n\t\t\t// Stop all animations\r\n\t\t\telem.stop(TRUE, FALSE);\r\n\r\n\t\t\t// Use custom function if provided\r\n\t\t\tif($.isFunction(effect)) {\r\n\t\t\t\teffect.call(elem, state);\r\n\t\t\t}\r\n\r\n\t\t\t// If no effect type is supplied, use a simple toggle\r\n\t\t\telse if(effect === FALSE) {\r\n\t\t\t\telem[ type ]();\r\n\t\t\t}\r\n\r\n\t\t\t// Use basic fade function\r\n\t\t\telse {\r\n\t\t\t\telem.fadeTo( parseInt(duration, 10) || 90, state ? 1 : 0, function() {\r\n\t\t\t\t\tif(!state) { elem.hide(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Reset position and detach from body on hide\r\n\t\t\tif(!state) {\r\n\t\t\t\telem.queue(function(next) {\r\n\t\t\t\t\telem.css({ left: '', top: '' });\r\n\t\t\t\t\tif(!$(MODALSELECTOR).length) { elem.detach(); }\r\n\t\t\t\t\tnext();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Cache the state\r\n\t\t\tprevState = state;\r\n\r\n\t\t\t// If the tooltip is destroyed, set reference to null\r\n\t\t\tif(current.destroyed) { current = NULL; }\r\n\r\n\t\t\treturn self;\r\n\t\t}\r\n\t});\r\n\r\n\tself.init();\r\n};\r\nOVERLAY = new OVERLAY();\r\n\r\nfunction Modal(api, options) {\r\n\tthis.options = options;\r\n\tthis._ns = '-modal';\r\n\r\n\tthis.init( (this.qtip = api) );\r\n}\r\n\r\n$.extend(Modal.prototype, {\r\n\tinit: function(qtip) {\r\n\t\tvar tooltip = qtip.tooltip;\r\n\r\n\t\t// If modal is disabled... return\r\n\t\tif(!this.options.on) { return this; }\r\n\r\n\t\t// Set overlay reference\r\n\t\tqtip.elements.overlay = OVERLAY.elem;\r\n\r\n\t\t// Add unique attribute so we can grab modal tooltips easily via a SELECTOR, and set z-index\r\n\t\ttooltip.addClass(MODALCLASS).css('z-index', QTIP.modal_zindex + $(MODALSELECTOR).length);\r\n\r\n\t\t// Apply our show/hide/focus modal events\r\n\t\tqtip._bind(tooltip, ['tooltipshow', 'tooltiphide'], function(event, api, duration) {\r\n\t\t\tvar oEvent = event.originalEvent;\r\n\r\n\t\t\t// Make sure mouseout doesn't trigger a hide when showing the modal and mousing onto backdrop\r\n\t\t\tif(event.target === tooltip[0]) {\r\n\t\t\t\tif(oEvent && event.type === 'tooltiphide' && /mouse(leave|enter)/.test(oEvent.type) && $(oEvent.relatedTarget).closest(OVERLAY.elem[0]).length) {\r\n\t\t\t\t\ttry { event.preventDefault(); } catch(e) {}\r\n\t\t\t\t}\r\n\t\t\t\telse if(!oEvent || (oEvent && oEvent.type !== 'tooltipsolo')) {\r\n\t\t\t\t\tthis.toggle(event, event.type === 'tooltipshow', duration);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, this._ns, this);\r\n\r\n\t\t// Adjust modal z-index on tooltip focus\r\n\t\tqtip._bind(tooltip, 'tooltipfocus', function(event, api) {\r\n\t\t\t// If focus was cancelled before it reached us, don't do anything\r\n\t\t\tif(event.isDefaultPrevented() || event.target !== tooltip[0]) { return; }\r\n\r\n\t\t\tvar qtips = $(MODALSELECTOR),\r\n\r\n\t\t\t// Keep the modal's lower than other, regular qtips\r\n\t\t\tnewIndex = QTIP.modal_zindex + qtips.length,\r\n\t\t\tcurIndex = parseInt(tooltip[0].style.zIndex, 10);\r\n\r\n\t\t\t// Set overlay z-index\r\n\t\t\tOVERLAY.elem[0].style.zIndex = newIndex - 1;\r\n\r\n\t\t\t// Reduce modal z-index's and keep them properly ordered\r\n\t\t\tqtips.each(function() {\r\n\t\t\t\tif(this.style.zIndex > curIndex) {\r\n\t\t\t\t\tthis.style.zIndex -= 1;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Fire blur event for focused tooltip\r\n\t\t\tqtips.filter('.' + CLASS_FOCUS).qtip('blur', event.originalEvent);\r\n\r\n\t\t\t// Set the new z-index\r\n\t\t\ttooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex;\r\n\r\n\t\t\t// Set current\r\n\t\t\tOVERLAY.update(api);\r\n\r\n\t\t\t// Prevent default handling\r\n\t\t\ttry { event.preventDefault(); } catch(e) {}\r\n\t\t}, this._ns, this);\r\n\r\n\t\t// Focus any other visible modals when this one hides\r\n\t\tqtip._bind(tooltip, 'tooltiphide', function(event) {\r\n\t\t\tif(event.target === tooltip[0]) {\r\n\t\t\t\t$(MODALSELECTOR).filter(':visible').not(tooltip).last().qtip('focus', event);\r\n\t\t\t}\r\n\t\t}, this._ns, this);\r\n\t},\r\n\r\n\ttoggle: function(event, state, duration) {\r\n\t\t// Make sure default event hasn't been prevented\r\n\t\tif(event && event.isDefaultPrevented()) { return this; }\r\n\r\n\t\t// Toggle it\r\n\t\tOVERLAY.toggle(this.qtip, !!state, duration);\r\n\t},\r\n\r\n\tdestroy: function() {\r\n\t\t// Remove modal class\r\n\t\tthis.qtip.tooltip.removeClass(MODALCLASS);\r\n\r\n\t\t// Remove bound events\r\n\t\tthis.qtip._unbind(this.qtip.tooltip, this._ns);\r\n\r\n\t\t// Delete element reference\r\n\t\tOVERLAY.toggle(this.qtip, FALSE);\r\n\t\tdelete this.qtip.elements.overlay;\r\n\t}\r\n});\r\n\r\n\r\nMODAL = PLUGINS.modal = function(api) {\r\n\treturn new Modal(api, api.options.show.modal);\r\n};\r\n\r\n// Setup sanitiztion rules\r\nMODAL.sanitize = function(opts) {\r\n\tif(opts.show) {\r\n\t\tif(typeof opts.show.modal !== 'object') { opts.show.modal = { on: !!opts.show.modal }; }\r\n\t\telse if(typeof opts.show.modal.on === 'undefined') { opts.show.modal.on = TRUE; }\r\n\t}\r\n};\r\n\r\n// Base z-index for all modal tooltips (use qTip core z-index as a base)\r\nQTIP.modal_zindex = QTIP.zindex - 200;\r\n\r\n// Plugin needs to be initialized on render\r\nMODAL.initialize = 'render';\r\n\r\n// Setup option set checks\r\nCHECKS.modal = {\r\n\t'^show.modal.(on|blur)$': function() {\r\n\t\t// Initialise\r\n\t\tthis.destroy();\r\n\t\tthis.init();\r\n\r\n\t\t// Show the modal if not visible already and tooltip is visible\r\n\t\tthis.qtip.elems.overlay.toggle(\r\n\t\t\tthis.qtip.tooltip[0].offsetWidth > 0\r\n\t\t);\r\n\t}\r\n};\r\n\r\n// Extend original api defaults\r\n$.extend(TRUE, QTIP.defaults, {\r\n\tshow: {\r\n\t\tmodal: {\r\n\t\t\ton: FALSE,\r\n\t\t\teffect: TRUE,\r\n\t\t\tblur: TRUE,\r\n\t\t\tstealfocus: TRUE,\r\n\t\t\tescape: TRUE\r\n\t\t}\r\n\t}\r\n});\r\n;}));\r\n}( window, document ));\r\n"]}