{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/babel-runtime/core-js/symbol.js","node_modules/babel-runtime/core-js/symbol/iterator.js","node_modules/babel-runtime/helpers/typeof.js","node_modules/core-js/library/fn/symbol/index.js","node_modules/core-js/library/fn/symbol/iterator.js","node_modules/core-js/library/modules/_a-function.js","node_modules/core-js/library/modules/_add-to-unscopables.js","node_modules/core-js/library/modules/_an-object.js","node_modules/core-js/library/modules/_array-includes.js","node_modules/core-js/library/modules/_cof.js","node_modules/core-js/library/modules/_core.js","node_modules/core-js/library/modules/_ctx.js","node_modules/core-js/library/modules/_defined.js","node_modules/core-js/library/modules/_descriptors.js","node_modules/core-js/library/modules/_dom-create.js","node_modules/core-js/library/modules/_enum-bug-keys.js","node_modules/core-js/library/modules/_enum-keys.js","node_modules/core-js/library/modules/_export.js","node_modules/core-js/library/modules/_fails.js","node_modules/core-js/library/modules/_global.js","node_modules/core-js/library/modules/_has.js","node_modules/core-js/library/modules/_hide.js","node_modules/core-js/library/modules/_html.js","node_modules/core-js/library/modules/_ie8-dom-define.js","node_modules/core-js/library/modules/_iobject.js","node_modules/core-js/library/modules/_is-array.js","node_modules/core-js/library/modules/_is-object.js","node_modules/core-js/library/modules/_iter-create.js","node_modules/core-js/library/modules/_iter-define.js","node_modules/core-js/library/modules/_iter-step.js","node_modules/core-js/library/modules/_iterators.js","node_modules/core-js/library/modules/_keyof.js","node_modules/core-js/library/modules/_library.js","node_modules/core-js/library/modules/_meta.js","node_modules/core-js/library/modules/_object-create.js","node_modules/core-js/library/modules/_object-dp.js","node_modules/core-js/library/modules/_object-dps.js","node_modules/core-js/library/modules/_object-gopd.js","node_modules/core-js/library/modules/_object-gopn-ext.js","node_modules/core-js/library/modules/_object-gopn.js","node_modules/core-js/library/modules/_object-gops.js","node_modules/core-js/library/modules/_object-gpo.js","node_modules/core-js/library/modules/_object-keys-internal.js","node_modules/core-js/library/modules/_object-keys.js","node_modules/core-js/library/modules/_object-pie.js","node_modules/core-js/library/modules/_property-desc.js","node_modules/core-js/library/modules/_redefine.js","node_modules/core-js/library/modules/_set-to-string-tag.js","node_modules/core-js/library/modules/_shared-key.js","node_modules/core-js/library/modules/_shared.js","node_modules/core-js/library/modules/_string-at.js","node_modules/core-js/library/modules/_to-index.js","node_modules/core-js/library/modules/_to-integer.js","node_modules/core-js/library/modules/_to-iobject.js","node_modules/core-js/library/modules/_to-length.js","node_modules/core-js/library/modules/_to-object.js","node_modules/core-js/library/modules/_to-primitive.js","node_modules/core-js/library/modules/_uid.js","node_modules/core-js/library/modules/_wks-define.js","node_modules/core-js/library/modules/_wks-ext.js","node_modules/core-js/library/modules/_wks.js","node_modules/core-js/library/modules/es6.array.iterator.js","node_modules/core-js/library/modules/es6.object.to-string.js","node_modules/core-js/library/modules/es6.string.iterator.js","node_modules/core-js/library/modules/es6.symbol.js","node_modules/core-js/library/modules/es7.symbol.async-iterator.js","node_modules/core-js/library/modules/es7.symbol.observable.js","node_modules/core-js/library/modules/web.dom.iterable.js","node_modules/fullcalendar/dist/fullcalendar.js","node_modules/fullcalendar/dist/locale/fi.js","node_modules/jquery/dist/jquery.js","node_modules/magnific-popup/dist/jquery.magnific-popup.js","node_modules/moment/moment.js","src/js/app-data.js","src/js/components/carousel.js","src/js/components/datetimepicker.js","src/js/components/event-carousel.js","src/js/components/feedback.js","src/js/components/fifty-fifty-carousel.js","src/js/components/header.js","src/js/components/image-gallery.js","src/js/components/map-styles.js","src/js/components/map.js","src/js/components/modal.js","src/js/components/reservation-calendar.js","src/js/components/reservation-form.js","src/js/components/toggle.js","src/js/components/venue-map.js","src/js/components/video-banner.js","src/js/master.js","src/js/vendor/datetimepicker.js","src/js/vendor/modernizr.js","src/js/vendor/slick.js"],"names":[],"mappings":"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","file":"tyrvaanpappila.min.js","sourceRoot":"/","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject')\n , toLength = require('./_to-length')\n , toIndex = require('./_to-index');\nmodule.exports = function(IS_INCLUDES){\n return function($this, el, fromIndex){\n var O = toIObject($this)\n , length = toLength(O.length)\n , index = toIndex(fromIndex, length)\n , value;\n // Array#includes uses SameValueZero equality algorithm\n if(IS_INCLUDES && el != el)while(length > index){\n value = O[index++];\n if(value != value)return true;\n // Array#toIndex ignores holes, Array#includes - not\n } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n if(O[index] === el)return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};","var toString = {}.toString;\n\nmodule.exports = function(it){\n return toString.call(it).slice(8, -1);\n};","var core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function(fn, that, length){\n aFunction(fn);\n if(that === undefined)return fn;\n switch(length){\n case 1: return function(a){\n return fn.call(that, a);\n };\n case 2: return function(a, b){\n return fn.call(that, a, b);\n };\n case 3: return function(a, b, c){\n return fn.call(that, a, b, c);\n };\n }\n return function(/* ...args */){\n return fn.apply(that, arguments);\n };\n};","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n if(it == undefined)throw TypeError(\"Can't call method on \" + it);\n return it;\n};","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function(){\n return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});","var isObject = require('./_is-object')\n , document = require('./_global').document\n // in old IE typeof document.createElement is 'object'\n , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n return is ? document.createElement(it) : {};\n};","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys')\n , gOPS = require('./_object-gops')\n , pIE = require('./_object-pie');\nmodule.exports = function(it){\n var result = getKeys(it)\n , getSymbols = gOPS.f;\n if(getSymbols){\n var symbols = getSymbols(it)\n , isEnum = pIE.f\n , i = 0\n , key;\n while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\n } return result;\n};","var global = require('./_global')\n , core = require('./_core')\n , ctx = require('./_ctx')\n , hide = require('./_hide')\n , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n var IS_FORCED = type & $export.F\n , IS_GLOBAL = type & $export.G\n , IS_STATIC = type & $export.S\n , IS_PROTO = type & $export.P\n , IS_BIND = type & $export.B\n , IS_WRAP = type & $export.W\n , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})\n , expProto = exports[PROTOTYPE]\n , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n , key, own, out;\n if(IS_GLOBAL)source = name;\n for(key in source){\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if(own && key in exports)continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function(C){\n var F = function(a, b, c){\n if(this instanceof C){\n switch(arguments.length){\n case 0: return new C;\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if(IS_PROTO){\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;","module.exports = function(exec){\n try {\n return !!exec();\n } catch(e){\n return true;\n }\n};","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n return hasOwnProperty.call(it, key);\n};","var dP = require('./_object-dp')\n , createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function(object, key, value){\n return dP.f(object, key, createDesc(1, value));\n} : function(object, key, value){\n object[key] = value;\n return object;\n};","module.exports = require('./_global').document && document.documentElement;","module.exports = !require('./_descriptors') && !require('./_fails')(function(){\n return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;\n});","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n return cof(it) == 'String' ? it.split('') : Object(it);\n};","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg){\n return cof(arg) == 'Array';\n};","module.exports = function(it){\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};","'use strict';\nvar create = require('./_object-create')\n , descriptor = require('./_property-desc')\n , setToStringTag = require('./_set-to-string-tag')\n , IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function(){ return this; });\n\nmodule.exports = function(Constructor, NAME, next){\n Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});\n setToStringTag(Constructor, NAME + ' Iterator');\n};","'use strict';\nvar LIBRARY = require('./_library')\n , $export = require('./_export')\n , redefine = require('./_redefine')\n , hide = require('./_hide')\n , has = require('./_has')\n , Iterators = require('./_iterators')\n , $iterCreate = require('./_iter-create')\n , setToStringTag = require('./_set-to-string-tag')\n , getPrototypeOf = require('./_object-gpo')\n , ITERATOR = require('./_wks')('iterator')\n , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n , FF_ITERATOR = '@@iterator'\n , KEYS = 'keys'\n , VALUES = 'values';\n\nvar returnThis = function(){ return this; };\n\nmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){\n $iterCreate(Constructor, NAME, next);\n var getMethod = function(kind){\n if(!BUGGY && kind in proto)return proto[kind];\n switch(kind){\n case KEYS: return function keys(){ return new Constructor(this, kind); };\n case VALUES: return function values(){ return new Constructor(this, kind); };\n } return function entries(){ return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator'\n , DEF_VALUES = DEFAULT == VALUES\n , VALUES_BUG = false\n , proto = Base.prototype\n , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n , $default = $native || getMethod(DEFAULT)\n , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined\n , $anyNative = NAME == 'Array' ? proto.entries || $native : $native\n , methods, key, IteratorPrototype;\n // Fix native\n if($anyNative){\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base));\n if(IteratorPrototype !== Object.prototype){\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if(DEF_VALUES && $native && $native.name !== VALUES){\n VALUES_BUG = true;\n $default = function values(){ return $native.call(this); };\n }\n // Define iterator\n if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if(DEFAULT){\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if(FORCED)for(key in methods){\n if(!(key in proto))redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};","module.exports = function(done, value){\n return {value: value, done: !!done};\n};","module.exports = {};","var getKeys = require('./_object-keys')\n , toIObject = require('./_to-iobject');\nmodule.exports = function(object, el){\n var O = toIObject(object)\n , keys = getKeys(O)\n , length = keys.length\n , index = 0\n , key;\n while(length > index)if(O[key = keys[index++]] === el)return key;\n};","module.exports = true;","var META = require('./_uid')('meta')\n , isObject = require('./_is-object')\n , has = require('./_has')\n , setDesc = require('./_object-dp').f\n , id = 0;\nvar isExtensible = Object.isExtensible || function(){\n return true;\n};\nvar FREEZE = !require('./_fails')(function(){\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function(it){\n setDesc(it, META, {value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n }});\n};\nvar fastKey = function(it, create){\n // return primitive with prefix\n if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if(!has(it, META)){\n // can't set metadata to uncaught frozen object\n if(!isExtensible(it))return 'F';\n // not necessary to add metadata\n if(!create)return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function(it, create){\n if(!has(it, META)){\n // can't set metadata to uncaught frozen object\n if(!isExtensible(it))return true;\n // not necessary to add metadata\n if(!create)return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function(it){\n if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object')\n , dPs = require('./_object-dps')\n , enumBugKeys = require('./_enum-bug-keys')\n , IE_PROTO = require('./_shared-key')('IE_PROTO')\n , Empty = function(){ /* empty */ }\n , PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function(){\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe')\n , i = enumBugKeys.length\n , lt = '<'\n , gt = '>'\n , iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties){\n var result;\n if(O !== null){\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty;\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var anObject = require('./_an-object')\n , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n , toPrimitive = require('./_to-primitive')\n , dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if(IE8_DOM_DEFINE)try {\n return dP(O, P, Attributes);\n } catch(e){ /* empty */ }\n if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n if('value' in Attributes)O[P] = Attributes.value;\n return O;\n};","var dP = require('./_object-dp')\n , anObject = require('./_an-object')\n , getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){\n anObject(O);\n var keys = getKeys(Properties)\n , length = keys.length\n , i = 0\n , P;\n while(length > i)dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};","var pIE = require('./_object-pie')\n , createDesc = require('./_property-desc')\n , toIObject = require('./_to-iobject')\n , toPrimitive = require('./_to-primitive')\n , has = require('./_has')\n , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n , gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P){\n O = toIObject(O);\n P = toPrimitive(P, true);\n if(IE8_DOM_DEFINE)try {\n return gOPD(O, P);\n } catch(e){ /* empty */ }\n if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\n};","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject')\n , gOPN = require('./_object-gopn').f\n , toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function(it){\n try {\n return gOPN(it);\n } catch(e){\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it){\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal')\n , hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){\n return $keys(O, hiddenKeys);\n};","exports.f = Object.getOwnPropertySymbols;","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has')\n , toObject = require('./_to-object')\n , IE_PROTO = require('./_shared-key')('IE_PROTO')\n , ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function(O){\n O = toObject(O);\n if(has(O, IE_PROTO))return O[IE_PROTO];\n if(typeof O.constructor == 'function' && O instanceof O.constructor){\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};","var has = require('./_has')\n , toIObject = require('./_to-iobject')\n , arrayIndexOf = require('./_array-includes')(false)\n , IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function(object, names){\n var O = toIObject(object)\n , i = 0\n , result = []\n , key;\n for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while(names.length > i)if(has(O, key = names[i++])){\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal')\n , enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O){\n return $keys(O, enumBugKeys);\n};","exports.f = {}.propertyIsEnumerable;","module.exports = function(bitmap, value){\n return {\n enumerable : !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable : !(bitmap & 4),\n value : value\n };\n};","module.exports = require('./_hide');","var def = require('./_object-dp').f\n , has = require('./_has')\n , TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function(it, tag, stat){\n if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});\n};","var shared = require('./_shared')('keys')\n , uid = require('./_uid');\nmodule.exports = function(key){\n return shared[key] || (shared[key] = uid(key));\n};","var global = require('./_global')\n , SHARED = '__core-js_shared__'\n , store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n return store[key] || (store[key] = {});\n};","var toInteger = require('./_to-integer')\n , defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function(TO_STRING){\n return function(that, pos){\n var s = String(defined(that))\n , i = toInteger(pos)\n , l = s.length\n , a, b;\n if(i < 0 || i >= l)return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};","var toInteger = require('./_to-integer')\n , max = Math.max\n , min = Math.min;\nmodule.exports = function(index, length){\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};","// 7.1.4 ToInteger\nvar ceil = Math.ceil\n , floor = Math.floor;\nmodule.exports = function(it){\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject')\n , defined = require('./_defined');\nmodule.exports = function(it){\n return IObject(defined(it));\n};","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer')\n , min = Math.min;\nmodule.exports = function(it){\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function(it){\n return Object(defined(it));\n};","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n if(!isObject(it))return it;\n var fn, val;\n if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};","var id = 0\n , px = Math.random();\nmodule.exports = function(key){\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};","var global = require('./_global')\n , core = require('./_core')\n , LIBRARY = require('./_library')\n , wksExt = require('./_wks-ext')\n , defineProperty = require('./_object-dp').f;\nmodule.exports = function(name){\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\n};","exports.f = require('./_wks');","var store = require('./_shared')('wks')\n , uid = require('./_uid')\n , Symbol = require('./_global').Symbol\n , USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function(name){\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables')\n , step = require('./_iter-step')\n , Iterators = require('./_iterators')\n , toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function(iterated, kind){\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function(){\n var O = this._t\n , kind = this._k\n , index = this._i++;\n if(!O || index >= O.length){\n this._t = undefined;\n return step(1);\n }\n if(kind == 'keys' )return step(0, index);\n if(kind == 'values')return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');","\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVzNi5vYmplY3QudG8tc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJmaWxlIjoiL1VzZXJzL2VwcHVtL0RvY3VtZW50cy9Qcm9qZWN0cy90eXJ2YWFucGFwcGlsYS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIiXX0=","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function(iterated){\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function(){\n var O = this._t\n , index = this._i\n , point;\n if(index >= O.length)return {value: undefined, done: true};\n point = $at(O, index);\n this._i += point.length;\n return {value: point, done: false};\n});","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global')\n , has = require('./_has')\n , DESCRIPTORS = require('./_descriptors')\n , $export = require('./_export')\n , redefine = require('./_redefine')\n , META = require('./_meta').KEY\n , $fails = require('./_fails')\n , shared = require('./_shared')\n , setToStringTag = require('./_set-to-string-tag')\n , uid = require('./_uid')\n , wks = require('./_wks')\n , wksExt = require('./_wks-ext')\n , wksDefine = require('./_wks-define')\n , keyOf = require('./_keyof')\n , enumKeys = require('./_enum-keys')\n , isArray = require('./_is-array')\n , anObject = require('./_an-object')\n , toIObject = require('./_to-iobject')\n , toPrimitive = require('./_to-primitive')\n , createDesc = require('./_property-desc')\n , _create = require('./_object-create')\n , gOPNExt = require('./_object-gopn-ext')\n , $GOPD = require('./_object-gopd')\n , $DP = require('./_object-dp')\n , $keys = require('./_object-keys')\n , gOPD = $GOPD.f\n , dP = $DP.f\n , gOPN = gOPNExt.f\n , $Symbol = global.Symbol\n , $JSON = global.JSON\n , _stringify = $JSON && $JSON.stringify\n , PROTOTYPE = 'prototype'\n , HIDDEN = wks('_hidden')\n , TO_PRIMITIVE = wks('toPrimitive')\n , isEnum = {}.propertyIsEnumerable\n , SymbolRegistry = shared('symbol-registry')\n , AllSymbols = shared('symbols')\n , OPSymbols = shared('op-symbols')\n , ObjectProto = Object[PROTOTYPE]\n , USE_NATIVE = typeof $Symbol == 'function'\n , QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n return _create(dP({}, 'a', {\n get: function(){ return dP(this, 'a', {value: 7}).a; }\n })).a != 7;\n}) ? function(it, key, D){\n var protoDesc = gOPD(ObjectProto, key);\n if(protoDesc)delete ObjectProto[key];\n dP(it, key, D);\n if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function(tag){\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\n return typeof it == 'symbol';\n} : function(it){\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D){\n if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if(has(AllSymbols, key)){\n if(!D.enumerable){\n if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n D = _create(D, {enumerable: createDesc(0, false)});\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P){\n anObject(it);\n var keys = enumKeys(P = toIObject(P))\n , i = 0\n , l = keys.length\n , key;\n while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P){\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n it = toIObject(it);\n key = toPrimitive(key, true);\n if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\n var D = gOPD(it, key);\n if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n var names = gOPN(toIObject(it))\n , result = []\n , i = 0\n , key;\n while(names.length > i){\n if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n var IS_OP = it === ObjectProto\n , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\n , result = []\n , i = 0\n , key;\n while(names.length > i){\n if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif(!USE_NATIVE){\n $Symbol = function Symbol(){\n if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function(value){\n if(this === ObjectProto)$set.call(OPSymbols, value);\n if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString(){\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if(DESCRIPTORS && !require('./_library')){\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function(name){\n return wrap(wks(name));\n }\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\n\nfor(var symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\n\nfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function(key){\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(key){\n if(isSymbol(key))return keyOf(SymbolRegistry, key);\n throw TypeError(key + ' is not a symbol!');\n },\n useSetter: function(){ setter = true; },\n useSimple: function(){ setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it){\n if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n var args = [it]\n , i = 1\n , replacer, $replacer;\n while(arguments.length > i)args.push(arguments[i++]);\n replacer = args[1];\n if(typeof replacer == 'function')$replacer = replacer;\n if($replacer || !isArray(replacer))replacer = function(key, value){\n if($replacer)value = $replacer.call(this, key, value);\n if(!isSymbol(value))return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);","require('./_wks-define')('asyncIterator');","require('./_wks-define')('observable');","require('./es6.array.iterator');\nvar global = require('./_global')\n , hide = require('./_hide')\n , Iterators = require('./_iterators')\n , TO_STRING_TAG = require('./_wks')('toStringTag');\n\nfor(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){\n var NAME = collections[i]\n , Collection = global[NAME]\n , proto = Collection && Collection.prototype;\n if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}","/*!\n * FullCalendar v3.4.0\n * Docs & License: https://fullcalendar.io/\n * (c) 2017 Adam Shaw\n */\n\n(function(factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine([ 'jquery', 'moment' ], factory);\n\t}\n\telse if (typeof exports === 'object') { // Node/CommonJS\n\t\tmodule.exports = factory(require('jquery'), require('moment'));\n\t}\n\telse {\n\t\tfactory(jQuery, moment);\n\t}\n})(function($, moment) {\n\n;;\n\nvar FC = $.fullCalendar = {\n\tversion: \"3.4.0\",\n\t// When introducing internal API incompatibilities (where fullcalendar plugins would break),\n\t// the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)\n\t// and the below integer should be incremented.\n\tinternalApiVersion: 9\n};\nvar fcViews = FC.views = {};\n\n\n$.fn.fullCalendar = function(options) {\n\tvar args = Array.prototype.slice.call(arguments, 1); // for a possible method call\n\tvar res = this; // what this function will return (this jQuery object by default)\n\n\tthis.each(function(i, _element) { // loop each DOM element involved\n\t\tvar element = $(_element);\n\t\tvar calendar = element.data('fullCalendar'); // get the existing calendar object (if any)\n\t\tvar singleRes; // the returned value of this single method call\n\n\t\t// a method call\n\t\tif (typeof options === 'string') {\n\t\t\tif (calendar && $.isFunction(calendar[options])) {\n\t\t\t\tsingleRes = calendar[options].apply(calendar, args);\n\t\t\t\tif (!i) {\n\t\t\t\t\tres = singleRes; // record the first method call result\n\t\t\t\t}\n\t\t\t\tif (options === 'destroy') { // for the destroy method, must remove Calendar object data\n\t\t\t\t\telement.removeData('fullCalendar');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// a new calendar initialization\n\t\telse if (!calendar) { // don't initialize twice\n\t\t\tcalendar = new Calendar(element, options);\n\t\t\telement.data('fullCalendar', calendar);\n\t\t\tcalendar.render();\n\t\t}\n\t});\n\n\treturn res;\n};\n\n\nvar complexOptions = [ // names of options that are objects whose properties should be combined\n\t'header',\n\t'footer',\n\t'buttonText',\n\t'buttonIcons',\n\t'themeButtonIcons'\n];\n\n\n// Merges an array of option objects into a single object\nfunction mergeOptions(optionObjs) {\n\treturn mergeProps(optionObjs, complexOptions);\n}\n\n;;\n\n// exports\nFC.intersectRanges = intersectRanges;\nFC.applyAll = applyAll;\nFC.debounce = debounce;\nFC.isInt = isInt;\nFC.htmlEscape = htmlEscape;\nFC.cssToStr = cssToStr;\nFC.proxy = proxy;\nFC.capitaliseFirstLetter = capitaliseFirstLetter;\n\n\n/* FullCalendar-specific DOM Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\n// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\n// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\nfunction compensateScroll(rowEls, scrollbarWidths) {\n\tif (scrollbarWidths.left) {\n\t\trowEls.css({\n\t\t\t'border-left-width': 1,\n\t\t\t'margin-left': scrollbarWidths.left - 1\n\t\t});\n\t}\n\tif (scrollbarWidths.right) {\n\t\trowEls.css({\n\t\t\t'border-right-width': 1,\n\t\t\t'margin-right': scrollbarWidths.right - 1\n\t\t});\n\t}\n}\n\n\n// Undoes compensateScroll and restores all borders/margins\nfunction uncompensateScroll(rowEls) {\n\trowEls.css({\n\t\t'margin-left': '',\n\t\t'margin-right': '',\n\t\t'border-left-width': '',\n\t\t'border-right-width': ''\n\t});\n}\n\n\n// Make the mouse cursor express that an event is not allowed in the current area\nfunction disableCursor() {\n\t$('body').addClass('fc-not-allowed');\n}\n\n\n// Returns the mouse cursor to its original look\nfunction enableCursor() {\n\t$('body').removeClass('fc-not-allowed');\n}\n\n\n// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\n// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\n// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and \n// reduces the available height.\nfunction distributeHeight(els, availableHeight, shouldRedistribute) {\n\n\t// *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\n\t// and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\n\n\tvar minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\n\tvar minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\n\tvar flexEls = []; // elements that are allowed to expand. array of DOM nodes\n\tvar flexOffsets = []; // amount of vertical space it takes up\n\tvar flexHeights = []; // actual css height\n\tvar usedHeight = 0;\n\n\tundistributeHeight(els); // give all elements their natural height\n\n\t// find elements that are below the recommended height (expandable).\n\t// important to query for heights in a single first pass (to avoid reflow oscillation).\n\tels.each(function(i, el) {\n\t\tvar minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\n\t\tvar naturalOffset = $(el).outerHeight(true);\n\n\t\tif (naturalOffset < minOffset) {\n\t\t\tflexEls.push(el);\n\t\t\tflexOffsets.push(naturalOffset);\n\t\t\tflexHeights.push($(el).height());\n\t\t}\n\t\telse {\n\t\t\t// this element stretches past recommended height (non-expandable). mark the space as occupied.\n\t\t\tusedHeight += naturalOffset;\n\t\t}\n\t});\n\n\t// readjust the recommended height to only consider the height available to non-maxed-out rows.\n\tif (shouldRedistribute) {\n\t\tavailableHeight -= usedHeight;\n\t\tminOffset1 = Math.floor(availableHeight / flexEls.length);\n\t\tminOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\n\t}\n\n\t// assign heights to all expandable elements\n\t$(flexEls).each(function(i, el) {\n\t\tvar minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\n\t\tvar naturalOffset = flexOffsets[i];\n\t\tvar naturalHeight = flexHeights[i];\n\t\tvar newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\n\n\t\tif (naturalOffset < minOffset) { // we check this again because redistribution might have changed things\n\t\t\t$(el).height(newHeight);\n\t\t}\n\t});\n}\n\n\n// Undoes distrubuteHeight, restoring all els to their natural height\nfunction undistributeHeight(els) {\n\tels.height('');\n}\n\n\n// Given `els`, a jQuery set of cells, find the cell with the largest natural width and set the widths of all the\n// cells to be that width.\n// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\nfunction matchCellWidths(els) {\n\tvar maxInnerWidth = 0;\n\n\tels.find('> *').each(function(i, innerEl) {\n\t\tvar innerWidth = $(innerEl).outerWidth();\n\t\tif (innerWidth > maxInnerWidth) {\n\t\t\tmaxInnerWidth = innerWidth;\n\t\t}\n\t});\n\n\tmaxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\n\n\tels.width(maxInnerWidth);\n\n\treturn maxInnerWidth;\n}\n\n\n// Given one element that resides inside another,\n// Subtracts the height of the inner element from the outer element.\nfunction subtractInnerElHeight(outerEl, innerEl) {\n\tvar both = outerEl.add(innerEl);\n\tvar diff;\n\n\t// effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\n\tboth.css({\n\t\tposition: 'relative', // cause a reflow, which will force fresh dimension recalculation\n\t\tleft: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\n\t});\n\tdiff = outerEl.outerHeight() - innerEl.outerHeight(); // grab the dimensions\n\tboth.css({ position: '', left: '' }); // undo hack\n\n\treturn diff;\n}\n\n\n/* Element Geom Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nFC.getOuterRect = getOuterRect;\nFC.getClientRect = getClientRect;\nFC.getContentRect = getContentRect;\nFC.getScrollbarWidths = getScrollbarWidths;\n\n\n// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51\nfunction getScrollParent(el) {\n\tvar position = el.css('position'),\n\t\tscrollParent = el.parents().filter(function() {\n\t\t\tvar parent = $(this);\n\t\t\treturn (/(auto|scroll)/).test(\n\t\t\t\tparent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x')\n\t\t\t);\n\t\t}).eq(0);\n\n\treturn position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;\n}\n\n\n// Queries the outer bounding area of a jQuery element.\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\n// Origin is optional.\nfunction getOuterRect(el, origin) {\n\tvar offset = el.offset();\n\tvar left = offset.left - (origin ? origin.left : 0);\n\tvar top = offset.top - (origin ? origin.top : 0);\n\n\treturn {\n\t\tleft: left,\n\t\tright: left + el.outerWidth(),\n\t\ttop: top,\n\t\tbottom: top + el.outerHeight()\n\t};\n}\n\n\n// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\n// Origin is optional.\n// WARNING: given element can't have borders\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\nfunction getClientRect(el, origin) {\n\tvar offset = el.offset();\n\tvar scrollbarWidths = getScrollbarWidths(el);\n\tvar left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left - (origin ? origin.left : 0);\n\tvar top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top - (origin ? origin.top : 0);\n\n\treturn {\n\t\tleft: left,\n\t\tright: left + el[0].clientWidth, // clientWidth includes padding but NOT scrollbars\n\t\ttop: top,\n\t\tbottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars\n\t};\n}\n\n\n// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\n// Origin is optional.\nfunction getContentRect(el, origin) {\n\tvar offset = el.offset(); // just outside of border, margin not included\n\tvar left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left') -\n\t\t(origin ? origin.left : 0);\n\tvar top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top') -\n\t\t(origin ? origin.top : 0);\n\n\treturn {\n\t\tleft: left,\n\t\tright: left + el.width(),\n\t\ttop: top,\n\t\tbottom: top + el.height()\n\t};\n}\n\n\n// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.\n// WARNING: given element can't have borders (which will cause offsetWidth/offsetHeight to be larger).\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\nfunction getScrollbarWidths(el) {\n\tvar leftRightWidth = el[0].offsetWidth - el[0].clientWidth;\n\tvar bottomWidth = el[0].offsetHeight - el[0].clientHeight;\n\tvar widths;\n\n\tleftRightWidth = sanitizeScrollbarWidth(leftRightWidth);\n\tbottomWidth = sanitizeScrollbarWidth(bottomWidth);\n\n\twidths = { left: 0, right: 0, top: 0, bottom: bottomWidth };\n\n\tif (getIsLeftRtlScrollbars() && el.css('direction') == 'rtl') { // is the scrollbar on the left side?\n\t\twidths.left = leftRightWidth;\n\t}\n\telse {\n\t\twidths.right = leftRightWidth;\n\t}\n\n\treturn widths;\n}\n\n\n// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to\n// retina displays, rounding, and IE11. Massage them into a usable value.\nfunction sanitizeScrollbarWidth(width) {\n\twidth = Math.max(0, width); // no negatives\n\twidth = Math.round(width);\n\treturn width;\n}\n\n\n// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\n\nvar _isLeftRtlScrollbars = null;\n\nfunction getIsLeftRtlScrollbars() { // responsible for caching the computation\n\tif (_isLeftRtlScrollbars === null) {\n\t\t_isLeftRtlScrollbars = computeIsLeftRtlScrollbars();\n\t}\n\treturn _isLeftRtlScrollbars;\n}\n\nfunction computeIsLeftRtlScrollbars() { // creates an offscreen test element, then removes it\n\tvar el = $('
')\n\t\t.css({\n\t\t\tposition: 'absolute',\n\t\t\ttop: -1000,\n\t\t\tleft: 0,\n\t\t\tborder: 0,\n\t\t\tpadding: 0,\n\t\t\toverflow: 'scroll',\n\t\t\tdirection: 'rtl'\n\t\t})\n\t\t.appendTo('body');\n\tvar innerEl = el.children();\n\tvar res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?\n\tel.remove();\n\treturn res;\n}\n\n\n// Retrieves a jQuery element's computed CSS value as a floating-point number.\n// If the queried value is non-numeric (ex: IE can return \"medium\" for border width), will just return zero.\nfunction getCssFloat(el, prop) {\n\treturn parseFloat(el.css(prop)) || 0;\n}\n\n\n/* Mouse / Touch Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nFC.preventDefault = preventDefault;\n\n\n// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\nfunction isPrimaryMouseButton(ev) {\n\treturn ev.which == 1 && !ev.ctrlKey;\n}\n\n\nfunction getEvX(ev) {\n\tvar touches = ev.originalEvent.touches;\n\n\t// on mobile FF, pageX for touch events is present, but incorrect,\n\t// so, look at touch coordinates first.\n\tif (touches && touches.length) {\n\t\treturn touches[0].pageX;\n\t}\n\n\treturn ev.pageX;\n}\n\n\nfunction getEvY(ev) {\n\tvar touches = ev.originalEvent.touches;\n\n\t// on mobile FF, pageX for touch events is present, but incorrect,\n\t// so, look at touch coordinates first.\n\tif (touches && touches.length) {\n\t\treturn touches[0].pageY;\n\t}\n\n\treturn ev.pageY;\n}\n\n\nfunction getEvIsTouch(ev) {\n\treturn /^touch/.test(ev.type);\n}\n\n\nfunction preventSelection(el) {\n\tel.addClass('fc-unselectable')\n\t\t.on('selectstart', preventDefault);\n}\n\n\nfunction allowSelection(el) {\n\tel.removeClass('fc-unselectable')\n\t\t.off('selectstart', preventDefault);\n}\n\n\n// Stops a mouse/touch event from doing it's native browser action\nfunction preventDefault(ev) {\n\tev.preventDefault();\n}\n\n\n/* General Geometry Utils\n----------------------------------------------------------------------------------------------------------------------*/\n\nFC.intersectRects = intersectRects;\n\n// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\nfunction intersectRects(rect1, rect2) {\n\tvar res = {\n\t\tleft: Math.max(rect1.left, rect2.left),\n\t\tright: Math.min(rect1.right, rect2.right),\n\t\ttop: Math.max(rect1.top, rect2.top),\n\t\tbottom: Math.min(rect1.bottom, rect2.bottom)\n\t};\n\n\tif (res.left < res.right && res.top < res.bottom) {\n\t\treturn res;\n\t}\n\treturn false;\n}\n\n\n// Returns a new point that will have been moved to reside within the given rectangle\nfunction constrainPoint(point, rect) {\n\treturn {\n\t\tleft: Math.min(Math.max(point.left, rect.left), rect.right),\n\t\ttop: Math.min(Math.max(point.top, rect.top), rect.bottom)\n\t};\n}\n\n\n// Returns a point that is the center of the given rectangle\nfunction getRectCenter(rect) {\n\treturn {\n\t\tleft: (rect.left + rect.right) / 2,\n\t\ttop: (rect.top + rect.bottom) / 2\n\t};\n}\n\n\n// Subtracts point2's coordinates from point1's coordinates, returning a delta\nfunction diffPoints(point1, point2) {\n\treturn {\n\t\tleft: point1.left - point2.left,\n\t\ttop: point1.top - point2.top\n\t};\n}\n\n\n/* Object Ordering by Field\n----------------------------------------------------------------------------------------------------------------------*/\n\nFC.parseFieldSpecs = parseFieldSpecs;\nFC.compareByFieldSpecs = compareByFieldSpecs;\nFC.compareByFieldSpec = compareByFieldSpec;\nFC.flexibleCompare = flexibleCompare;\n\n\nfunction parseFieldSpecs(input) {\n\tvar specs = [];\n\tvar tokens = [];\n\tvar i, token;\n\n\tif (typeof input === 'string') {\n\t\ttokens = input.split(/\\s*,\\s*/);\n\t}\n\telse if (typeof input === 'function') {\n\t\ttokens = [ input ];\n\t}\n\telse if ($.isArray(input)) {\n\t\ttokens = input;\n\t}\n\n\tfor (i = 0; i < tokens.length; i++) {\n\t\ttoken = tokens[i];\n\n\t\tif (typeof token === 'string') {\n\t\t\tspecs.push(\n\t\t\t\ttoken.charAt(0) == '-' ?\n\t\t\t\t\t{ field: token.substring(1), order: -1 } :\n\t\t\t\t\t{ field: token, order: 1 }\n\t\t\t);\n\t\t}\n\t\telse if (typeof token === 'function') {\n\t\t\tspecs.push({ func: token });\n\t\t}\n\t}\n\n\treturn specs;\n}\n\n\nfunction compareByFieldSpecs(obj1, obj2, fieldSpecs) {\n\tvar i;\n\tvar cmp;\n\n\tfor (i = 0; i < fieldSpecs.length; i++) {\n\t\tcmp = compareByFieldSpec(obj1, obj2, fieldSpecs[i]);\n\t\tif (cmp) {\n\t\t\treturn cmp;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n\nfunction compareByFieldSpec(obj1, obj2, fieldSpec) {\n\tif (fieldSpec.func) {\n\t\treturn fieldSpec.func(obj1, obj2);\n\t}\n\treturn flexibleCompare(obj1[fieldSpec.field], obj2[fieldSpec.field]) *\n\t\t(fieldSpec.order || 1);\n}\n\n\nfunction flexibleCompare(a, b) {\n\tif (!a && !b) {\n\t\treturn 0;\n\t}\n\tif (b == null) {\n\t\treturn -1;\n\t}\n\tif (a == null) {\n\t\treturn 1;\n\t}\n\tif ($.type(a) === 'string' || $.type(b) === 'string') {\n\t\treturn String(a).localeCompare(String(b));\n\t}\n\treturn a - b;\n}\n\n\n/* FullCalendar-specific Misc Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\n// Computes the intersection of the two ranges. Will return fresh date clones in a range.\n// Returns undefined if no intersection.\n// Expects all dates to be normalized to the same timezone beforehand.\n// TODO: move to date section?\nfunction intersectRanges(subjectRange, constraintRange) {\n\tvar subjectStart = subjectRange.start;\n\tvar subjectEnd = subjectRange.end;\n\tvar constraintStart = constraintRange.start;\n\tvar constraintEnd = constraintRange.end;\n\tvar segStart, segEnd;\n\tvar isStart, isEnd;\n\n\tif (subjectEnd > constraintStart && subjectStart < constraintEnd) { // in bounds at all?\n\n\t\tif (subjectStart >= constraintStart) {\n\t\t\tsegStart = subjectStart.clone();\n\t\t\tisStart = true;\n\t\t}\n\t\telse {\n\t\t\tsegStart = constraintStart.clone();\n\t\t\tisStart = false;\n\t\t}\n\n\t\tif (subjectEnd <= constraintEnd) {\n\t\t\tsegEnd = subjectEnd.clone();\n\t\t\tisEnd = true;\n\t\t}\n\t\telse {\n\t\t\tsegEnd = constraintEnd.clone();\n\t\t\tisEnd = false;\n\t\t}\n\n\t\treturn {\n\t\t\tstart: segStart,\n\t\t\tend: segEnd,\n\t\t\tisStart: isStart,\n\t\t\tisEnd: isEnd\n\t\t};\n\t}\n}\n\n\n/* Date Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nFC.computeGreatestUnit = computeGreatestUnit;\nFC.divideRangeByDuration = divideRangeByDuration;\nFC.divideDurationByDuration = divideDurationByDuration;\nFC.multiplyDuration = multiplyDuration;\nFC.durationHasTime = durationHasTime;\n\nvar dayIDs = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];\nvar unitsDesc = [ 'year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond' ]; // descending\n\n\n// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.\n// Moments will have their timezones normalized.\nfunction diffDayTime(a, b) {\n\treturn moment.duration({\n\t\tdays: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),\n\t\tms: a.time() - b.time() // time-of-day from day start. disregards timezone\n\t});\n}\n\n\n// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.\nfunction diffDay(a, b) {\n\treturn moment.duration({\n\t\tdays: a.clone().stripTime().diff(b.clone().stripTime(), 'days')\n\t});\n}\n\n\n// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.\nfunction diffByUnit(a, b, unit) {\n\treturn moment.duration(\n\t\tMath.round(a.diff(b, unit, true)), // returnFloat=true\n\t\tunit\n\t);\n}\n\n\n// Computes the unit name of the largest whole-unit period of time.\n// For example, 48 hours will be \"days\" whereas 49 hours will be \"hours\".\n// Accepts start/end, a range object, or an original duration object.\nfunction computeGreatestUnit(start, end) {\n\tvar i, unit;\n\tvar val;\n\n\tfor (i = 0; i < unitsDesc.length; i++) {\n\t\tunit = unitsDesc[i];\n\t\tval = computeRangeAs(unit, start, end);\n\n\t\tif (val >= 1 && isInt(val)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn unit; // will be \"milliseconds\" if nothing else matches\n}\n\n\n// like computeGreatestUnit, but has special abilities to interpret the source input for clues\nfunction computeDurationGreatestUnit(duration, durationInput) {\n\tvar unit = computeGreatestUnit(duration);\n\n\t// prevent days:7 from being interpreted as a week\n\tif (unit === 'week' && typeof durationInput === 'object' && durationInput.days) {\n\t\tunit = 'day';\n\t}\n\n\treturn unit;\n}\n\n\n// Computes the number of units (like \"hours\") in the given range.\n// Range can be a {start,end} object, separate start/end args, or a Duration.\n// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling\n// of month-diffing logic (which tends to vary from version to version).\nfunction computeRangeAs(unit, start, end) {\n\n\tif (end != null) { // given start, end\n\t\treturn end.diff(start, unit, true);\n\t}\n\telse if (moment.isDuration(start)) { // given duration\n\t\treturn start.as(unit);\n\t}\n\telse { // given { start, end } range object\n\t\treturn start.end.diff(start.start, unit, true);\n\t}\n}\n\n\n// Intelligently divides a range (specified by a start/end params) by a duration\nfunction divideRangeByDuration(start, end, dur) {\n\tvar months;\n\n\tif (durationHasTime(dur)) {\n\t\treturn (end - start) / dur;\n\t}\n\tmonths = dur.asMonths();\n\tif (Math.abs(months) >= 1 && isInt(months)) {\n\t\treturn end.diff(start, 'months', true) / months;\n\t}\n\treturn end.diff(start, 'days', true) / dur.asDays();\n}\n\n\n// Intelligently divides one duration by another\nfunction divideDurationByDuration(dur1, dur2) {\n\tvar months1, months2;\n\n\tif (durationHasTime(dur1) || durationHasTime(dur2)) {\n\t\treturn dur1 / dur2;\n\t}\n\tmonths1 = dur1.asMonths();\n\tmonths2 = dur2.asMonths();\n\tif (\n\t\tMath.abs(months1) >= 1 && isInt(months1) &&\n\t\tMath.abs(months2) >= 1 && isInt(months2)\n\t) {\n\t\treturn months1 / months2;\n\t}\n\treturn dur1.asDays() / dur2.asDays();\n}\n\n\n// Intelligently multiplies a duration by a number\nfunction multiplyDuration(dur, n) {\n\tvar months;\n\n\tif (durationHasTime(dur)) {\n\t\treturn moment.duration(dur * n);\n\t}\n\tmonths = dur.asMonths();\n\tif (Math.abs(months) >= 1 && isInt(months)) {\n\t\treturn moment.duration({ months: months * n });\n\t}\n\treturn moment.duration({ days: dur.asDays() * n });\n}\n\n\nfunction cloneRange(range) {\n\treturn {\n\t\tstart: range.start.clone(),\n\t\tend: range.end.clone()\n\t};\n}\n\n\n// Trims the beginning and end of inner range to be completely within outerRange.\n// Returns a new range object.\nfunction constrainRange(innerRange, outerRange) {\n\tinnerRange = cloneRange(innerRange);\n\n\tif (outerRange.start) {\n\t\t// needs to be inclusively before outerRange's end\n\t\tinnerRange.start = constrainDate(innerRange.start, outerRange);\n\t}\n\n\tif (outerRange.end) {\n\t\tinnerRange.end = minMoment(innerRange.end, outerRange.end);\n\t}\n\n\treturn innerRange;\n}\n\n\n// If the given date is not within the given range, move it inside.\n// (If it's past the end, make it one millisecond before the end).\n// Always returns a new moment.\nfunction constrainDate(date, range) {\n\tdate = date.clone();\n\n\tif (range.start) {\n\t\tdate = maxMoment(date, range.start);\n\t}\n\n\tif (range.end && date >= range.end) {\n\t\tdate = range.end.clone().subtract(1);\n\t}\n\n\treturn date;\n}\n\n\nfunction isDateWithinRange(date, range) {\n\treturn (!range.start || date >= range.start) &&\n\t\t(!range.end || date < range.end);\n}\n\n\n// TODO: deal with repeat code in intersectRanges\n// constraintRange can have unspecified start/end, an open-ended range.\nfunction doRangesIntersect(subjectRange, constraintRange) {\n\treturn (!constraintRange.start || subjectRange.end >= constraintRange.start) &&\n\t\t(!constraintRange.end || subjectRange.start < constraintRange.end);\n}\n\n\nfunction isRangeWithinRange(innerRange, outerRange) {\n\treturn (!outerRange.start || innerRange.start >= outerRange.start) &&\n\t\t(!outerRange.end || innerRange.end <= outerRange.end);\n}\n\n\nfunction isRangesEqual(range0, range1) {\n\treturn ((range0.start && range1.start && range0.start.isSame(range1.start)) || (!range0.start && !range1.start)) &&\n\t\t((range0.end && range1.end && range0.end.isSame(range1.end)) || (!range0.end && !range1.end));\n}\n\n\n// Returns the moment that's earlier in time. Always a copy.\nfunction minMoment(mom1, mom2) {\n\treturn (mom1.isBefore(mom2) ? mom1 : mom2).clone();\n}\n\n\n// Returns the moment that's later in time. Always a copy.\nfunction maxMoment(mom1, mom2) {\n\treturn (mom1.isAfter(mom2) ? mom1 : mom2).clone();\n}\n\n\n// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)\nfunction durationHasTime(dur) {\n\treturn Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());\n}\n\n\nfunction isNativeDate(input) {\n\treturn Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;\n}\n\n\n// Returns a boolean about whether the given input is a time string, like \"06:40:00\" or \"06:00\"\nfunction isTimeString(str) {\n\treturn /^\\d+\\:\\d+(?:\\:\\d+\\.?(?:\\d{3})?)?$/.test(str);\n}\n\n\n/* Logging and Debug\n----------------------------------------------------------------------------------------------------------------------*/\n\nFC.log = function() {\n\tvar console = window.console;\n\n\tif (console && console.log) {\n\t\treturn console.log.apply(console, arguments);\n\t}\n};\n\nFC.warn = function() {\n\tvar console = window.console;\n\n\tif (console && console.warn) {\n\t\treturn console.warn.apply(console, arguments);\n\t}\n\telse {\n\t\treturn FC.log.apply(FC, arguments);\n\t}\n};\n\n\n/* General Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar hasOwnPropMethod = {}.hasOwnProperty;\n\n\n// Merges an array of objects into a single object.\n// The second argument allows for an array of property names who's object values will be merged together.\nfunction mergeProps(propObjs, complexProps) {\n\tvar dest = {};\n\tvar i, name;\n\tvar complexObjs;\n\tvar j, val;\n\tvar props;\n\n\tif (complexProps) {\n\t\tfor (i = 0; i < complexProps.length; i++) {\n\t\t\tname = complexProps[i];\n\t\t\tcomplexObjs = [];\n\n\t\t\t// collect the trailing object values, stopping when a non-object is discovered\n\t\t\tfor (j = propObjs.length - 1; j >= 0; j--) {\n\t\t\t\tval = propObjs[j][name];\n\n\t\t\t\tif (typeof val === 'object') {\n\t\t\t\t\tcomplexObjs.unshift(val);\n\t\t\t\t}\n\t\t\t\telse if (val !== undefined) {\n\t\t\t\t\tdest[name] = val; // if there were no objects, this value will be used\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if the trailing values were objects, use the merged value\n\t\t\tif (complexObjs.length) {\n\t\t\t\tdest[name] = mergeProps(complexObjs);\n\t\t\t}\n\t\t}\n\t}\n\n\t// copy values into the destination, going from last to first\n\tfor (i = propObjs.length - 1; i >= 0; i--) {\n\t\tprops = propObjs[i];\n\n\t\tfor (name in props) {\n\t\t\tif (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign\n\t\t\t\tdest[name] = props[name];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn dest;\n}\n\n\n// Create an object that has the given prototype. Just like Object.create\nfunction createObject(proto) {\n\tvar f = function() {};\n\tf.prototype = proto;\n\treturn new f();\n}\nFC.createObject = createObject;\n\n\nfunction copyOwnProps(src, dest) {\n\tfor (var name in src) {\n\t\tif (hasOwnProp(src, name)) {\n\t\t\tdest[name] = src[name];\n\t\t}\n\t}\n}\n\n\nfunction hasOwnProp(obj, name) {\n\treturn hasOwnPropMethod.call(obj, name);\n}\n\n\n// Is the given value a non-object non-function value?\nfunction isAtomic(val) {\n\treturn /undefined|null|boolean|number|string/.test($.type(val));\n}\n\n\nfunction applyAll(functions, thisObj, args) {\n\tif ($.isFunction(functions)) {\n\t\tfunctions = [ functions ];\n\t}\n\tif (functions) {\n\t\tvar i;\n\t\tvar ret;\n\t\tfor (i=0; i/g, '>')\n\t\t.replace(/'/g, ''')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/\\n/g, '
');\n}\n\n\nfunction stripHtmlEntities(text) {\n\treturn text.replace(/&.*?;/g, '');\n}\n\n\n// Given a hash of CSS properties, returns a string of CSS.\n// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\nfunction cssToStr(cssProps) {\n\tvar statements = [];\n\n\t$.each(cssProps, function(name, val) {\n\t\tif (val != null) {\n\t\t\tstatements.push(name + ':' + val);\n\t\t}\n\t});\n\n\treturn statements.join(';');\n}\n\n\n// Given an object hash of HTML attribute names to values,\n// generates a string that can be injected between < > in HTML\nfunction attrsToStr(attrs) {\n\tvar parts = [];\n\n\t$.each(attrs, function(name, val) {\n\t\tif (val != null) {\n\t\t\tparts.push(name + '=\"' + htmlEscape(val) + '\"');\n\t\t}\n\t});\n\n\treturn parts.join(' ');\n}\n\n\nfunction capitaliseFirstLetter(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nfunction compareNumbers(a, b) { // for .sort()\n\treturn a - b;\n}\n\n\nfunction isInt(n) {\n\treturn n % 1 === 0;\n}\n\n\n// Returns a method bound to the given object context.\n// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with\n// different contexts as identical when binding/unbinding events.\nfunction proxy(obj, methodName) {\n\tvar method = obj[methodName];\n\n\treturn function() {\n\t\treturn method.apply(obj, arguments);\n\t};\n}\n\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\n// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\nfunction debounce(func, wait, immediate) {\n\tvar timeout, args, context, timestamp, result;\n\n\tvar later = function() {\n\t\tvar last = +new Date() - timestamp;\n\t\tif (last < wait) {\n\t\t\ttimeout = setTimeout(later, wait - last);\n\t\t}\n\t\telse {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) {\n\t\t\t\tresult = func.apply(context, args);\n\t\t\t\tcontext = args = null;\n\t\t\t}\n\t\t}\n\t};\n\n\treturn function() {\n\t\tcontext = this;\n\t\targs = arguments;\n\t\ttimestamp = +new Date();\n\t\tvar callNow = immediate && !timeout;\n\t\tif (!timeout) {\n\t\t\ttimeout = setTimeout(later, wait);\n\t\t}\n\t\tif (callNow) {\n\t\t\tresult = func.apply(context, args);\n\t\t\tcontext = args = null;\n\t\t}\n\t\treturn result;\n\t};\n}\n\n;;\n\n/*\nGENERAL NOTE on moments throughout the *entire rest* of the codebase:\nAll moments are assumed to be ambiguously-zoned unless otherwise noted,\nwith the NOTABLE EXCEOPTION of start/end dates that live on *Event Objects*.\nAmbiguously-TIMED moments are assumed to be ambiguously-zoned by nature.\n*/\n\nvar ambigDateOfMonthRegex = /^\\s*\\d{4}-\\d\\d$/;\nvar ambigTimeOrZoneRegex =\n\t/^\\s*\\d{4}-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?)?$/;\nvar newMomentProto = moment.fn; // where we will attach our new methods\nvar oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods\n\n// tell momentjs to transfer these properties upon clone\nvar momentProperties = moment.momentProperties;\nmomentProperties.push('_fullCalendar');\nmomentProperties.push('_ambigTime');\nmomentProperties.push('_ambigZone');\n\n\n// Creating\n// -------------------------------------------------------------------------------------------------\n\n// Creates a new moment, similar to the vanilla moment(...) constructor, but with\n// extra features (ambiguous time, enhanced formatting). When given an existing moment,\n// it will function as a clone (and retain the zone of the moment). Anything else will\n// result in a moment in the local zone.\nFC.moment = function() {\n\treturn makeMoment(arguments);\n};\n\n// Sames as FC.moment, but forces the resulting moment to be in the UTC timezone.\nFC.moment.utc = function() {\n\tvar mom = makeMoment(arguments, true);\n\n\t// Force it into UTC because makeMoment doesn't guarantee it\n\t// (if given a pre-existing moment for example)\n\tif (mom.hasTime()) { // don't give ambiguously-timed moments a UTC zone\n\t\tmom.utc();\n\t}\n\n\treturn mom;\n};\n\n// Same as FC.moment, but when given an ISO8601 string, the timezone offset is preserved.\n// ISO8601 strings with no timezone offset will become ambiguously zoned.\nFC.moment.parseZone = function() {\n\treturn makeMoment(arguments, true, true);\n};\n\n// Builds an enhanced moment from args. When given an existing moment, it clones. When given a\n// native Date, or called with no arguments (the current time), the resulting moment will be local.\n// Anything else needs to be \"parsed\" (a string or an array), and will be affected by:\n// parseAsUTC - if there is no zone information, should we parse the input in UTC?\n// parseZone - if there is zone information, should we force the zone of the moment?\nfunction makeMoment(args, parseAsUTC, parseZone) {\n\tvar input = args[0];\n\tvar isSingleString = args.length == 1 && typeof input === 'string';\n\tvar isAmbigTime;\n\tvar isAmbigZone;\n\tvar ambigMatch;\n\tvar mom;\n\n\tif (moment.isMoment(input) || isNativeDate(input) || input === undefined) {\n\t\tmom = moment.apply(null, args);\n\t}\n\telse { // \"parsing\" is required\n\t\tisAmbigTime = false;\n\t\tisAmbigZone = false;\n\n\t\tif (isSingleString) {\n\t\t\tif (ambigDateOfMonthRegex.test(input)) {\n\t\t\t\t// accept strings like '2014-05', but convert to the first of the month\n\t\t\t\tinput += '-01';\n\t\t\t\targs = [ input ]; // for when we pass it on to moment's constructor\n\t\t\t\tisAmbigTime = true;\n\t\t\t\tisAmbigZone = true;\n\t\t\t}\n\t\t\telse if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {\n\t\t\t\tisAmbigTime = !ambigMatch[5]; // no time part?\n\t\t\t\tisAmbigZone = true;\n\t\t\t}\n\t\t}\n\t\telse if ($.isArray(input)) {\n\t\t\t// arrays have no timezone information, so assume ambiguous zone\n\t\t\tisAmbigZone = true;\n\t\t}\n\t\t// otherwise, probably a string with a format\n\n\t\tif (parseAsUTC || isAmbigTime) {\n\t\t\tmom = moment.utc.apply(moment, args);\n\t\t}\n\t\telse {\n\t\t\tmom = moment.apply(null, args);\n\t\t}\n\n\t\tif (isAmbigTime) {\n\t\t\tmom._ambigTime = true;\n\t\t\tmom._ambigZone = true; // ambiguous time always means ambiguous zone\n\t\t}\n\t\telse if (parseZone) { // let's record the inputted zone somehow\n\t\t\tif (isAmbigZone) {\n\t\t\t\tmom._ambigZone = true;\n\t\t\t}\n\t\t\telse if (isSingleString) {\n\t\t\t\tmom.utcOffset(input); // if not a valid zone, will assign UTC\n\t\t\t}\n\t\t}\n\t}\n\n\tmom._fullCalendar = true; // flag for extended functionality\n\n\treturn mom;\n}\n\n\n// Week Number\n// -------------------------------------------------------------------------------------------------\n\n\n// Returns the week number, considering the locale's custom week number calcuation\n// `weeks` is an alias for `week`\nnewMomentProto.week = newMomentProto.weeks = function(input) {\n\tvar weekCalc = this._locale._fullCalendar_weekCalc;\n\n\tif (input == null && typeof weekCalc === 'function') { // custom function only works for getter\n\t\treturn weekCalc(this);\n\t}\n\telse if (weekCalc === 'ISO') {\n\t\treturn oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter\n\t}\n\n\treturn oldMomentProto.week.apply(this, arguments); // local getter/setter\n};\n\n\n// Time-of-day\n// -------------------------------------------------------------------------------------------------\n\n// GETTER\n// Returns a Duration with the hours/minutes/seconds/ms values of the moment.\n// If the moment has an ambiguous time, a duration of 00:00 will be returned.\n//\n// SETTER\n// You can supply a Duration, a Moment, or a Duration-like argument.\n// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.\nnewMomentProto.time = function(time) {\n\n\t// Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.\n\t// `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.\n\tif (!this._fullCalendar) {\n\t\treturn oldMomentProto.time.apply(this, arguments);\n\t}\n\n\tif (time == null) { // getter\n\t\treturn moment.duration({\n\t\t\thours: this.hours(),\n\t\t\tminutes: this.minutes(),\n\t\t\tseconds: this.seconds(),\n\t\t\tmilliseconds: this.milliseconds()\n\t\t});\n\t}\n\telse { // setter\n\n\t\tthis._ambigTime = false; // mark that the moment now has a time\n\n\t\tif (!moment.isDuration(time) && !moment.isMoment(time)) {\n\t\t\ttime = moment.duration(time);\n\t\t}\n\n\t\t// The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).\n\t\t// Only for Duration times, not Moment times.\n\t\tvar dayHours = 0;\n\t\tif (moment.isDuration(time)) {\n\t\t\tdayHours = Math.floor(time.asDays()) * 24;\n\t\t}\n\n\t\t// We need to set the individual fields.\n\t\t// Can't use startOf('day') then add duration. In case of DST at start of day.\n\t\treturn this.hours(dayHours + time.hours())\n\t\t\t.minutes(time.minutes())\n\t\t\t.seconds(time.seconds())\n\t\t\t.milliseconds(time.milliseconds());\n\t}\n};\n\n// Converts the moment to UTC, stripping out its time-of-day and timezone offset,\n// but preserving its YMD. A moment with a stripped time will display no time\n// nor timezone offset when .format() is called.\nnewMomentProto.stripTime = function() {\n\n\tif (!this._ambigTime) {\n\n\t\tthis.utc(true); // keepLocalTime=true (for keeping *date* value)\n\n\t\t// set time to zero\n\t\tthis.set({\n\t\t\thours: 0,\n\t\t\tminutes: 0,\n\t\t\tseconds: 0,\n\t\t\tms: 0\n\t\t});\n\n\t\t// Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\n\t\t// which clears all ambig flags.\n\t\tthis._ambigTime = true;\n\t\tthis._ambigZone = true; // if ambiguous time, also ambiguous timezone offset\n\t}\n\n\treturn this; // for chaining\n};\n\n// Returns if the moment has a non-ambiguous time (boolean)\nnewMomentProto.hasTime = function() {\n\treturn !this._ambigTime;\n};\n\n\n// Timezone\n// -------------------------------------------------------------------------------------------------\n\n// Converts the moment to UTC, stripping out its timezone offset, but preserving its\n// YMD and time-of-day. A moment with a stripped timezone offset will display no\n// timezone offset when .format() is called.\nnewMomentProto.stripZone = function() {\n\tvar wasAmbigTime;\n\n\tif (!this._ambigZone) {\n\n\t\twasAmbigTime = this._ambigTime;\n\n\t\tthis.utc(true); // keepLocalTime=true (for keeping date and time values)\n\n\t\t// the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore\n\t\tthis._ambigTime = wasAmbigTime || false;\n\n\t\t// Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\n\t\t// which clears the ambig flags.\n\t\tthis._ambigZone = true;\n\t}\n\n\treturn this; // for chaining\n};\n\n// Returns of the moment has a non-ambiguous timezone offset (boolean)\nnewMomentProto.hasZone = function() {\n\treturn !this._ambigZone;\n};\n\n\n// implicitly marks a zone\nnewMomentProto.local = function(keepLocalTime) {\n\n\t// for when converting from ambiguously-zoned to local,\n\t// keep the time values when converting from UTC -> local\n\toldMomentProto.local.call(this, this._ambigZone || keepLocalTime);\n\n\t// ensure non-ambiguous\n\t// this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals\n\tthis._ambigTime = false;\n\tthis._ambigZone = false;\n\n\treturn this; // for chaining\n};\n\n\n// implicitly marks a zone\nnewMomentProto.utc = function(keepLocalTime) {\n\n\toldMomentProto.utc.call(this, keepLocalTime);\n\n\t// ensure non-ambiguous\n\t// this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals\n\tthis._ambigTime = false;\n\tthis._ambigZone = false;\n\n\treturn this;\n};\n\n\n// implicitly marks a zone (will probably get called upon .utc() and .local())\nnewMomentProto.utcOffset = function(tzo) {\n\n\tif (tzo != null) { // setter\n\t\t// these assignments needs to happen before the original zone method is called.\n\t\t// I forget why, something to do with a browser crash.\n\t\tthis._ambigTime = false;\n\t\tthis._ambigZone = false;\n\t}\n\n\treturn oldMomentProto.utcOffset.apply(this, arguments);\n};\n\n\n// Formatting\n// -------------------------------------------------------------------------------------------------\n\nnewMomentProto.format = function() {\n\n\tif (this._fullCalendar && arguments[0]) { // an enhanced moment? and a format string provided?\n\t\treturn formatDate(this, arguments[0]); // our extended formatting\n\t}\n\tif (this._ambigTime) {\n\t\treturn oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\n\t}\n\tif (this._ambigZone) {\n\t\treturn oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\n\t}\n\tif (this._fullCalendar) { // enhanced non-ambig moment?\n\t\t// moment.format() doesn't ensure english, but we want to.\n\t\treturn oldMomentFormat(englishMoment(this));\n\t}\n\n\treturn oldMomentProto.format.apply(this, arguments);\n};\n\nnewMomentProto.toISOString = function() {\n\n\tif (this._ambigTime) {\n\t\treturn oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\n\t}\n\tif (this._ambigZone) {\n\t\treturn oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\n\t}\n\tif (this._fullCalendar) { // enhanced non-ambig moment?\n\t\t// depending on browser, moment might not output english. ensure english.\n\t\t// https://github.com/moment/moment/blob/2.18.1/src/lib/moment/format.js#L22\n\t\treturn oldMomentProto.toISOString.apply(englishMoment(this), arguments);\n\t}\n\n\treturn oldMomentProto.toISOString.apply(this, arguments);\n};\n\nfunction englishMoment(mom) {\n\tif (mom.locale() !== 'en') {\n\t\treturn mom.clone().locale('en');\n\t}\n\treturn mom;\n}\n\n;;\n(function() {\n\n// exports\nFC.formatDate = formatDate;\nFC.formatRange = formatRange;\nFC.oldMomentFormat = oldMomentFormat;\nFC.queryMostGranularFormatUnit = queryMostGranularFormatUnit;\n\n\n// Config\n// ---------------------------------------------------------------------------------------------------------------------\n\n/*\nInserted between chunks in the fake (\"intermediate\") formatting string.\nImportant that it passes as whitespace (\\s) because moment often identifies non-standalone months\nvia a regexp with an \\s.\n*/\nvar PART_SEPARATOR = '\\u000b'; // vertical tab\n\n/*\nInserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,\nbut rather, a \"special\" token that has custom rendering (see specialTokens map).\n*/\nvar SPECIAL_TOKEN_MARKER = '\\u001f'; // information separator 1\n\n/*\nInserted at the beginning and end of a span of text that must have non-zero numeric characters.\nHandling of these markers is done in a post-processing step at the very end of text rendering.\n*/\nvar MAYBE_MARKER = '\\u001e'; // information separator 2\nvar MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global\n\n/*\nAddition formatting tokens we want recognized\n*/\nvar specialTokens = {\n\tt: function(date) { // \"a\" or \"p\"\n\t\treturn oldMomentFormat(date, 'a').charAt(0);\n\t},\n\tT: function(date) { // \"A\" or \"P\"\n\t\treturn oldMomentFormat(date, 'A').charAt(0);\n\t}\n};\n\n/*\nThe first characters of formatting tokens for units that are 1 day or larger.\n`value` is for ranking relative size (lower means bigger).\n`unit` is a normalized unit, used for comparing moments.\n*/\nvar largeTokenMap = {\n\tY: { value: 1, unit: 'year' },\n\tM: { value: 2, unit: 'month' },\n\tW: { value: 3, unit: 'week' }, // ISO week\n\tw: { value: 3, unit: 'week' }, // local week\n\tD: { value: 4, unit: 'day' }, // day of month\n\td: { value: 4, unit: 'day' } // day of week\n};\n\n\n// Single Date Formatting\n// ---------------------------------------------------------------------------------------------------------------------\n\n/*\nFormats `date` with a Moment formatting string, but allow our non-zero areas and special token\n*/\nfunction formatDate(date, formatStr) {\n\treturn renderFakeFormatString(\n\t\tgetParsedFormatString(formatStr).fakeFormatString,\n\t\tdate\n\t);\n}\n\n/*\nCall this if you want Moment's original format method to be used\n*/\nfunction oldMomentFormat(mom, formatStr) {\n\treturn oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js\n}\n\n\n// Date Range Formatting\n// -------------------------------------------------------------------------------------------------\n// TODO: make it work with timezone offset\n\n/*\nUsing a formatting string meant for a single date, generate a range string, like\n\"Sep 2 - 9 2013\", that intelligently inserts a separator where the dates differ.\nIf the dates are the same as far as the format string is concerned, just return a single\nrendering of one date, without any separator.\n*/\nfunction formatRange(date1, date2, formatStr, separator, isRTL) {\n\tvar localeData;\n\n\tdate1 = FC.moment.parseZone(date1);\n\tdate2 = FC.moment.parseZone(date2);\n\n\tlocaleData = date1.localeData();\n\n\t// Expand localized format strings, like \"LL\" -> \"MMMM D YYYY\".\n\t// BTW, this is not important for `formatDate` because it is impossible to put custom tokens\n\t// or non-zero areas in Moment's localized format strings.\n\tformatStr = localeData.longDateFormat(formatStr) || formatStr;\n\n\treturn renderParsedFormat(\n\t\tgetParsedFormatString(formatStr),\n\t\tdate1,\n\t\tdate2,\n\t\tseparator || ' - ',\n\t\tisRTL\n\t);\n}\n\n/*\nRenders a range with an already-parsed format string.\n*/\nfunction renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {\n\tvar sameUnits = parsedFormat.sameUnits;\n\tvar unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons\n\tvar unzonedDate2 = date2.clone().stripZone(); // \"\n\n\tvar renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);\n\tvar renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);\n\n\tvar leftI;\n\tvar leftStr = '';\n\tvar rightI;\n\tvar rightStr = '';\n\tvar middleI;\n\tvar middleStr1 = '';\n\tvar middleStr2 = '';\n\tvar middleStr = '';\n\n\t// Start at the leftmost side of the formatting string and continue until you hit a token\n\t// that is not the same between dates.\n\tfor (\n\t\tleftI = 0;\n\t\tleftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI]));\n\t\tleftI++\n\t) {\n\t\tleftStr += renderedParts1[leftI];\n\t}\n\n\t// Similarly, start at the rightmost side of the formatting string and move left\n\tfor (\n\t\trightI = sameUnits.length - 1;\n\t\trightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI]));\n\t\trightI--\n\t) {\n\t\t// If current chunk is on the boundary of unique date-content, and is a special-case\n\t\t// date-formatting postfix character, then don't consume it. Consider it unique date-content.\n\t\t// TODO: make configurable\n\t\tif (rightI - 1 === leftI && renderedParts1[rightI] === '.') {\n\t\t\tbreak;\n\t\t}\n\n\t\trightStr = renderedParts1[rightI] + rightStr;\n\t}\n\n\t// The area in the middle is different for both of the dates.\n\t// Collect them distinctly so we can jam them together later.\n\tfor (middleI = leftI; middleI <= rightI; middleI++) {\n\t\tmiddleStr1 += renderedParts1[middleI];\n\t\tmiddleStr2 += renderedParts2[middleI];\n\t}\n\n\tif (middleStr1 || middleStr2) {\n\t\tif (isRTL) {\n\t\t\tmiddleStr = middleStr2 + separator + middleStr1;\n\t\t}\n\t\telse {\n\t\t\tmiddleStr = middleStr1 + separator + middleStr2;\n\t\t}\n\t}\n\n\treturn processMaybeMarkers(\n\t\tleftStr + middleStr + rightStr\n\t);\n}\n\n\n// Format String Parsing\n// ---------------------------------------------------------------------------------------------------------------------\n\nvar parsedFormatStrCache = {};\n\n/*\nReturns a parsed format string, leveraging a cache.\n*/\nfunction getParsedFormatString(formatStr) {\n\treturn parsedFormatStrCache[formatStr] ||\n\t\t(parsedFormatStrCache[formatStr] = parseFormatString(formatStr));\n}\n\n/*\nParses a format string into the following:\n- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.\n- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like \"day\"),\n that indicates how similar a range's start & end must be in order to share the same formatted text.\n If not a token, then the value is null.\n Always a flat array (not nested liked \"chunks\").\n*/\nfunction parseFormatString(formatStr) {\n\tvar chunks = chunkFormatString(formatStr);\n\t\n\treturn {\n\t\tfakeFormatString: buildFakeFormatString(chunks),\n\t\tsameUnits: buildSameUnits(chunks)\n\t};\n}\n\n/*\nBreak the formatting string into an array of chunks.\nA 'maybe' chunk will have nested chunks.\n*/\nfunction chunkFormatString(formatStr) {\n\tvar chunks = [];\n\tvar match;\n\n\t// TODO: more descrimination\n\t// \\4 is a backreference to the first character of a multi-character set.\n\tvar chunker = /\\[([^\\]]*)\\]|\\(([^\\)]*)\\)|(LTS|LT|(\\w)\\4*o?)|([^\\w\\[\\(]+)/g;\n\n\twhile ((match = chunker.exec(formatStr))) {\n\t\tif (match[1]) { // a literal string inside [ ... ]\n\t\t\tchunks.push.apply(chunks, // append\n\t\t\t\tsplitStringLiteral(match[1])\n\t\t\t);\n\t\t}\n\t\telse if (match[2]) { // non-zero formatting inside ( ... )\n\t\t\tchunks.push({ maybe: chunkFormatString(match[2]) });\n\t\t}\n\t\telse if (match[3]) { // a formatting token\n\t\t\tchunks.push({ token: match[3] });\n\t\t}\n\t\telse if (match[5]) { // an unenclosed literal string\n\t\t\tchunks.push.apply(chunks, // append\n\t\t\t\tsplitStringLiteral(match[5])\n\t\t\t);\n\t\t}\n\t}\n\n\treturn chunks;\n}\n\n/*\nPotentially splits a literal-text string into multiple parts. For special cases.\n*/\nfunction splitStringLiteral(s) {\n\tif (s === '. ') {\n\t\treturn [ '.', ' ' ]; // for locales with periods bound to the end of each year/month/date\n\t}\n\telse {\n\t\treturn [ s ];\n\t}\n}\n\n/*\nGiven chunks parsed from a real format string, generate a fake (aka \"intermediate\") format string with special control\ncharacters that will eventually be given to moment for formatting, and then post-processed.\n*/\nfunction buildFakeFormatString(chunks) {\n\tvar parts = [];\n\tvar i, chunk;\n\n\tfor (i = 0; i < chunks.length; i++) {\n\t\tchunk = chunks[i];\n\n\t\tif (typeof chunk === 'string') {\n\t\t\tparts.push('[' + chunk + ']');\n\t\t}\n\t\telse if (chunk.token) {\n\t\t\tif (chunk.token in specialTokens) {\n\t\t\t\tparts.push(\n\t\t\t\t\tSPECIAL_TOKEN_MARKER + // useful during post-processing\n\t\t\t\t\t'[' + chunk.token + ']' // preserve as literal text\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tparts.push(chunk.token); // unprotected text implies a format string\n\t\t\t}\n\t\t}\n\t\telse if (chunk.maybe) {\n\t\t\tparts.push(\n\t\t\t\tMAYBE_MARKER + // useful during post-processing\n\t\t\t\tbuildFakeFormatString(chunk.maybe) +\n\t\t\t\tMAYBE_MARKER\n\t\t\t);\n\t\t}\n\t}\n\n\treturn parts.join(PART_SEPARATOR);\n}\n\n/*\nGiven parsed chunks from a real formatting string, generates an array of unit strings (like \"day\") that indicate\nin which regard two dates must be similar in order to share range formatting text.\nThe `chunks` can be nested (because of \"maybe\" chunks), however, the returned array will be flat.\n*/\nfunction buildSameUnits(chunks) {\n\tvar units = [];\n\tvar i, chunk;\n\tvar tokenInfo;\n\n\tfor (i = 0; i < chunks.length; i++) {\n\t\tchunk = chunks[i];\n\n\t\tif (chunk.token) {\n\t\t\ttokenInfo = largeTokenMap[chunk.token.charAt(0)];\n\t\t\tunits.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second\n\t\t}\n\t\telse if (chunk.maybe) {\n\t\t\tunits.push.apply(units, // append\n\t\t\t\tbuildSameUnits(chunk.maybe)\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tunits.push(null);\n\t\t}\n\t}\n\n\treturn units;\n}\n\n\n// Rendering to text\n// ---------------------------------------------------------------------------------------------------------------------\n\n/*\nFormats a date with a fake format string, post-processes the control characters, then returns.\n*/\nfunction renderFakeFormatString(fakeFormatString, date) {\n\treturn processMaybeMarkers(\n\t\trenderFakeFormatStringParts(fakeFormatString, date).join('')\n\t);\n}\n\n/*\nFormats a date into parts that will have been post-processed, EXCEPT for the \"maybe\" markers.\n*/\nfunction renderFakeFormatStringParts(fakeFormatString, date) {\n\tvar parts = [];\n\tvar fakeRender = oldMomentFormat(date, fakeFormatString);\n\tvar fakeParts = fakeRender.split(PART_SEPARATOR);\n\tvar i, fakePart;\n\n\tfor (i = 0; i < fakeParts.length; i++) {\n\t\tfakePart = fakeParts[i];\n\n\t\tif (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {\n\t\t\tparts.push(\n\t\t\t\t// the literal string IS the token's name.\n\t\t\t\t// call special token's registered function.\n\t\t\t\tspecialTokens[fakePart.substring(1)](date)\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tparts.push(fakePart);\n\t\t}\n\t}\n\n\treturn parts;\n}\n\n/*\nAccepts an almost-finally-formatted string and processes the \"maybe\" control characters, returning a new string.\n*/\nfunction processMaybeMarkers(s) {\n\treturn s.replace(MAYBE_REGEXP, function(m0, m1) { // regex assumed to have 'g' flag\n\t\tif (m1.match(/[1-9]/)) { // any non-zero numeric characters?\n\t\t\treturn m1;\n\t\t}\n\t\telse {\n\t\t\treturn '';\n\t\t}\n\t});\n}\n\n\n// Misc Utils\n// -------------------------------------------------------------------------------------------------\n\n/*\nReturns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.\n*/\nfunction queryMostGranularFormatUnit(formatStr) {\n\tvar chunks = chunkFormatString(formatStr);\n\tvar i, chunk;\n\tvar candidate;\n\tvar best;\n\n\tfor (i = 0; i < chunks.length; i++) {\n\t\tchunk = chunks[i];\n\n\t\tif (chunk.token) {\n\t\t\tcandidate = largeTokenMap[chunk.token.charAt(0)];\n\t\t\tif (candidate) {\n\t\t\t\tif (!best || candidate.value > best.value) {\n\t\t\t\t\tbest = candidate;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (best) {\n\t\treturn best.unit;\n\t}\n\n\treturn null;\n};\n\n})();\n\n// quick local references\nvar formatDate = FC.formatDate;\nvar formatRange = FC.formatRange;\nvar oldMomentFormat = FC.oldMomentFormat;\n\n;;\n\nFC.Class = Class; // export\n\n// Class that all other classes will inherit from\nfunction Class() { }\n\n\n// Called on a class to create a subclass.\n// Last argument contains instance methods. Any argument before the last are considered mixins.\nClass.extend = function() {\n\tvar len = arguments.length;\n\tvar i;\n\tvar members;\n\n\tfor (i = 0; i < len; i++) {\n\t\tmembers = arguments[i];\n\t\tif (i < len - 1) { // not the last argument?\n\t\t\tmixIntoClass(this, members);\n\t\t}\n\t}\n\n\treturn extendClass(this, members || {}); // members will be undefined if no arguments\n};\n\n\n// Adds new member variables/methods to the class's prototype.\n// Can be called with another class, or a plain object hash containing new members.\nClass.mixin = function(members) {\n\tmixIntoClass(this, members);\n};\n\n\nfunction extendClass(superClass, members) {\n\tvar subClass;\n\n\t// ensure a constructor for the subclass, forwarding all arguments to the super-constructor if it doesn't exist\n\tif (hasOwnProp(members, 'constructor')) {\n\t\tsubClass = members.constructor;\n\t}\n\tif (typeof subClass !== 'function') {\n\t\tsubClass = members.constructor = function() {\n\t\t\tsuperClass.apply(this, arguments);\n\t\t};\n\t}\n\n\t// build the base prototype for the subclass, which is an new object chained to the superclass's prototype\n\tsubClass.prototype = createObject(superClass.prototype);\n\n\t// copy each member variable/method onto the the subclass's prototype\n\tcopyOwnProps(members, subClass.prototype);\n\n\t// copy over all class variables/methods to the subclass, such as `extend` and `mixin`\n\tcopyOwnProps(superClass, subClass);\n\n\treturn subClass;\n}\n\n\nfunction mixIntoClass(theClass, members) {\n\tcopyOwnProps(members, theClass.prototype);\n}\n;;\n\nvar Model = Class.extend(EmitterMixin, ListenerMixin, {\n\n\t_props: null,\n\t_watchers: null,\n\t_globalWatchArgs: null,\n\n\tconstructor: function() {\n\t\tthis._watchers = {};\n\t\tthis._props = {};\n\t\tthis.applyGlobalWatchers();\n\t},\n\n\tapplyGlobalWatchers: function() {\n\t\tvar argSets = this._globalWatchArgs || [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < argSets.length; i++) {\n\t\t\tthis.watch.apply(this, argSets[i]);\n\t\t}\n\t},\n\n\thas: function(name) {\n\t\treturn name in this._props;\n\t},\n\n\tget: function(name) {\n\t\tif (name === undefined) {\n\t\t\treturn this._props;\n\t\t}\n\n\t\treturn this._props[name];\n\t},\n\n\tset: function(name, val) {\n\t\tvar newProps;\n\n\t\tif (typeof name === 'string') {\n\t\t\tnewProps = {};\n\t\t\tnewProps[name] = val === undefined ? null : val;\n\t\t}\n\t\telse {\n\t\t\tnewProps = name;\n\t\t}\n\n\t\tthis.setProps(newProps);\n\t},\n\n\treset: function(newProps) {\n\t\tvar oldProps = this._props;\n\t\tvar changeset = {}; // will have undefined's to signal unsets\n\t\tvar name;\n\n\t\tfor (name in oldProps) {\n\t\t\tchangeset[name] = undefined;\n\t\t}\n\n\t\tfor (name in newProps) {\n\t\t\tchangeset[name] = newProps[name];\n\t\t}\n\n\t\tthis.setProps(changeset);\n\t},\n\n\tunset: function(name) { // accepts a string or array of strings\n\t\tvar newProps = {};\n\t\tvar names;\n\t\tvar i;\n\n\t\tif (typeof name === 'string') {\n\t\t\tnames = [ name ];\n\t\t}\n\t\telse {\n\t\t\tnames = name;\n\t\t}\n\n\t\tfor (i = 0; i < names.length; i++) {\n\t\t\tnewProps[names[i]] = undefined;\n\t\t}\n\n\t\tthis.setProps(newProps);\n\t},\n\n\tsetProps: function(newProps) {\n\t\tvar changedProps = {};\n\t\tvar changedCnt = 0;\n\t\tvar name, val;\n\n\t\tfor (name in newProps) {\n\t\t\tval = newProps[name];\n\n\t\t\t// a change in value?\n\t\t\t// if an object, don't check equality, because might have been mutated internally.\n\t\t\t// TODO: eventually enforce immutability.\n\t\t\tif (\n\t\t\t\ttypeof val === 'object' ||\n\t\t\t\tval !== this._props[name]\n\t\t\t) {\n\t\t\t\tchangedProps[name] = val;\n\t\t\t\tchangedCnt++;\n\t\t\t}\n\t\t}\n\n\t\tif (changedCnt) {\n\n\t\t\tthis.trigger('before:batchChange', changedProps);\n\n\t\t\tfor (name in changedProps) {\n\t\t\t\tval = changedProps[name];\n\n\t\t\t\tthis.trigger('before:change', name, val);\n\t\t\t\tthis.trigger('before:change:' + name, val);\n\t\t\t}\n\n\t\t\tfor (name in changedProps) {\n\t\t\t\tval = changedProps[name];\n\n\t\t\t\tif (val === undefined) {\n\t\t\t\t\tdelete this._props[name];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis._props[name] = val;\n\t\t\t\t}\n\n\t\t\t\tthis.trigger('change:' + name, val);\n\t\t\t\tthis.trigger('change', name, val);\n\t\t\t}\n\n\t\t\tthis.trigger('batchChange', changedProps);\n\t\t}\n\t},\n\n\twatch: function(name, depList, startFunc, stopFunc) {\n\t\tvar _this = this;\n\n\t\tthis.unwatch(name);\n\n\t\tthis._watchers[name] = this._watchDeps(depList, function(deps) {\n\t\t\tvar res = startFunc.call(_this, deps);\n\n\t\t\tif (res && res.then) {\n\t\t\t\t_this.unset(name); // put in an unset state while resolving\n\t\t\t\tres.then(function(val) {\n\t\t\t\t\t_this.set(name, val);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_this.set(name, res);\n\t\t\t}\n\t\t}, function() {\n\t\t\t_this.unset(name);\n\n\t\t\tif (stopFunc) {\n\t\t\t\tstopFunc.call(_this);\n\t\t\t}\n\t\t});\n\t},\n\n\tunwatch: function(name) {\n\t\tvar watcher = this._watchers[name];\n\n\t\tif (watcher) {\n\t\t\tdelete this._watchers[name];\n\t\t\twatcher.teardown();\n\t\t}\n\t},\n\n\t_watchDeps: function(depList, startFunc, stopFunc) {\n\t\tvar _this = this;\n\t\tvar queuedChangeCnt = 0;\n\t\tvar depCnt = depList.length;\n\t\tvar satisfyCnt = 0;\n\t\tvar values = {}; // what's passed as the `deps` arguments\n\t\tvar bindTuples = []; // array of [ eventName, handlerFunc ] arrays\n\t\tvar isCallingStop = false;\n\n\t\tfunction onBeforeDepChange(depName, val, isOptional) {\n\t\t\tqueuedChangeCnt++;\n\t\t\tif (queuedChangeCnt === 1) { // first change to cause a \"stop\" ?\n\t\t\t\tif (satisfyCnt === depCnt) { // all deps previously satisfied?\n\t\t\t\t\tisCallingStop = true;\n\t\t\t\t\tstopFunc();\n\t\t\t\t\tisCallingStop = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onDepChange(depName, val, isOptional) {\n\n\t\t\tif (val === undefined) { // unsetting a value?\n\n\t\t\t\t// required dependency that was previously set?\n\t\t\t\tif (!isOptional && values[depName] !== undefined) {\n\t\t\t\t\tsatisfyCnt--;\n\t\t\t\t}\n\n\t\t\t\tdelete values[depName];\n\t\t\t}\n\t\t\telse { // setting a value?\n\n\t\t\t\t// required dependency that was previously unset?\n\t\t\t\tif (!isOptional && values[depName] === undefined) {\n\t\t\t\t\tsatisfyCnt++;\n\t\t\t\t}\n\n\t\t\t\tvalues[depName] = val;\n\t\t\t}\n\n\t\t\tqueuedChangeCnt--;\n\t\t\tif (!queuedChangeCnt) { // last change to cause a \"start\"?\n\n\t\t\t\t// now finally satisfied or satisfied all along?\n\t\t\t\tif (satisfyCnt === depCnt) {\n\n\t\t\t\t\t// if the stopFunc initiated another value change, ignore it.\n\t\t\t\t\t// it will be processed by another change event anyway.\n\t\t\t\t\tif (!isCallingStop) {\n\t\t\t\t\t\tstartFunc(values);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// intercept for .on() that remembers handlers\n\t\tfunction bind(eventName, handler) {\n\t\t\t_this.on(eventName, handler);\n\t\t\tbindTuples.push([ eventName, handler ]);\n\t\t}\n\n\t\t// listen to dependency changes\n\t\tdepList.forEach(function(depName) {\n\t\t\tvar isOptional = false;\n\n\t\t\tif (depName.charAt(0) === '?') { // TODO: more DRY\n\t\t\t\tdepName = depName.substring(1);\n\t\t\t\tisOptional = true;\n\t\t\t}\n\n\t\t\tbind('before:change:' + depName, function(val) {\n\t\t\t\tonBeforeDepChange(depName, val, isOptional);\n\t\t\t});\n\n\t\t\tbind('change:' + depName, function(val) {\n\t\t\t\tonDepChange(depName, val, isOptional);\n\t\t\t});\n\t\t});\n\n\t\t// process current dependency values\n\t\tdepList.forEach(function(depName) {\n\t\t\tvar isOptional = false;\n\n\t\t\tif (depName.charAt(0) === '?') { // TODO: more DRY\n\t\t\t\tdepName = depName.substring(1);\n\t\t\t\tisOptional = true;\n\t\t\t}\n\n\t\t\tif (_this.has(depName)) {\n\t\t\t\tvalues[depName] = _this.get(depName);\n\t\t\t\tsatisfyCnt++;\n\t\t\t}\n\t\t\telse if (isOptional) {\n\t\t\t\tsatisfyCnt++;\n\t\t\t}\n\t\t});\n\n\t\t// initially satisfied\n\t\tif (satisfyCnt === depCnt) {\n\t\t\tstartFunc(values);\n\t\t}\n\n\t\treturn {\n\t\t\tteardown: function() {\n\t\t\t\t// remove all handlers\n\t\t\t\tfor (var i = 0; i < bindTuples.length; i++) {\n\t\t\t\t\t_this.off(bindTuples[i][0], bindTuples[i][1]);\n\t\t\t\t}\n\t\t\t\tbindTuples = null;\n\n\t\t\t\t// was satisfied, so call stopFunc\n\t\t\t\tif (satisfyCnt === depCnt) {\n\t\t\t\t\tstopFunc();\n\t\t\t\t}\n\t\t\t},\n\t\t\tflash: function() {\n\t\t\t\tif (satisfyCnt === depCnt) {\n\t\t\t\t\tstopFunc();\n\t\t\t\t\tstartFunc(values);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t},\n\n\tflash: function(name) {\n\t\tvar watcher = this._watchers[name];\n\n\t\tif (watcher) {\n\t\t\twatcher.flash();\n\t\t}\n\t}\n\n});\n\n\nModel.watch = function(/* same arguments as this.watch() */) {\n\tvar proto = this.prototype;\n\n\tif (!proto._globalWatchArgs) {\n\t\tproto._globalWatchArgs = [];\n\t}\n\n\tproto._globalWatchArgs.push(arguments);\n};\n\n\nFC.Model = Model;\n\n\n;;\n\nvar Promise = {\n\n\tconstruct: function(executor) {\n\t\tvar deferred = $.Deferred();\n\t\tvar promise = deferred.promise();\n\n\t\tif (typeof executor === 'function') {\n\t\t\texecutor(\n\t\t\t\tfunction(val) { // resolve\n\t\t\t\t\tdeferred.resolve(val);\n\t\t\t\t\tattachImmediatelyResolvingThen(promise, val);\n\t\t\t\t},\n\t\t\t\tfunction() { // reject\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t\tattachImmediatelyRejectingThen(promise);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn promise;\n\t},\n\n\tresolve: function(val) {\n\t\tvar deferred = $.Deferred().resolve(val);\n\t\tvar promise = deferred.promise();\n\n\t\tattachImmediatelyResolvingThen(promise, val);\n\n\t\treturn promise;\n\t},\n\n\treject: function() {\n\t\tvar deferred = $.Deferred().reject();\n\t\tvar promise = deferred.promise();\n\n\t\tattachImmediatelyRejectingThen(promise);\n\n\t\treturn promise;\n\t}\n\n};\n\n\nfunction attachImmediatelyResolvingThen(promise, val) {\n\tpromise.then = function(onResolve) {\n\t\tif (typeof onResolve === 'function') {\n\t\t\tonResolve(val);\n\t\t}\n\t\treturn promise; // for chaining\n\t};\n}\n\n\nfunction attachImmediatelyRejectingThen(promise) {\n\tpromise.then = function(onResolve, onReject) {\n\t\tif (typeof onReject === 'function') {\n\t\t\tonReject();\n\t\t}\n\t\treturn promise; // for chaining\n\t};\n}\n\n\nFC.Promise = Promise;\n\n;;\n\nvar TaskQueue = Class.extend(EmitterMixin, {\n\n\tq: null,\n\tisPaused: false,\n\tisRunning: false,\n\n\n\tconstructor: function() {\n\t\tthis.q = [];\n\t},\n\n\n\tqueue: function(/* taskFunc, taskFunc... */) {\n\t\tthis.q.push.apply(this.q, arguments); // append\n\t\tthis.tryStart();\n\t},\n\n\n\tpause: function() {\n\t\tthis.isPaused = true;\n\t},\n\n\n\tresume: function() {\n\t\tthis.isPaused = false;\n\t\tthis.tryStart();\n\t},\n\n\n\ttryStart: function() {\n\t\tif (!this.isRunning && this.canRunNext()) {\n\t\t\tthis.isRunning = true;\n\t\t\tthis.trigger('start');\n\t\t\tthis.runNext();\n\t\t}\n\t},\n\n\n\tcanRunNext: function() {\n\t\treturn !this.isPaused && this.q.length;\n\t},\n\n\n\trunNext: function() { // does not check canRunNext\n\t\tthis.runTask(this.q.shift());\n\t},\n\n\n\trunTask: function(task) {\n\t\tthis.runTaskFunc(task);\n\t},\n\n\n\trunTaskFunc: function(taskFunc) {\n\t\tvar _this = this;\n\t\tvar res = taskFunc();\n\n\t\tif (res && res.then) {\n\t\t\tres.then(done);\n\t\t}\n\t\telse {\n\t\t\tdone();\n\t\t}\n\n\t\tfunction done() {\n\t\t\tif (_this.canRunNext()) {\n\t\t\t\t_this.runNext();\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_this.isRunning = false;\n\t\t\t\t_this.trigger('stop');\n\t\t\t}\n\t\t}\n\t}\n\n});\n\nFC.TaskQueue = TaskQueue;\n\n;;\n\nvar RenderQueue = TaskQueue.extend({\n\n\twaitsByNamespace: null,\n\twaitNamespace: null,\n\twaitId: null,\n\n\n\tconstructor: function(waitsByNamespace) {\n\t\tTaskQueue.call(this); // super-constructor\n\n\t\tthis.waitsByNamespace = waitsByNamespace || {};\n\t},\n\n\n\tqueue: function(taskFunc, namespace, type) {\n\t\tvar task = {\n\t\t\tfunc: taskFunc,\n\t\t\tnamespace: namespace,\n\t\t\ttype: type\n\t\t};\n\t\tvar waitMs;\n\n\t\tif (namespace) {\n\t\t\twaitMs = this.waitsByNamespace[namespace];\n\t\t}\n\n\t\tif (this.waitNamespace) {\n\t\t\tif (namespace === this.waitNamespace && waitMs != null) {\n\t\t\t\tthis.delayWait(waitMs);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.clearWait();\n\t\t\t\tthis.tryStart();\n\t\t\t}\n\t\t}\n\n\t\tif (this.compoundTask(task)) { // appended to queue?\n\n\t\t\tif (!this.waitNamespace && waitMs != null) {\n\t\t\t\tthis.startWait(namespace, waitMs);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.tryStart();\n\t\t\t}\n\t\t}\n\t},\n\n\n\tstartWait: function(namespace, waitMs) {\n\t\tthis.waitNamespace = namespace;\n\t\tthis.spawnWait(waitMs);\n\t},\n\n\n\tdelayWait: function(waitMs) {\n\t\tclearTimeout(this.waitId);\n\t\tthis.spawnWait(waitMs);\n\t},\n\n\n\tspawnWait: function(waitMs) {\n\t\tvar _this = this;\n\n\t\tthis.waitId = setTimeout(function() {\n\t\t\t_this.waitNamespace = null;\n\t\t\t_this.tryStart();\n\t\t}, waitMs);\n\t},\n\n\n\tclearWait: function() {\n\t\tif (this.waitNamespace) {\n\t\t\tclearTimeout(this.waitId);\n\t\t\tthis.waitId = null;\n\t\t\tthis.waitNamespace = null;\n\t\t}\n\t},\n\n\n\tcanRunNext: function() {\n\t\tif (!TaskQueue.prototype.canRunNext.apply(this, arguments)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// waiting for a certain namespace to stop receiving tasks?\n\t\tif (this.waitNamespace) {\n\n\t\t\t// if there was a different namespace task in the meantime,\n\t\t\t// that forces all previously-waiting tasks to suddenly execute.\n\t\t\t// TODO: find a way to do this in constant time.\n\t\t\tfor (var q = this.q, i = 0; i < q.length; i++) {\n\t\t\t\tif (q[i].namespace !== this.waitNamespace) {\n\t\t\t\t\treturn true; // allow execution\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\n\trunTask: function(task) {\n\t\tthis.runTaskFunc(task.func);\n\t},\n\n\n\tcompoundTask: function(newTask) {\n\t\tvar q = this.q;\n\t\tvar shouldAppend = true;\n\t\tvar i, task;\n\n\t\tif (newTask.namespace) {\n\n\t\t\tif (newTask.type === 'destroy' || newTask.type === 'init') {\n\n\t\t\t\t// remove all add/remove ops with same namespace, regardless of order\n\t\t\t\tfor (i = q.length - 1; i >= 0; i--) {\n\t\t\t\t\ttask = q[i];\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttask.namespace === newTask.namespace &&\n\t\t\t\t\t\t(task.type === 'add' || task.type === 'remove')\n\t\t\t\t\t) {\n\t\t\t\t\t\tq.splice(i, 1); // remove task\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (newTask.type === 'destroy') {\n\t\t\t\t\t// eat away final init/destroy operation\n\t\t\t\t\tif (q.length) {\n\t\t\t\t\t\ttask = q[q.length - 1]; // last task\n\n\t\t\t\t\t\tif (task.namespace === newTask.namespace) {\n\n\t\t\t\t\t\t\t// the init and our destroy cancel each other out\n\t\t\t\t\t\t\tif (task.type === 'init') {\n\t\t\t\t\t\t\t\tshouldAppend = false;\n\t\t\t\t\t\t\t\tq.pop();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// prefer to use the destroy operation that's already present\n\t\t\t\t\t\t\telse if (task.type === 'destroy') {\n\t\t\t\t\t\t\t\tshouldAppend = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (newTask.type === 'init') {\n\t\t\t\t\t// eat away final init operation\n\t\t\t\t\tif (q.length) {\n\t\t\t\t\t\ttask = q[q.length - 1]; // last task\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttask.namespace === newTask.namespace &&\n\t\t\t\t\t\t\ttask.type === 'init'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// our init operation takes precedence\n\t\t\t\t\t\t\tq.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (shouldAppend) {\n\t\t\tq.push(newTask);\n\t\t}\n\n\t\treturn shouldAppend;\n\t}\n\n});\n\nFC.RenderQueue = RenderQueue;\n\n;;\n\nvar EmitterMixin = FC.EmitterMixin = {\n\n\t// jQuery-ification via $(this) allows a non-DOM object to have\n\t// the same event handling capabilities (including namespaces).\n\n\n\ton: function(types, handler) {\n\t\t$(this).on(types, this._prepareIntercept(handler));\n\t\treturn this; // for chaining\n\t},\n\n\n\tone: function(types, handler) {\n\t\t$(this).one(types, this._prepareIntercept(handler));\n\t\treturn this; // for chaining\n\t},\n\n\n\t_prepareIntercept: function(handler) {\n\t\t// handlers are always called with an \"event\" object as their first param.\n\t\t// sneak the `this` context and arguments into the extra parameter object\n\t\t// and forward them on to the original handler.\n\t\tvar intercept = function(ev, extra) {\n\t\t\treturn handler.apply(\n\t\t\t\textra.context || this,\n\t\t\t\textra.args || []\n\t\t\t);\n\t\t};\n\n\t\t// mimick jQuery's internal \"proxy\" system (risky, I know)\n\t\t// causing all functions with the same .guid to appear to be the same.\n\t\t// https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448\n\t\t// this is needed for calling .off with the original non-intercept handler.\n\t\tif (!handler.guid) {\n\t\t\thandler.guid = $.guid++;\n\t\t}\n\t\tintercept.guid = handler.guid;\n\n\t\treturn intercept;\n\t},\n\n\n\toff: function(types, handler) {\n\t\t$(this).off(types, handler);\n\n\t\treturn this; // for chaining\n\t},\n\n\n\ttrigger: function(types) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1); // arguments after the first\n\n\t\t// pass in \"extra\" info to the intercept\n\t\t$(this).triggerHandler(types, { args: args });\n\n\t\treturn this; // for chaining\n\t},\n\n\n\ttriggerWith: function(types, context, args) {\n\n\t\t// `triggerHandler` is less reliant on the DOM compared to `trigger`.\n\t\t// pass in \"extra\" info to the intercept.\n\t\t$(this).triggerHandler(types, { context: context, args: args });\n\n\t\treturn this; // for chaining\n\t}\n\n};\n\n;;\n\n/*\nUtility methods for easily listening to events on another object,\nand more importantly, easily unlistening from them.\n*/\nvar ListenerMixin = FC.ListenerMixin = (function() {\n\tvar guid = 0;\n\tvar ListenerMixin = {\n\n\t\tlistenerId: null,\n\n\t\t/*\n\t\tGiven an `other` object that has on/off methods, bind the given `callback` to an event by the given name.\n\t\tThe `callback` will be called with the `this` context of the object that .listenTo is being called on.\n\t\tCan be called:\n\t\t\t.listenTo(other, eventName, callback)\n\t\tOR\n\t\t\t.listenTo(other, {\n\t\t\t\teventName1: callback1,\n\t\t\t\teventName2: callback2\n\t\t\t})\n\t\t*/\n\t\tlistenTo: function(other, arg, callback) {\n\t\t\tif (typeof arg === 'object') { // given dictionary of callbacks\n\t\t\t\tfor (var eventName in arg) {\n\t\t\t\t\tif (arg.hasOwnProperty(eventName)) {\n\t\t\t\t\t\tthis.listenTo(other, eventName, arg[eventName]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (typeof arg === 'string') {\n\t\t\t\tother.on(\n\t\t\t\t\targ + '.' + this.getListenerNamespace(), // use event namespacing to identify this object\n\t\t\t\t\t$.proxy(callback, this) // always use `this` context\n\t\t\t\t\t\t// the usually-undesired jQuery guid behavior doesn't matter,\n\t\t\t\t\t\t// because we always unbind via namespace\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\tCauses the current object to stop listening to events on the `other` object.\n\t\t`eventName` is optional. If omitted, will stop listening to ALL events on `other`.\n\t\t*/\n\t\tstopListeningTo: function(other, eventName) {\n\t\t\tother.off((eventName || '') + '.' + this.getListenerNamespace());\n\t\t},\n\n\t\t/*\n\t\tReturns a string, unique to this object, to be used for event namespacing\n\t\t*/\n\t\tgetListenerNamespace: function() {\n\t\t\tif (this.listenerId == null) {\n\t\t\t\tthis.listenerId = guid++;\n\t\t\t}\n\t\t\treturn '_listener' + this.listenerId;\n\t\t}\n\n\t};\n\treturn ListenerMixin;\n})();\n;;\n\n/* A rectangular panel that is absolutely positioned over other content\n------------------------------------------------------------------------------------------------------------------------\nOptions:\n\t- className (string)\n\t- content (HTML string or jQuery element set)\n\t- parentEl\n\t- top\n\t- left\n\t- right (the x coord of where the right edge should be. not a \"CSS\" right)\n\t- autoHide (boolean)\n\t- show (callback)\n\t- hide (callback)\n*/\n\nvar Popover = Class.extend(ListenerMixin, {\n\n\tisHidden: true,\n\toptions: null,\n\tel: null, // the container element for the popover. generated by this object\n\tmargin: 10, // the space required between the popover and the edges of the scroll container\n\n\n\tconstructor: function(options) {\n\t\tthis.options = options || {};\n\t},\n\n\n\t// Shows the popover on the specified position. Renders it if not already\n\tshow: function() {\n\t\tif (this.isHidden) {\n\t\t\tif (!this.el) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.el.show();\n\t\t\tthis.position();\n\t\t\tthis.isHidden = false;\n\t\t\tthis.trigger('show');\n\t\t}\n\t},\n\n\n\t// Hides the popover, through CSS, but does not remove it from the DOM\n\thide: function() {\n\t\tif (!this.isHidden) {\n\t\t\tthis.el.hide();\n\t\t\tthis.isHidden = true;\n\t\t\tthis.trigger('hide');\n\t\t}\n\t},\n\n\n\t// Creates `this.el` and renders content inside of it\n\trender: function() {\n\t\tvar _this = this;\n\t\tvar options = this.options;\n\n\t\tthis.el = $('
')\n\t\t\t.addClass(options.className || '')\n\t\t\t.css({\n\t\t\t\t// position initially to the top left to avoid creating scrollbars\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t})\n\t\t\t.append(options.content)\n\t\t\t.appendTo(options.parentEl);\n\n\t\t// when a click happens on anything inside with a 'fc-close' className, hide the popover\n\t\tthis.el.on('click', '.fc-close', function() {\n\t\t\t_this.hide();\n\t\t});\n\n\t\tif (options.autoHide) {\n\t\t\tthis.listenTo($(document), 'mousedown', this.documentMousedown);\n\t\t}\n\t},\n\n\n\t// Triggered when the user clicks *anywhere* in the document, for the autoHide feature\n\tdocumentMousedown: function(ev) {\n\t\t// only hide the popover if the click happened outside the popover\n\t\tif (this.el && !$(ev.target).closest(this.el).length) {\n\t\t\tthis.hide();\n\t\t}\n\t},\n\n\n\t// Hides and unregisters any handlers\n\tremoveElement: function() {\n\t\tthis.hide();\n\n\t\tif (this.el) {\n\t\t\tthis.el.remove();\n\t\t\tthis.el = null;\n\t\t}\n\n\t\tthis.stopListeningTo($(document), 'mousedown');\n\t},\n\n\n\t// Positions the popover optimally, using the top/left/right options\n\tposition: function() {\n\t\tvar options = this.options;\n\t\tvar origin = this.el.offsetParent().offset();\n\t\tvar width = this.el.outerWidth();\n\t\tvar height = this.el.outerHeight();\n\t\tvar windowEl = $(window);\n\t\tvar viewportEl = getScrollParent(this.el);\n\t\tvar viewportTop;\n\t\tvar viewportLeft;\n\t\tvar viewportOffset;\n\t\tvar top; // the \"position\" (not \"offset\") values for the popover\n\t\tvar left; //\n\n\t\t// compute top and left\n\t\ttop = options.top || 0;\n\t\tif (options.left !== undefined) {\n\t\t\tleft = options.left;\n\t\t}\n\t\telse if (options.right !== undefined) {\n\t\t\tleft = options.right - width; // derive the left value from the right value\n\t\t}\n\t\telse {\n\t\t\tleft = 0;\n\t\t}\n\n\t\tif (viewportEl.is(window) || viewportEl.is(document)) { // normalize getScrollParent's result\n\t\t\tviewportEl = windowEl;\n\t\t\tviewportTop = 0; // the window is always at the top left\n\t\t\tviewportLeft = 0; // (and .offset() won't work if called here)\n\t\t}\n\t\telse {\n\t\t\tviewportOffset = viewportEl.offset();\n\t\t\tviewportTop = viewportOffset.top;\n\t\t\tviewportLeft = viewportOffset.left;\n\t\t}\n\n\t\t// if the window is scrolled, it causes the visible area to be further down\n\t\tviewportTop += windowEl.scrollTop();\n\t\tviewportLeft += windowEl.scrollLeft();\n\n\t\t// constrain to the view port. if constrained by two edges, give precedence to top/left\n\t\tif (options.viewportConstrain !== false) {\n\t\t\ttop = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);\n\t\t\ttop = Math.max(top, viewportTop + this.margin);\n\t\t\tleft = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);\n\t\t\tleft = Math.max(left, viewportLeft + this.margin);\n\t\t}\n\n\t\tthis.el.css({\n\t\t\ttop: top - origin.top,\n\t\t\tleft: left - origin.left\n\t\t});\n\t},\n\n\n\t// Triggers a callback. Calls a function in the option hash of the same name.\n\t// Arguments beyond the first `name` are forwarded on.\n\t// TODO: better code reuse for this. Repeat code\n\ttrigger: function(name) {\n\t\tif (this.options[name]) {\n\t\t\tthis.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t}\n\n});\n\n;;\n\n/*\nA cache for the left/right/top/bottom/width/height values for one or more elements.\nWorks with both offset (from topleft document) and position (from offsetParent).\n\noptions:\n- els\n- isHorizontal\n- isVertical\n*/\nvar CoordCache = FC.CoordCache = Class.extend({\n\n\tels: null, // jQuery set (assumed to be siblings)\n\tforcedOffsetParentEl: null, // options can override the natural offsetParent\n\torigin: null, // {left,top} position of offsetParent of els\n\tboundingRect: null, // constrain cordinates to this rectangle. {left,right,top,bottom} or null\n\tisHorizontal: false, // whether to query for left/right/width\n\tisVertical: false, // whether to query for top/bottom/height\n\n\t// arrays of coordinates (offsets from topleft of document)\n\tlefts: null,\n\trights: null,\n\ttops: null,\n\tbottoms: null,\n\n\n\tconstructor: function(options) {\n\t\tthis.els = $(options.els);\n\t\tthis.isHorizontal = options.isHorizontal;\n\t\tthis.isVertical = options.isVertical;\n\t\tthis.forcedOffsetParentEl = options.offsetParent ? $(options.offsetParent) : null;\n\t},\n\n\n\t// Queries the els for coordinates and stores them.\n\t// Call this method before using and of the get* methods below.\n\tbuild: function() {\n\t\tvar offsetParentEl = this.forcedOffsetParentEl;\n\t\tif (!offsetParentEl && this.els.length > 0) {\n\t\t\toffsetParentEl = this.els.eq(0).offsetParent();\n\t\t}\n\n\t\tthis.origin = offsetParentEl ?\n\t\t\toffsetParentEl.offset() :\n\t\t\tnull;\n\n\t\tthis.boundingRect = this.queryBoundingRect();\n\n\t\tif (this.isHorizontal) {\n\t\t\tthis.buildElHorizontals();\n\t\t}\n\t\tif (this.isVertical) {\n\t\t\tthis.buildElVerticals();\n\t\t}\n\t},\n\n\n\t// Destroys all internal data about coordinates, freeing memory\n\tclear: function() {\n\t\tthis.origin = null;\n\t\tthis.boundingRect = null;\n\t\tthis.lefts = null;\n\t\tthis.rights = null;\n\t\tthis.tops = null;\n\t\tthis.bottoms = null;\n\t},\n\n\n\t// When called, if coord caches aren't built, builds them\n\tensureBuilt: function() {\n\t\tif (!this.origin) {\n\t\t\tthis.build();\n\t\t}\n\t},\n\n\n\t// Populates the left/right internal coordinate arrays\n\tbuildElHorizontals: function() {\n\t\tvar lefts = [];\n\t\tvar rights = [];\n\n\t\tthis.els.each(function(i, node) {\n\t\t\tvar el = $(node);\n\t\t\tvar left = el.offset().left;\n\t\t\tvar width = el.outerWidth();\n\n\t\t\tlefts.push(left);\n\t\t\trights.push(left + width);\n\t\t});\n\n\t\tthis.lefts = lefts;\n\t\tthis.rights = rights;\n\t},\n\n\n\t// Populates the top/bottom internal coordinate arrays\n\tbuildElVerticals: function() {\n\t\tvar tops = [];\n\t\tvar bottoms = [];\n\n\t\tthis.els.each(function(i, node) {\n\t\t\tvar el = $(node);\n\t\t\tvar top = el.offset().top;\n\t\t\tvar height = el.outerHeight();\n\n\t\t\ttops.push(top);\n\t\t\tbottoms.push(top + height);\n\t\t});\n\n\t\tthis.tops = tops;\n\t\tthis.bottoms = bottoms;\n\t},\n\n\n\t// Given a left offset (from document left), returns the index of the el that it horizontally intersects.\n\t// If no intersection is made, returns undefined.\n\tgetHorizontalIndex: function(leftOffset) {\n\t\tthis.ensureBuilt();\n\n\t\tvar lefts = this.lefts;\n\t\tvar rights = this.rights;\n\t\tvar len = lefts.length;\n\t\tvar i;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (leftOffset >= lefts[i] && leftOffset < rights[i]) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Given a top offset (from document top), returns the index of the el that it vertically intersects.\n\t// If no intersection is made, returns undefined.\n\tgetVerticalIndex: function(topOffset) {\n\t\tthis.ensureBuilt();\n\n\t\tvar tops = this.tops;\n\t\tvar bottoms = this.bottoms;\n\t\tvar len = tops.length;\n\t\tvar i;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (topOffset >= tops[i] && topOffset < bottoms[i]) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Gets the left offset (from document left) of the element at the given index\n\tgetLeftOffset: function(leftIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.lefts[leftIndex];\n\t},\n\n\n\t// Gets the left position (from offsetParent left) of the element at the given index\n\tgetLeftPosition: function(leftIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.lefts[leftIndex] - this.origin.left;\n\t},\n\n\n\t// Gets the right offset (from document left) of the element at the given index.\n\t// This value is NOT relative to the document's right edge, like the CSS concept of \"right\" would be.\n\tgetRightOffset: function(leftIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.rights[leftIndex];\n\t},\n\n\n\t// Gets the right position (from offsetParent left) of the element at the given index.\n\t// This value is NOT relative to the offsetParent's right edge, like the CSS concept of \"right\" would be.\n\tgetRightPosition: function(leftIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.rights[leftIndex] - this.origin.left;\n\t},\n\n\n\t// Gets the width of the element at the given index\n\tgetWidth: function(leftIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.rights[leftIndex] - this.lefts[leftIndex];\n\t},\n\n\n\t// Gets the top offset (from document top) of the element at the given index\n\tgetTopOffset: function(topIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.tops[topIndex];\n\t},\n\n\n\t// Gets the top position (from offsetParent top) of the element at the given position\n\tgetTopPosition: function(topIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.tops[topIndex] - this.origin.top;\n\t},\n\n\t// Gets the bottom offset (from the document top) of the element at the given index.\n\t// This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\n\tgetBottomOffset: function(topIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.bottoms[topIndex];\n\t},\n\n\n\t// Gets the bottom position (from the offsetParent top) of the element at the given index.\n\t// This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\n\tgetBottomPosition: function(topIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.bottoms[topIndex] - this.origin.top;\n\t},\n\n\n\t// Gets the height of the element at the given index\n\tgetHeight: function(topIndex) {\n\t\tthis.ensureBuilt();\n\t\treturn this.bottoms[topIndex] - this.tops[topIndex];\n\t},\n\n\n\t// Bounding Rect\n\t// TODO: decouple this from CoordCache\n\n\t// Compute and return what the elements' bounding rectangle is, from the user's perspective.\n\t// Right now, only returns a rectangle if constrained by an overflow:scroll element.\n\t// Returns null if there are no elements\n\tqueryBoundingRect: function() {\n\t\tvar scrollParentEl;\n\n\t\tif (this.els.length > 0) {\n\t\t\tscrollParentEl = getScrollParent(this.els.eq(0));\n\n\t\t\tif (!scrollParentEl.is(document)) {\n\t\t\t\treturn getClientRect(scrollParentEl);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t},\n\n\tisPointInBounds: function(leftOffset, topOffset) {\n\t\treturn this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);\n\t},\n\n\tisLeftInBounds: function(leftOffset) {\n\t\treturn !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);\n\t},\n\n\tisTopInBounds: function(topOffset) {\n\t\treturn !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);\n\t}\n\n});\n\n;;\n\n/* Tracks a drag's mouse movement, firing various handlers\n----------------------------------------------------------------------------------------------------------------------*/\n// TODO: use Emitter\n\nvar DragListener = FC.DragListener = Class.extend(ListenerMixin, {\n\n\toptions: null,\n\tsubjectEl: null,\n\n\t// coordinates of the initial mousedown\n\toriginX: null,\n\toriginY: null,\n\n\t// the wrapping element that scrolls, or MIGHT scroll if there's overflow.\n\t// TODO: do this for wrappers that have overflow:hidden as well.\n\tscrollEl: null,\n\n\tisInteracting: false,\n\tisDistanceSurpassed: false,\n\tisDelayEnded: false,\n\tisDragging: false,\n\tisTouch: false,\n\tisGeneric: false, // initiated by 'dragstart' (jqui)\n\n\tdelay: null,\n\tdelayTimeoutId: null,\n\tminDistance: null,\n\n\tshouldCancelTouchScroll: true,\n\tscrollAlwaysKills: false,\n\n\n\tconstructor: function(options) {\n\t\tthis.options = options || {};\n\t},\n\n\n\t// Interaction (high-level)\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tstartInteraction: function(ev, extraOptions) {\n\n\t\tif (ev.type === 'mousedown') {\n\t\t\tif (GlobalEmitter.get().shouldIgnoreMouse()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (!isPrimaryMouseButton(ev)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tev.preventDefault(); // prevents native selection in most browsers\n\t\t\t}\n\t\t}\n\n\t\tif (!this.isInteracting) {\n\n\t\t\t// process options\n\t\t\textraOptions = extraOptions || {};\n\t\t\tthis.delay = firstDefined(extraOptions.delay, this.options.delay, 0);\n\t\t\tthis.minDistance = firstDefined(extraOptions.distance, this.options.distance, 0);\n\t\t\tthis.subjectEl = this.options.subjectEl;\n\n\t\t\tpreventSelection($('body'));\n\n\t\t\tthis.isInteracting = true;\n\t\t\tthis.isTouch = getEvIsTouch(ev);\n\t\t\tthis.isGeneric = ev.type === 'dragstart';\n\t\t\tthis.isDelayEnded = false;\n\t\t\tthis.isDistanceSurpassed = false;\n\n\t\t\tthis.originX = getEvX(ev);\n\t\t\tthis.originY = getEvY(ev);\n\t\t\tthis.scrollEl = getScrollParent($(ev.target));\n\n\t\t\tthis.bindHandlers();\n\t\t\tthis.initAutoScroll();\n\t\t\tthis.handleInteractionStart(ev);\n\t\t\tthis.startDelay(ev);\n\n\t\t\tif (!this.minDistance) {\n\t\t\t\tthis.handleDistanceSurpassed(ev);\n\t\t\t}\n\t\t}\n\t},\n\n\n\thandleInteractionStart: function(ev) {\n\t\tthis.trigger('interactionStart', ev);\n\t},\n\n\n\tendInteraction: function(ev, isCancelled) {\n\t\tif (this.isInteracting) {\n\t\t\tthis.endDrag(ev);\n\n\t\t\tif (this.delayTimeoutId) {\n\t\t\t\tclearTimeout(this.delayTimeoutId);\n\t\t\t\tthis.delayTimeoutId = null;\n\t\t\t}\n\n\t\t\tthis.destroyAutoScroll();\n\t\t\tthis.unbindHandlers();\n\n\t\t\tthis.isInteracting = false;\n\t\t\tthis.handleInteractionEnd(ev, isCancelled);\n\n\t\t\tallowSelection($('body'));\n\t\t}\n\t},\n\n\n\thandleInteractionEnd: function(ev, isCancelled) {\n\t\tthis.trigger('interactionEnd', ev, isCancelled || false);\n\t},\n\n\n\t// Binding To DOM\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tbindHandlers: function() {\n\t\t// some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,\n\t\t// so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.\n\t\tvar globalEmitter = GlobalEmitter.get();\n\n\t\tif (this.isGeneric) {\n\t\t\tthis.listenTo($(document), { // might only work on iOS because of GlobalEmitter's bind :(\n\t\t\t\tdrag: this.handleMove,\n\t\t\t\tdragstop: this.endInteraction\n\t\t\t});\n\t\t}\n\t\telse if (this.isTouch) {\n\t\t\tthis.listenTo(globalEmitter, {\n\t\t\t\ttouchmove: this.handleTouchMove,\n\t\t\t\ttouchend: this.endInteraction,\n\t\t\t\tscroll: this.handleTouchScroll\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tthis.listenTo(globalEmitter, {\n\t\t\t\tmousemove: this.handleMouseMove,\n\t\t\t\tmouseup: this.endInteraction\n\t\t\t});\n\t\t}\n\n\t\tthis.listenTo(globalEmitter, {\n\t\t\tselectstart: preventDefault, // don't allow selection while dragging\n\t\t\tcontextmenu: preventDefault // long taps would open menu on Chrome dev tools\n\t\t});\n\t},\n\n\n\tunbindHandlers: function() {\n\t\tthis.stopListeningTo(GlobalEmitter.get());\n\t\tthis.stopListeningTo($(document)); // for isGeneric\n\t},\n\n\n\t// Drag (high-level)\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// extraOptions ignored if drag already started\n\tstartDrag: function(ev, extraOptions) {\n\t\tthis.startInteraction(ev, extraOptions); // ensure interaction began\n\n\t\tif (!this.isDragging) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.handleDragStart(ev);\n\t\t}\n\t},\n\n\n\thandleDragStart: function(ev) {\n\t\tthis.trigger('dragStart', ev);\n\t},\n\n\n\thandleMove: function(ev) {\n\t\tvar dx = getEvX(ev) - this.originX;\n\t\tvar dy = getEvY(ev) - this.originY;\n\t\tvar minDistance = this.minDistance;\n\t\tvar distanceSq; // current distance from the origin, squared\n\n\t\tif (!this.isDistanceSurpassed) {\n\t\t\tdistanceSq = dx * dx + dy * dy;\n\t\t\tif (distanceSq >= minDistance * minDistance) { // use pythagorean theorem\n\t\t\t\tthis.handleDistanceSurpassed(ev);\n\t\t\t}\n\t\t}\n\n\t\tif (this.isDragging) {\n\t\t\tthis.handleDrag(dx, dy, ev);\n\t\t}\n\t},\n\n\n\t// Called while the mouse is being moved and when we know a legitimate drag is taking place\n\thandleDrag: function(dx, dy, ev) {\n\t\tthis.trigger('drag', dx, dy, ev);\n\t\tthis.updateAutoScroll(ev); // will possibly cause scrolling\n\t},\n\n\n\tendDrag: function(ev) {\n\t\tif (this.isDragging) {\n\t\t\tthis.isDragging = false;\n\t\t\tthis.handleDragEnd(ev);\n\t\t}\n\t},\n\n\n\thandleDragEnd: function(ev) {\n\t\tthis.trigger('dragEnd', ev);\n\t},\n\n\n\t// Delay\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tstartDelay: function(initialEv) {\n\t\tvar _this = this;\n\n\t\tif (this.delay) {\n\t\t\tthis.delayTimeoutId = setTimeout(function() {\n\t\t\t\t_this.handleDelayEnd(initialEv);\n\t\t\t}, this.delay);\n\t\t}\n\t\telse {\n\t\t\tthis.handleDelayEnd(initialEv);\n\t\t}\n\t},\n\n\n\thandleDelayEnd: function(initialEv) {\n\t\tthis.isDelayEnded = true;\n\n\t\tif (this.isDistanceSurpassed) {\n\t\t\tthis.startDrag(initialEv);\n\t\t}\n\t},\n\n\n\t// Distance\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\thandleDistanceSurpassed: function(ev) {\n\t\tthis.isDistanceSurpassed = true;\n\n\t\tif (this.isDelayEnded) {\n\t\t\tthis.startDrag(ev);\n\t\t}\n\t},\n\n\n\t// Mouse / Touch\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\thandleTouchMove: function(ev) {\n\n\t\t// prevent inertia and touchmove-scrolling while dragging\n\t\tif (this.isDragging && this.shouldCancelTouchScroll) {\n\t\t\tev.preventDefault();\n\t\t}\n\n\t\tthis.handleMove(ev);\n\t},\n\n\n\thandleMouseMove: function(ev) {\n\t\tthis.handleMove(ev);\n\t},\n\n\n\t// Scrolling (unrelated to auto-scroll)\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\thandleTouchScroll: function(ev) {\n\t\t// if the drag is being initiated by touch, but a scroll happens before\n\t\t// the drag-initiating delay is over, cancel the drag\n\t\tif (!this.isDragging || this.scrollAlwaysKills) {\n\t\t\tthis.endInteraction(ev, true); // isCancelled=true\n\t\t}\n\t},\n\n\n\t// Utils\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Triggers a callback. Calls a function in the option hash of the same name.\n\t// Arguments beyond the first `name` are forwarded on.\n\ttrigger: function(name) {\n\t\tif (this.options[name]) {\n\t\t\tthis.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t\t// makes _methods callable by event name. TODO: kill this\n\t\tif (this['_' + name]) {\n\t\t\tthis['_' + name].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t}\n\n\n});\n\n;;\n/*\nthis.scrollEl is set in DragListener\n*/\nDragListener.mixin({\n\n\tisAutoScroll: false,\n\n\tscrollBounds: null, // { top, bottom, left, right }\n\tscrollTopVel: null, // pixels per second\n\tscrollLeftVel: null, // pixels per second\n\tscrollIntervalId: null, // ID of setTimeout for scrolling animation loop\n\n\t// defaults\n\tscrollSensitivity: 30, // pixels from edge for scrolling to start\n\tscrollSpeed: 200, // pixels per second, at maximum speed\n\tscrollIntervalMs: 50, // millisecond wait between scroll increment\n\n\n\tinitAutoScroll: function() {\n\t\tvar scrollEl = this.scrollEl;\n\n\t\tthis.isAutoScroll =\n\t\t\tthis.options.scroll &&\n\t\t\tscrollEl &&\n\t\t\t!scrollEl.is(window) &&\n\t\t\t!scrollEl.is(document);\n\n\t\tif (this.isAutoScroll) {\n\t\t\t// debounce makes sure rapid calls don't happen\n\t\t\tthis.listenTo(scrollEl, 'scroll', debounce(this.handleDebouncedScroll, 100));\n\t\t}\n\t},\n\n\n\tdestroyAutoScroll: function() {\n\t\tthis.endAutoScroll(); // kill any animation loop\n\n\t\t// remove the scroll handler if there is a scrollEl\n\t\tif (this.isAutoScroll) {\n\t\t\tthis.stopListeningTo(this.scrollEl, 'scroll'); // will probably get removed by unbindHandlers too :(\n\t\t}\n\t},\n\n\n\t// Computes and stores the bounding rectangle of scrollEl\n\tcomputeScrollBounds: function() {\n\t\tif (this.isAutoScroll) {\n\t\t\tthis.scrollBounds = getOuterRect(this.scrollEl);\n\t\t\t// TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars\n\t\t}\n\t},\n\n\n\t// Called when the dragging is in progress and scrolling should be updated\n\tupdateAutoScroll: function(ev) {\n\t\tvar sensitivity = this.scrollSensitivity;\n\t\tvar bounds = this.scrollBounds;\n\t\tvar topCloseness, bottomCloseness;\n\t\tvar leftCloseness, rightCloseness;\n\t\tvar topVel = 0;\n\t\tvar leftVel = 0;\n\n\t\tif (bounds) { // only scroll if scrollEl exists\n\n\t\t\t// compute closeness to edges. valid range is from 0.0 - 1.0\n\t\t\ttopCloseness = (sensitivity - (getEvY(ev) - bounds.top)) / sensitivity;\n\t\t\tbottomCloseness = (sensitivity - (bounds.bottom - getEvY(ev))) / sensitivity;\n\t\t\tleftCloseness = (sensitivity - (getEvX(ev) - bounds.left)) / sensitivity;\n\t\t\trightCloseness = (sensitivity - (bounds.right - getEvX(ev))) / sensitivity;\n\n\t\t\t// translate vertical closeness into velocity.\n\t\t\t// mouse must be completely in bounds for velocity to happen.\n\t\t\tif (topCloseness >= 0 && topCloseness <= 1) {\n\t\t\t\ttopVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up\n\t\t\t}\n\t\t\telse if (bottomCloseness >= 0 && bottomCloseness <= 1) {\n\t\t\t\ttopVel = bottomCloseness * this.scrollSpeed;\n\t\t\t}\n\n\t\t\t// translate horizontal closeness into velocity\n\t\t\tif (leftCloseness >= 0 && leftCloseness <= 1) {\n\t\t\t\tleftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left\n\t\t\t}\n\t\t\telse if (rightCloseness >= 0 && rightCloseness <= 1) {\n\t\t\t\tleftVel = rightCloseness * this.scrollSpeed;\n\t\t\t}\n\t\t}\n\n\t\tthis.setScrollVel(topVel, leftVel);\n\t},\n\n\n\t// Sets the speed-of-scrolling for the scrollEl\n\tsetScrollVel: function(topVel, leftVel) {\n\n\t\tthis.scrollTopVel = topVel;\n\t\tthis.scrollLeftVel = leftVel;\n\n\t\tthis.constrainScrollVel(); // massages into realistic values\n\n\t\t// if there is non-zero velocity, and an animation loop hasn't already started, then START\n\t\tif ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {\n\t\t\tthis.scrollIntervalId = setInterval(\n\t\t\t\tproxy(this, 'scrollIntervalFunc'), // scope to `this`\n\t\t\t\tthis.scrollIntervalMs\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way\n\tconstrainScrollVel: function() {\n\t\tvar el = this.scrollEl;\n\n\t\tif (this.scrollTopVel < 0) { // scrolling up?\n\t\t\tif (el.scrollTop() <= 0) { // already scrolled all the way up?\n\t\t\t\tthis.scrollTopVel = 0;\n\t\t\t}\n\t\t}\n\t\telse if (this.scrollTopVel > 0) { // scrolling down?\n\t\t\tif (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) { // already scrolled all the way down?\n\t\t\t\tthis.scrollTopVel = 0;\n\t\t\t}\n\t\t}\n\n\t\tif (this.scrollLeftVel < 0) { // scrolling left?\n\t\t\tif (el.scrollLeft() <= 0) { // already scrolled all the left?\n\t\t\t\tthis.scrollLeftVel = 0;\n\t\t\t}\n\t\t}\n\t\telse if (this.scrollLeftVel > 0) { // scrolling right?\n\t\t\tif (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) { // already scrolled all the way right?\n\t\t\t\tthis.scrollLeftVel = 0;\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// This function gets called during every iteration of the scrolling animation loop\n\tscrollIntervalFunc: function() {\n\t\tvar el = this.scrollEl;\n\t\tvar frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by\n\n\t\t// change the value of scrollEl's scroll\n\t\tif (this.scrollTopVel) {\n\t\t\tel.scrollTop(el.scrollTop() + this.scrollTopVel * frac);\n\t\t}\n\t\tif (this.scrollLeftVel) {\n\t\t\tel.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);\n\t\t}\n\n\t\tthis.constrainScrollVel(); // since the scroll values changed, recompute the velocities\n\n\t\t// if scrolled all the way, which causes the vels to be zero, stop the animation loop\n\t\tif (!this.scrollTopVel && !this.scrollLeftVel) {\n\t\t\tthis.endAutoScroll();\n\t\t}\n\t},\n\n\n\t// Kills any existing scrolling animation loop\n\tendAutoScroll: function() {\n\t\tif (this.scrollIntervalId) {\n\t\t\tclearInterval(this.scrollIntervalId);\n\t\t\tthis.scrollIntervalId = null;\n\n\t\t\tthis.handleScrollEnd();\n\t\t}\n\t},\n\n\n\t// Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)\n\thandleDebouncedScroll: function() {\n\t\t// recompute all coordinates, but *only* if this is *not* part of our scrolling animation\n\t\tif (!this.scrollIntervalId) {\n\t\t\tthis.handleScrollEnd();\n\t\t}\n\t},\n\n\n\t// Called when scrolling has stopped, whether through auto scroll, or the user scrolling\n\thandleScrollEnd: function() {\n\t}\n\n});\n;;\n\n/* Tracks mouse movements over a component and raises events about which hit the mouse is over.\n------------------------------------------------------------------------------------------------------------------------\noptions:\n- subjectEl\n- subjectCenter\n*/\n\nvar HitDragListener = DragListener.extend({\n\n\tcomponent: null, // converts coordinates to hits\n\t\t// methods: hitsNeeded, hitsNotNeeded, queryHit\n\n\torigHit: null, // the hit the mouse was over when listening started\n\thit: null, // the hit the mouse is over\n\tcoordAdjust: null, // delta that will be added to the mouse coordinates when computing collisions\n\n\n\tconstructor: function(component, options) {\n\t\tDragListener.call(this, options); // call the super-constructor\n\n\t\tthis.component = component;\n\t},\n\n\n\t// Called when drag listening starts (but a real drag has not necessarily began).\n\t// ev might be undefined if dragging was started manually.\n\thandleInteractionStart: function(ev) {\n\t\tvar subjectEl = this.subjectEl;\n\t\tvar subjectRect;\n\t\tvar origPoint;\n\t\tvar point;\n\n\t\tthis.component.hitsNeeded();\n\t\tthis.computeScrollBounds(); // for autoscroll\n\n\t\tif (ev) {\n\t\t\torigPoint = { left: getEvX(ev), top: getEvY(ev) };\n\t\t\tpoint = origPoint;\n\n\t\t\t// constrain the point to bounds of the element being dragged\n\t\t\tif (subjectEl) {\n\t\t\t\tsubjectRect = getOuterRect(subjectEl); // used for centering as well\n\t\t\t\tpoint = constrainPoint(point, subjectRect);\n\t\t\t}\n\n\t\t\tthis.origHit = this.queryHit(point.left, point.top);\n\n\t\t\t// treat the center of the subject as the collision point?\n\t\t\tif (subjectEl && this.options.subjectCenter) {\n\n\t\t\t\t// only consider the area the subject overlaps the hit. best for large subjects.\n\t\t\t\t// TODO: skip this if hit didn't supply left/right/top/bottom\n\t\t\t\tif (this.origHit) {\n\t\t\t\t\tsubjectRect = intersectRects(this.origHit, subjectRect) ||\n\t\t\t\t\t\tsubjectRect; // in case there is no intersection\n\t\t\t\t}\n\n\t\t\t\tpoint = getRectCenter(subjectRect);\n\t\t\t}\n\n\t\t\tthis.coordAdjust = diffPoints(point, origPoint); // point - origPoint\n\t\t}\n\t\telse {\n\t\t\tthis.origHit = null;\n\t\t\tthis.coordAdjust = null;\n\t\t}\n\n\t\t// call the super-method. do it after origHit has been computed\n\t\tDragListener.prototype.handleInteractionStart.apply(this, arguments);\n\t},\n\n\n\t// Called when the actual drag has started\n\thandleDragStart: function(ev) {\n\t\tvar hit;\n\n\t\tDragListener.prototype.handleDragStart.apply(this, arguments); // call the super-method\n\n\t\t// might be different from this.origHit if the min-distance is large\n\t\thit = this.queryHit(getEvX(ev), getEvY(ev));\n\n\t\t// report the initial hit the mouse is over\n\t\t// especially important if no min-distance and drag starts immediately\n\t\tif (hit) {\n\t\t\tthis.handleHitOver(hit);\n\t\t}\n\t},\n\n\n\t// Called when the drag moves\n\thandleDrag: function(dx, dy, ev) {\n\t\tvar hit;\n\n\t\tDragListener.prototype.handleDrag.apply(this, arguments); // call the super-method\n\n\t\thit = this.queryHit(getEvX(ev), getEvY(ev));\n\n\t\tif (!isHitsEqual(hit, this.hit)) { // a different hit than before?\n\t\t\tif (this.hit) {\n\t\t\t\tthis.handleHitOut();\n\t\t\t}\n\t\t\tif (hit) {\n\t\t\t\tthis.handleHitOver(hit);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Called when dragging has been stopped\n\thandleDragEnd: function() {\n\t\tthis.handleHitDone();\n\t\tDragListener.prototype.handleDragEnd.apply(this, arguments); // call the super-method\n\t},\n\n\n\t// Called when a the mouse has just moved over a new hit\n\thandleHitOver: function(hit) {\n\t\tvar isOrig = isHitsEqual(hit, this.origHit);\n\n\t\tthis.hit = hit;\n\n\t\tthis.trigger('hitOver', this.hit, isOrig, this.origHit);\n\t},\n\n\n\t// Called when the mouse has just moved out of a hit\n\thandleHitOut: function() {\n\t\tif (this.hit) {\n\t\t\tthis.trigger('hitOut', this.hit);\n\t\t\tthis.handleHitDone();\n\t\t\tthis.hit = null;\n\t\t}\n\t},\n\n\n\t// Called after a hitOut. Also called before a dragStop\n\thandleHitDone: function() {\n\t\tif (this.hit) {\n\t\t\tthis.trigger('hitDone', this.hit);\n\t\t}\n\t},\n\n\n\t// Called when the interaction ends, whether there was a real drag or not\n\thandleInteractionEnd: function() {\n\t\tDragListener.prototype.handleInteractionEnd.apply(this, arguments); // call the super-method\n\n\t\tthis.origHit = null;\n\t\tthis.hit = null;\n\n\t\tthis.component.hitsNotNeeded();\n\t},\n\n\n\t// Called when scrolling has stopped, whether through auto scroll, or the user scrolling\n\thandleScrollEnd: function() {\n\t\tDragListener.prototype.handleScrollEnd.apply(this, arguments); // call the super-method\n\n\t\t// hits' absolute positions will be in new places after a user's scroll.\n\t\t// HACK for recomputing.\n\t\tif (this.isDragging) {\n\t\t\tthis.component.releaseHits();\n\t\t\tthis.component.prepareHits();\n\t\t}\n\t},\n\n\n\t// Gets the hit underneath the coordinates for the given mouse event\n\tqueryHit: function(left, top) {\n\n\t\tif (this.coordAdjust) {\n\t\t\tleft += this.coordAdjust.left;\n\t\t\ttop += this.coordAdjust.top;\n\t\t}\n\n\t\treturn this.component.queryHit(left, top);\n\t}\n\n});\n\n\n// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component.\n// Two null values will be considered equal, as two \"out of the component\" states are the same.\nfunction isHitsEqual(hit0, hit1) {\n\n\tif (!hit0 && !hit1) {\n\t\treturn true;\n\t}\n\n\tif (hit0 && hit1) {\n\t\treturn hit0.component === hit1.component &&\n\t\t\tisHitPropsWithin(hit0, hit1) &&\n\t\t\tisHitPropsWithin(hit1, hit0); // ensures all props are identical\n\t}\n\n\treturn false;\n}\n\n\n// Returns true if all of subHit's non-standard properties are within superHit\nfunction isHitPropsWithin(subHit, superHit) {\n\tfor (var propName in subHit) {\n\t\tif (!/^(component|left|right|top|bottom)$/.test(propName)) {\n\t\t\tif (subHit[propName] !== superHit[propName]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n;;\n\n/*\nListens to document and window-level user-interaction events, like touch events and mouse events,\nand fires these events as-is to whoever is observing a GlobalEmitter.\nBest when used as a singleton via GlobalEmitter.get()\n\nNormalizes mouse/touch events. For examples:\n- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click\n- compensates for various buggy scenarios where a touchend does not fire\n*/\n\nFC.touchMouseIgnoreWait = 500;\n\nvar GlobalEmitter = Class.extend(ListenerMixin, EmitterMixin, {\n\n\tisTouching: false,\n\tmouseIgnoreDepth: 0,\n\thandleScrollProxy: null,\n\n\n\tbind: function() {\n\t\tvar _this = this;\n\n\t\tthis.listenTo($(document), {\n\t\t\ttouchstart: this.handleTouchStart,\n\t\t\ttouchcancel: this.handleTouchCancel,\n\t\t\ttouchend: this.handleTouchEnd,\n\t\t\tmousedown: this.handleMouseDown,\n\t\t\tmousemove: this.handleMouseMove,\n\t\t\tmouseup: this.handleMouseUp,\n\t\t\tclick: this.handleClick,\n\t\t\tselectstart: this.handleSelectStart,\n\t\t\tcontextmenu: this.handleContextMenu\n\t\t});\n\n\t\t// because we need to call preventDefault\n\t\t// because https://www.chromestatus.com/features/5093566007214080\n\t\t// TODO: investigate performance because this is a global handler\n\t\twindow.addEventListener(\n\t\t\t'touchmove',\n\t\t\tthis.handleTouchMoveProxy = function(ev) {\n\t\t\t\t_this.handleTouchMove($.Event(ev));\n\t\t\t},\n\t\t\t{ passive: false } // allows preventDefault()\n\t\t);\n\n\t\t// attach a handler to get called when ANY scroll action happens on the page.\n\t\t// this was impossible to do with normal on/off because 'scroll' doesn't bubble.\n\t\t// http://stackoverflow.com/a/32954565/96342\n\t\twindow.addEventListener(\n\t\t\t'scroll',\n\t\t\tthis.handleScrollProxy = function(ev) {\n\t\t\t\t_this.handleScroll($.Event(ev));\n\t\t\t},\n\t\t\ttrue // useCapture\n\t\t);\n\t},\n\n\tunbind: function() {\n\t\tthis.stopListeningTo($(document));\n\n\t\twindow.removeEventListener(\n\t\t\t'touchmove',\n\t\t\tthis.handleTouchMoveProxy\n\t\t);\n\n\t\twindow.removeEventListener(\n\t\t\t'scroll',\n\t\t\tthis.handleScrollProxy,\n\t\t\ttrue // useCapture\n\t\t);\n\t},\n\n\n\t// Touch Handlers\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\thandleTouchStart: function(ev) {\n\n\t\t// if a previous touch interaction never ended with a touchend, then implicitly end it,\n\t\t// but since a new touch interaction is about to begin, don't start the mouse ignore period.\n\t\tthis.stopTouch(ev, true); // skipMouseIgnore=true\n\n\t\tthis.isTouching = true;\n\t\tthis.trigger('touchstart', ev);\n\t},\n\n\thandleTouchMove: function(ev) {\n\t\tif (this.isTouching) {\n\t\t\tthis.trigger('touchmove', ev);\n\t\t}\n\t},\n\n\thandleTouchCancel: function(ev) {\n\t\tif (this.isTouching) {\n\t\t\tthis.trigger('touchcancel', ev);\n\n\t\t\t// Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.\n\t\t\t// If touchend fires later, it won't have any effect b/c isTouching will be false.\n\t\t\tthis.stopTouch(ev);\n\t\t}\n\t},\n\n\thandleTouchEnd: function(ev) {\n\t\tthis.stopTouch(ev);\n\t},\n\n\n\t// Mouse Handlers\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\thandleMouseDown: function(ev) {\n\t\tif (!this.shouldIgnoreMouse()) {\n\t\t\tthis.trigger('mousedown', ev);\n\t\t}\n\t},\n\n\thandleMouseMove: function(ev) {\n\t\tif (!this.shouldIgnoreMouse()) {\n\t\t\tthis.trigger('mousemove', ev);\n\t\t}\n\t},\n\n\thandleMouseUp: function(ev) {\n\t\tif (!this.shouldIgnoreMouse()) {\n\t\t\tthis.trigger('mouseup', ev);\n\t\t}\n\t},\n\n\thandleClick: function(ev) {\n\t\tif (!this.shouldIgnoreMouse()) {\n\t\t\tthis.trigger('click', ev);\n\t\t}\n\t},\n\n\n\t// Misc Handlers\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\thandleSelectStart: function(ev) {\n\t\tthis.trigger('selectstart', ev);\n\t},\n\n\thandleContextMenu: function(ev) {\n\t\tthis.trigger('contextmenu', ev);\n\t},\n\n\thandleScroll: function(ev) {\n\t\tthis.trigger('scroll', ev);\n\t},\n\n\n\t// Utils\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\tstopTouch: function(ev, skipMouseIgnore) {\n\t\tif (this.isTouching) {\n\t\t\tthis.isTouching = false;\n\t\t\tthis.trigger('touchend', ev);\n\n\t\t\tif (!skipMouseIgnore) {\n\t\t\t\tthis.startTouchMouseIgnore();\n\t\t\t}\n\t\t}\n\t},\n\n\tstartTouchMouseIgnore: function() {\n\t\tvar _this = this;\n\t\tvar wait = FC.touchMouseIgnoreWait;\n\n\t\tif (wait) {\n\t\t\tthis.mouseIgnoreDepth++;\n\t\t\tsetTimeout(function() {\n\t\t\t\t_this.mouseIgnoreDepth--;\n\t\t\t}, wait);\n\t\t}\n\t},\n\n\tshouldIgnoreMouse: function() {\n\t\treturn this.isTouching || Boolean(this.mouseIgnoreDepth);\n\t}\n\n});\n\n\n// Singleton\n// ---------------------------------------------------------------------------------------------------------------------\n\n(function() {\n\tvar globalEmitter = null;\n\tvar neededCount = 0;\n\n\n\t// gets the singleton\n\tGlobalEmitter.get = function() {\n\n\t\tif (!globalEmitter) {\n\t\t\tglobalEmitter = new GlobalEmitter();\n\t\t\tglobalEmitter.bind();\n\t\t}\n\n\t\treturn globalEmitter;\n\t};\n\n\n\t// called when an object knows it will need a GlobalEmitter in the near future.\n\tGlobalEmitter.needed = function() {\n\t\tGlobalEmitter.get(); // ensures globalEmitter\n\t\tneededCount++;\n\t};\n\n\n\t// called when the object that originally called needed() doesn't need a GlobalEmitter anymore.\n\tGlobalEmitter.unneeded = function() {\n\t\tneededCount--;\n\n\t\tif (!neededCount) { // nobody else needs it\n\t\t\tglobalEmitter.unbind();\n\t\t\tglobalEmitter = null;\n\t\t}\n\t};\n\n})();\n\n;;\n\n/* Creates a clone of an element and lets it track the mouse as it moves\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar MouseFollower = Class.extend(ListenerMixin, {\n\n\toptions: null,\n\n\tsourceEl: null, // the element that will be cloned and made to look like it is dragging\n\tel: null, // the clone of `sourceEl` that will track the mouse\n\tparentEl: null, // the element that `el` (the clone) will be attached to\n\n\t// the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl\n\ttop0: null,\n\tleft0: null,\n\n\t// the absolute coordinates of the initiating touch/mouse action\n\ty0: null,\n\tx0: null,\n\n\t// the number of pixels the mouse has moved from its initial position\n\ttopDelta: null,\n\tleftDelta: null,\n\n\tisFollowing: false,\n\tisHidden: false,\n\tisAnimating: false, // doing the revert animation?\n\n\tconstructor: function(sourceEl, options) {\n\t\tthis.options = options = options || {};\n\t\tthis.sourceEl = sourceEl;\n\t\tthis.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent\n\t},\n\n\n\t// Causes the element to start following the mouse\n\tstart: function(ev) {\n\t\tif (!this.isFollowing) {\n\t\t\tthis.isFollowing = true;\n\n\t\t\tthis.y0 = getEvY(ev);\n\t\t\tthis.x0 = getEvX(ev);\n\t\t\tthis.topDelta = 0;\n\t\t\tthis.leftDelta = 0;\n\n\t\t\tif (!this.isHidden) {\n\t\t\t\tthis.updatePosition();\n\t\t\t}\n\n\t\t\tif (getEvIsTouch(ev)) {\n\t\t\t\tthis.listenTo($(document), 'touchmove', this.handleMove);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.listenTo($(document), 'mousemove', this.handleMove);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.\n\t// `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.\n\tstop: function(shouldRevert, callback) {\n\t\tvar _this = this;\n\t\tvar revertDuration = this.options.revertDuration;\n\n\t\tfunction complete() { // might be called by .animate(), which might change `this` context\n\t\t\t_this.isAnimating = false;\n\t\t\t_this.removeElement();\n\n\t\t\t_this.top0 = _this.left0 = null; // reset state for future updatePosition calls\n\n\t\t\tif (callback) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\n\t\tif (this.isFollowing && !this.isAnimating) { // disallow more than one stop animation at a time\n\t\t\tthis.isFollowing = false;\n\n\t\t\tthis.stopListeningTo($(document));\n\n\t\t\tif (shouldRevert && revertDuration && !this.isHidden) { // do a revert animation?\n\t\t\t\tthis.isAnimating = true;\n\t\t\t\tthis.el.animate({\n\t\t\t\t\ttop: this.top0,\n\t\t\t\t\tleft: this.left0\n\t\t\t\t}, {\n\t\t\t\t\tduration: revertDuration,\n\t\t\t\t\tcomplete: complete\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Gets the tracking element. Create it if necessary\n\tgetEl: function() {\n\t\tvar el = this.el;\n\n\t\tif (!el) {\n\t\t\tel = this.el = this.sourceEl.clone()\n\t\t\t\t.addClass(this.options.additionalClass || '')\n\t\t\t\t.css({\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tvisibility: '', // in case original element was hidden (commonly through hideEvents())\n\t\t\t\t\tdisplay: this.isHidden ? 'none' : '', // for when initially hidden\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tright: 'auto', // erase and set width instead\n\t\t\t\t\tbottom: 'auto', // erase and set height instead\n\t\t\t\t\twidth: this.sourceEl.width(), // explicit height in case there was a 'right' value\n\t\t\t\t\theight: this.sourceEl.height(), // explicit width in case there was a 'bottom' value\n\t\t\t\t\topacity: this.options.opacity || '',\n\t\t\t\t\tzIndex: this.options.zIndex\n\t\t\t\t});\n\n\t\t\t// we don't want long taps or any mouse interaction causing selection/menus.\n\t\t\t// would use preventSelection(), but that prevents selectstart, causing problems.\n\t\t\tel.addClass('fc-unselectable');\n\n\t\t\tel.appendTo(this.parentEl);\n\t\t}\n\n\t\treturn el;\n\t},\n\n\n\t// Removes the tracking element if it has already been created\n\tremoveElement: function() {\n\t\tif (this.el) {\n\t\t\tthis.el.remove();\n\t\t\tthis.el = null;\n\t\t}\n\t},\n\n\n\t// Update the CSS position of the tracking element\n\tupdatePosition: function() {\n\t\tvar sourceOffset;\n\t\tvar origin;\n\n\t\tthis.getEl(); // ensure this.el\n\n\t\t// make sure origin info was computed\n\t\tif (this.top0 === null) {\n\t\t\tsourceOffset = this.sourceEl.offset();\n\t\t\torigin = this.el.offsetParent().offset();\n\t\t\tthis.top0 = sourceOffset.top - origin.top;\n\t\t\tthis.left0 = sourceOffset.left - origin.left;\n\t\t}\n\n\t\tthis.el.css({\n\t\t\ttop: this.top0 + this.topDelta,\n\t\t\tleft: this.left0 + this.leftDelta\n\t\t});\n\t},\n\n\n\t// Gets called when the user moves the mouse\n\thandleMove: function(ev) {\n\t\tthis.topDelta = getEvY(ev) - this.y0;\n\t\tthis.leftDelta = getEvX(ev) - this.x0;\n\n\t\tif (!this.isHidden) {\n\t\t\tthis.updatePosition();\n\t\t}\n\t},\n\n\n\t// Temporarily makes the tracking element invisible. Can be called before following starts\n\thide: function() {\n\t\tif (!this.isHidden) {\n\t\t\tthis.isHidden = true;\n\t\t\tif (this.el) {\n\t\t\t\tthis.el.hide();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Show the tracking element after it has been temporarily hidden\n\tshow: function() {\n\t\tif (this.isHidden) {\n\t\t\tthis.isHidden = false;\n\t\t\tthis.updatePosition();\n\t\t\tthis.getEl().show();\n\t\t}\n\t}\n\n});\n\n;;\n\n/* An abstract class comprised of a \"grid\" of areas that each represent a specific datetime\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar Grid = FC.Grid = Class.extend(ListenerMixin, {\n\n\t// self-config, overridable by subclasses\n\thasDayInteractions: true, // can user click/select ranges of time?\n\n\tview: null, // a View object\n\tisRTL: null, // shortcut to the view's isRTL option\n\n\tstart: null,\n\tend: null,\n\n\tel: null, // the containing element\n\telsByFill: null, // a hash of jQuery element sets used for rendering each fill. Keyed by fill name.\n\n\t// derived from options\n\teventTimeFormat: null,\n\tdisplayEventTime: null,\n\tdisplayEventEnd: null,\n\n\tminResizeDuration: null, // TODO: hack. set by subclasses. minumum event resize duration\n\n\t// if defined, holds the unit identified (ex: \"year\" or \"month\") that determines the level of granularity\n\t// of the date areas. if not defined, assumes to be day and time granularity.\n\t// TODO: port isTimeScale into same system?\n\tlargeUnit: null,\n\n\tdayClickListener: null,\n\tdaySelectListener: null,\n\tsegDragListener: null,\n\tsegResizeListener: null,\n\texternalDragListener: null,\n\n\n\tconstructor: function(view) {\n\t\tthis.view = view;\n\t\tthis.isRTL = view.opt('isRTL');\n\t\tthis.elsByFill = {};\n\n\t\tthis.dayClickListener = this.buildDayClickListener();\n\t\tthis.daySelectListener = this.buildDaySelectListener();\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Generates the format string used for event time text, if not explicitly defined by 'timeFormat'\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('smallTimeFormat');\n\t},\n\n\n\t// Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventTime'.\n\t// Only applies to non-all-day events.\n\tcomputeDisplayEventTime: function() {\n\t\treturn true;\n\t},\n\n\n\t// Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventEnd'\n\tcomputeDisplayEventEnd: function() {\n\t\treturn true;\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Tells the grid about what period of time to display.\n\t// Any date-related internal data should be generated.\n\tsetRange: function(range) {\n\t\tthis.start = range.start.clone();\n\t\tthis.end = range.end.clone();\n\n\t\tthis.rangeUpdated();\n\t\tthis.processRangeOptions();\n\t},\n\n\n\t// Called when internal variables that rely on the range should be updated\n\trangeUpdated: function() {\n\t},\n\n\n\t// Updates values that rely on options and also relate to range\n\tprocessRangeOptions: function() {\n\t\tvar view = this.view;\n\t\tvar displayEventTime;\n\t\tvar displayEventEnd;\n\n\t\tthis.eventTimeFormat =\n\t\t\tview.opt('eventTimeFormat') ||\n\t\t\tview.opt('timeFormat') || // deprecated\n\t\t\tthis.computeEventTimeFormat();\n\n\t\tdisplayEventTime = view.opt('displayEventTime');\n\t\tif (displayEventTime == null) {\n\t\t\tdisplayEventTime = this.computeDisplayEventTime(); // might be based off of range\n\t\t}\n\n\t\tdisplayEventEnd = view.opt('displayEventEnd');\n\t\tif (displayEventEnd == null) {\n\t\t\tdisplayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\n\t\t}\n\n\t\tthis.displayEventTime = displayEventTime;\n\t\tthis.displayEventEnd = displayEventEnd;\n\t},\n\n\n\t// Converts a span (has unzoned start/end and any other grid-specific location information)\n\t// into an array of segments (pieces of events whose format is decided by the grid).\n\tspanToSegs: function(span) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Diffs the two dates, returning a duration, based on granularity of the grid\n\t// TODO: port isTimeScale into this system?\n\tdiffDates: function(a, b) {\n\t\tif (this.largeUnit) {\n\t\t\treturn diffByUnit(a, b, this.largeUnit);\n\t\t}\n\t\telse {\n\t\t\treturn diffDayTime(a, b);\n\t\t}\n\t},\n\n\n\t/* Hit Area\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\thitsNeededDepth: 0, // necessary because multiple callers might need the same hits\n\n\thitsNeeded: function() {\n\t\tif (!(this.hitsNeededDepth++)) {\n\t\t\tthis.prepareHits();\n\t\t}\n\t},\n\n\thitsNotNeeded: function() {\n\t\tif (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {\n\t\t\tthis.releaseHits();\n\t\t}\n\t},\n\n\n\t// Called before one or more queryHit calls might happen. Should prepare any cached coordinates for queryHit\n\tprepareHits: function() {\n\t},\n\n\n\t// Called when queryHit calls have subsided. Good place to clear any coordinate caches.\n\treleaseHits: function() {\n\t},\n\n\n\t// Given coordinates from the topleft of the document, return data about the date-related area underneath.\n\t// Can return an object with arbitrary properties (although top/right/left/bottom are encouraged).\n\t// Must have a `grid` property, a reference to this current grid. TODO: avoid this\n\t// The returned object will be processed by getHitSpan and getHitEl.\n\tqueryHit: function(leftOffset, topOffset) {\n\t},\n\n\n\t// like getHitSpan, but returns null if the resulting span's range is invalid\n\tgetSafeHitSpan: function(hit) {\n\t\tvar hitSpan = this.getHitSpan(hit);\n\n\t\tif (!isRangeWithinRange(hitSpan, this.view.activeRange)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn hitSpan;\n\t},\n\n\n\t// Given position-level information about a date-related area within the grid,\n\t// should return an object with at least a start/end date. Can provide other information as well.\n\tgetHitSpan: function(hit) {\n\t},\n\n\n\t// Given position-level information about a date-related area within the grid,\n\t// should return a jQuery element that best represents it. passed to dayClick callback.\n\tgetHitEl: function(hit) {\n\t},\n\n\n\t/* Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Sets the container element that the grid should render inside of.\n\t// Does other DOM-related initializations.\n\tsetElement: function(el) {\n\t\tthis.el = el;\n\n\t\tif (this.hasDayInteractions) {\n\t\t\tpreventSelection(el);\n\n\t\t\tthis.bindDayHandler('touchstart', this.dayTouchStart);\n\t\t\tthis.bindDayHandler('mousedown', this.dayMousedown);\n\t\t}\n\n\t\t// attach event-element-related handlers. in Grid.events\n\t\t// same garbage collection note as above.\n\t\tthis.bindSegHandlers();\n\n\t\tthis.bindGlobalHandlers();\n\t},\n\n\n\tbindDayHandler: function(name, handler) {\n\t\tvar _this = this;\n\n\t\t// attach a handler to the grid's root element.\n\t\t// jQuery will take care of unregistering them when removeElement gets called.\n\t\tthis.el.on(name, function(ev) {\n\t\t\tif (\n\t\t\t\t!$(ev.target).is(\n\t\t\t\t\t_this.segSelector + ',' + // directly on an event element\n\t\t\t\t\t_this.segSelector + ' *,' + // within an event element\n\t\t\t\t\t'.fc-more,' + // a \"more..\" link\n\t\t\t\t\t'a[data-goto]' // a clickable nav link\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn handler.call(_this, ev);\n\t\t\t}\n\t\t});\n\t},\n\n\n\t// Removes the grid's container element from the DOM. Undoes any other DOM-related attachments.\n\t// DOES NOT remove any content beforehand (doesn't clear events or call unrenderDates), unlike View\n\tremoveElement: function() {\n\t\tthis.unbindGlobalHandlers();\n\t\tthis.clearDragListeners();\n\n\t\tthis.el.remove();\n\n\t\t// NOTE: we don't null-out this.el for the same reasons we don't do it within View::removeElement\n\t},\n\n\n\t// Renders the basic structure of grid view before any content is rendered\n\trenderSkeleton: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Renders the grid's date-related content (like areas that represent days/times).\n\t// Assumes setRange has already been called and the skeleton has already been rendered.\n\trenderDates: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders the grid's date-related content\n\tunrenderDates: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Handlers\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Binds DOM handlers to elements that reside outside the grid, such as the document\n\tbindGlobalHandlers: function() {\n\t\tthis.listenTo($(document), {\n\t\t\tdragstart: this.externalDragStart, // jqui\n\t\t\tsortstart: this.externalDragStart // jqui\n\t\t});\n\t},\n\n\n\t// Unbinds DOM handlers from elements that reside outside the grid\n\tunbindGlobalHandlers: function() {\n\t\tthis.stopListeningTo($(document));\n\t},\n\n\n\t// Process a mousedown on an element that represents a day. For day clicking and selecting.\n\tdayMousedown: function(ev) {\n\t\tvar view = this.view;\n\n\t\t// HACK\n\t\t// This will still work even though bindDayHandler doesn't use GlobalEmitter.\n\t\tif (GlobalEmitter.get().shouldIgnoreMouse()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.dayClickListener.startInteraction(ev);\n\n\t\tif (view.opt('selectable')) {\n\t\t\tthis.daySelectListener.startInteraction(ev, {\n\t\t\t\tdistance: view.opt('selectMinDistance')\n\t\t\t});\n\t\t}\n\t},\n\n\n\tdayTouchStart: function(ev) {\n\t\tvar view = this.view;\n\t\tvar selectLongPressDelay;\n\n\t\t// On iOS (and Android?) when a new selection is initiated overtop another selection,\n\t\t// the touchend never fires because the elements gets removed mid-touch-interaction (my theory).\n\t\t// HACK: simply don't allow this to happen.\n\t\t// ALSO: prevent selection when an *event* is already raised.\n\t\tif (view.isSelected || view.selectedEvent) {\n\t\t\treturn;\n\t\t}\n\n\t\tselectLongPressDelay = view.opt('selectLongPressDelay');\n\t\tif (selectLongPressDelay == null) {\n\t\t\tselectLongPressDelay = view.opt('longPressDelay'); // fallback\n\t\t}\n\n\t\tthis.dayClickListener.startInteraction(ev);\n\n\t\tif (view.opt('selectable')) {\n\t\t\tthis.daySelectListener.startInteraction(ev, {\n\t\t\t\tdelay: selectLongPressDelay\n\t\t\t});\n\t\t}\n\t},\n\n\n\t// Creates a listener that tracks the user's drag across day elements, for day clicking.\n\tbuildDayClickListener: function() {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar dayClickHit; // null if invalid dayClick\n\n\t\tvar dragListener = new HitDragListener(this, {\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tinteractionStart: function() {\n\t\t\t\tdayClickHit = dragListener.origHit;\n\t\t\t},\n\t\t\thitOver: function(hit, isOrig, origHit) {\n\t\t\t\t// if user dragged to another cell at any point, it can no longer be a dayClick\n\t\t\t\tif (!isOrig) {\n\t\t\t\t\tdayClickHit = null;\n\t\t\t\t}\n\t\t\t},\n\t\t\thitOut: function() { // called before mouse moves to a different hit OR moved out of all hits\n\t\t\t\tdayClickHit = null;\n\t\t\t},\n\t\t\tinteractionEnd: function(ev, isCancelled) {\n\t\t\t\tvar hitSpan;\n\n\t\t\t\tif (!isCancelled && dayClickHit) {\n\t\t\t\t\thitSpan = _this.getSafeHitSpan(dayClickHit);\n\n\t\t\t\t\tif (hitSpan) {\n\t\t\t\t\t\tview.triggerDayClick(hitSpan, _this.getHitEl(dayClickHit), ev);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// because dayClickListener won't be called with any time delay, \"dragging\" will begin immediately,\n\t\t// which will kill any touchmoving/scrolling. Prevent this.\n\t\tdragListener.shouldCancelTouchScroll = false;\n\n\t\tdragListener.scrollAlwaysKills = true;\n\n\t\treturn dragListener;\n\t},\n\n\n\t// Creates a listener that tracks the user's drag across day elements, for day selecting.\n\tbuildDaySelectListener: function() {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar selectionSpan; // null if invalid selection\n\n\t\tvar dragListener = new HitDragListener(this, {\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tinteractionStart: function() {\n\t\t\t\tselectionSpan = null;\n\t\t\t},\n\t\t\tdragStart: function() {\n\t\t\t\tview.unselect(); // since we could be rendering a new selection, we want to clear any old one\n\t\t\t},\n\t\t\thitOver: function(hit, isOrig, origHit) {\n\t\t\t\tvar origHitSpan;\n\t\t\t\tvar hitSpan;\n\n\t\t\t\tif (origHit) { // click needs to have started on a hit\n\n\t\t\t\t\torigHitSpan = _this.getSafeHitSpan(origHit);\n\t\t\t\t\thitSpan = _this.getSafeHitSpan(hit);\n\n\t\t\t\t\tif (origHitSpan && hitSpan) {\n\t\t\t\t\t\tselectionSpan = _this.computeSelection(origHitSpan, hitSpan);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tselectionSpan = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (selectionSpan) {\n\t\t\t\t\t\t_this.renderSelection(selectionSpan);\n\t\t\t\t\t}\n\t\t\t\t\telse if (selectionSpan === false) {\n\t\t\t\t\t\tdisableCursor();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\thitOut: function() { // called before mouse moves to a different hit OR moved out of all hits\n\t\t\t\tselectionSpan = null;\n\t\t\t\t_this.unrenderSelection();\n\t\t\t},\n\t\t\thitDone: function() { // called after a hitOut OR before a dragEnd\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tinteractionEnd: function(ev, isCancelled) {\n\t\t\t\tif (!isCancelled && selectionSpan) {\n\t\t\t\t\t// the selection will already have been rendered. just report it\n\t\t\t\t\tview.reportSelection(selectionSpan, ev);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn dragListener;\n\t},\n\n\n\t// Kills all in-progress dragging.\n\t// Useful for when public API methods that result in re-rendering are invoked during a drag.\n\t// Also useful for when touch devices misbehave and don't fire their touchend.\n\tclearDragListeners: function() {\n\t\tthis.dayClickListener.endInteraction();\n\t\tthis.daySelectListener.endInteraction();\n\n\t\tif (this.segDragListener) {\n\t\t\tthis.segDragListener.endInteraction(); // will clear this.segDragListener\n\t\t}\n\t\tif (this.segResizeListener) {\n\t\t\tthis.segResizeListener.endInteraction(); // will clear this.segResizeListener\n\t\t}\n\t\tif (this.externalDragListener) {\n\t\t\tthis.externalDragListener.endInteraction(); // will clear this.externalDragListener\n\t\t}\n\t},\n\n\n\t/* Event Helper\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// TODO: should probably move this to Grid.events, like we did event dragging / resizing\n\n\n\t// Renders a mock event at the given event location, which contains zoned start/end properties.\n\t// Returns all mock event elements.\n\trenderEventLocationHelper: function(eventLocation, sourceSeg) {\n\t\tvar fakeEvent = this.fabricateHelperEvent(eventLocation, sourceSeg);\n\n\t\treturn this.renderHelper(fakeEvent, sourceSeg); // do the actual rendering\n\t},\n\n\n\t// Builds a fake event given zoned event date properties and a segment is should be inspired from.\n\t// The range's end can be null, in which case the mock event that is rendered will have a null end time.\n\t// `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging.\n\tfabricateHelperEvent: function(eventLocation, sourceSeg) {\n\t\tvar fakeEvent = sourceSeg ? createObject(sourceSeg.event) : {}; // mask the original event object if possible\n\n\t\tfakeEvent.start = eventLocation.start.clone();\n\t\tfakeEvent.end = eventLocation.end ? eventLocation.end.clone() : null;\n\t\tfakeEvent.allDay = null; // force it to be freshly computed by normalizeEventDates\n\t\tthis.view.calendar.normalizeEventDates(fakeEvent);\n\n\t\t// this extra className will be useful for differentiating real events from mock events in CSS\n\t\tfakeEvent.className = (fakeEvent.className || []).concat('fc-helper');\n\n\t\t// if something external is being dragged in, don't render a resizer\n\t\tif (!sourceSeg) {\n\t\t\tfakeEvent.editable = false;\n\t\t}\n\n\t\treturn fakeEvent;\n\t},\n\n\n\t// Renders a mock event. Given zoned event date properties.\n\t// Must return all mock event elements.\n\trenderHelper: function(eventLocation, sourceSeg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a mock event\n\tunrenderHelper: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses.\n\t// Given a span (unzoned start/end and other misc data)\n\trenderSelection: function(span) {\n\t\tthis.renderHighlight(span);\n\t},\n\n\n\t// Unrenders any visual indications of a selection. Will unrender a highlight by default.\n\tunrenderSelection: function() {\n\t\tthis.unrenderHighlight();\n\t},\n\n\n\t// Given the first and last date-spans of a selection, returns another date-span object.\n\t// Subclasses can override and provide additional data in the span object. Will be passed to renderSelection().\n\t// Will return false if the selection is invalid and this should be indicated to the user.\n\t// Will return null/undefined if a selection invalid but no error should be reported.\n\tcomputeSelection: function(span0, span1) {\n\t\tvar span = this.computeSelectionSpan(span0, span1);\n\n\t\tif (span && !this.view.calendar.isSelectionSpanAllowed(span)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn span;\n\t},\n\n\n\t// Given two spans, must return the combination of the two.\n\t// TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.\n\tcomputeSelectionSpan: function(span0, span1) {\n\t\tvar dates = [ span0.start, span0.end, span1.start, span1.end ];\n\n\t\tdates.sort(compareNumbers); // sorts chronologically. works with Moments\n\n\t\treturn { start: dates[0].clone(), end: dates[3].clone() };\n\t},\n\n\n\t/* Highlight\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data)\n\trenderHighlight: function(span) {\n\t\tthis.renderFill('highlight', this.spanToSegs(span));\n\t},\n\n\n\t// Unrenders the emphasis on a date range\n\tunrenderHighlight: function() {\n\t\tthis.unrenderFill('highlight');\n\t},\n\n\n\t// Generates an array of classNames for rendering the highlight. Used by the fill system.\n\thighlightSegClasses: function() {\n\t\treturn [ 'fc-highlight' ];\n\t},\n\n\n\t/* Business Hours\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderBusinessHours: function() {\n\t},\n\n\n\tunrenderBusinessHours: function() {\n\t},\n\n\n\t/* Now Indicator\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tgetNowIndicatorUnit: function() {\n\t},\n\n\n\trenderNowIndicator: function(date) {\n\t},\n\n\n\tunrenderNowIndicator: function() {\n\t},\n\n\n\t/* Fill System (highlight, background events, business hours)\n\t--------------------------------------------------------------------------------------------------------------------\n\tTODO: remove this system. like we did in TimeGrid\n\t*/\n\n\n\t// Renders a set of rectangles over the given segments of time.\n\t// MUST RETURN a subset of segs, the segs that were actually rendered.\n\t// Responsible for populating this.elsByFill. TODO: better API for expressing this requirement\n\trenderFill: function(type, segs) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a specific type of fill that is currently rendered on the grid\n\tunrenderFill: function(type) {\n\t\tvar el = this.elsByFill[type];\n\n\t\tif (el) {\n\t\t\tel.remove();\n\t\t\tdelete this.elsByFill[type];\n\t\t}\n\t},\n\n\n\t// Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\n\t// Only returns segments that successfully rendered.\n\t// To be harnessed by renderFill (implemented by subclasses).\n\t// Analagous to renderFgSegEls.\n\trenderFillSegEls: function(type, segs) {\n\t\tvar _this = this;\n\t\tvar segElMethod = this[type + 'SegEl'];\n\t\tvar html = '';\n\t\tvar renderedSegs = [];\n\t\tvar i;\n\n\t\tif (segs.length) {\n\n\t\t\t// build a large concatenation of segment HTML\n\t\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\t\thtml += this.fillSegHtml(type, segs[i]);\n\t\t\t}\n\n\t\t\t// Grab individual elements from the combined HTML string. Use each as the default rendering.\n\t\t\t// Then, compute the 'el' for each segment.\n\t\t\t$(html).each(function(i, node) {\n\t\t\t\tvar seg = segs[i];\n\t\t\t\tvar el = $(node);\n\n\t\t\t\t// allow custom filter methods per-type\n\t\t\t\tif (segElMethod) {\n\t\t\t\t\tel = segElMethod.call(_this, seg, el);\n\t\t\t\t}\n\n\t\t\t\tif (el) { // custom filters did not cancel the render\n\t\t\t\t\tel = $(el); // allow custom filter to return raw DOM node\n\n\t\t\t\t\t// correct element type? (would be bad if a non-TD were inserted into a table for example)\n\t\t\t\t\tif (el.is(_this.fillSegTag)) {\n\t\t\t\t\t\tseg.el = el;\n\t\t\t\t\t\trenderedSegs.push(seg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn renderedSegs;\n\t},\n\n\n\tfillSegTag: 'div', // subclasses can override\n\n\n\t// Builds the HTML needed for one fill segment. Generic enough to work with different types.\n\tfillSegHtml: function(type, seg) {\n\n\t\t// custom hooks per-type\n\t\tvar classesMethod = this[type + 'SegClasses'];\n\t\tvar cssMethod = this[type + 'SegCss'];\n\n\t\tvar classes = classesMethod ? classesMethod.call(this, seg) : [];\n\t\tvar css = cssToStr(cssMethod ? cssMethod.call(this, seg) : {});\n\n\t\treturn '<' + this.fillSegTag +\n\t\t\t(classes.length ? ' class=\"' + classes.join(' ') + '\"' : '') +\n\t\t\t(css ? ' style=\"' + css + '\"' : '') +\n\t\t\t' />';\n\t},\n\n\n\n\t/* Generic rendering utilities for subclasses\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes HTML classNames for a single-day element\n\tgetDayClasses: function(date, noThemeHighlight) {\n\t\tvar view = this.view;\n\t\tvar classes = [];\n\t\tvar today;\n\n\t\tif (!isDateWithinRange(date, view.activeRange)) {\n\t\t\tclasses.push('fc-disabled-day'); // TODO: jQuery UI theme?\n\t\t}\n\t\telse {\n\t\t\tclasses.push('fc-' + dayIDs[date.day()]);\n\n\t\t\tif (\n\t\t\t\tview.currentRangeAs('months') == 1 && // TODO: somehow get into MonthView\n\t\t\t\tdate.month() != view.currentRange.start.month()\n\t\t\t) {\n\t\t\t\tclasses.push('fc-other-month');\n\t\t\t}\n\n\t\t\ttoday = view.calendar.getNow();\n\n\t\t\tif (date.isSame(today, 'day')) {\n\t\t\t\tclasses.push('fc-today');\n\n\t\t\t\tif (noThemeHighlight !== true) {\n\t\t\t\t\tclasses.push(view.highlightStateClass);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (date < today) {\n\t\t\t\tclasses.push('fc-past');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tclasses.push('fc-future');\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n});\n\n;;\n\n/* Event-rendering and event-interaction methods for the abstract Grid class\n----------------------------------------------------------------------------------------------------------------------\n\nData Types:\n\tevent - { title, id, start, (end), whatever }\n\tlocation - { start, (end), allDay }\n\trawEventRange - { start, end }\n\teventRange - { start, end, isStart, isEnd }\n\teventSpan - { start, end, isStart, isEnd, whatever }\n\teventSeg - { event, whatever }\n\tseg - { whatever }\n*/\n\nGrid.mixin({\n\n\t// self-config, overridable by subclasses\n\tsegSelector: '.fc-event-container > *', // what constitutes an event element?\n\n\tmousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing\n\tisDraggingSeg: false, // is a segment being dragged? boolean\n\tisResizingSeg: false, // is a segment being resized? boolean\n\tisDraggingExternal: false, // jqui-dragging an external element? boolean\n\tsegs: null, // the *event* segments currently rendered in the grid. TODO: rename to `eventSegs`\n\n\n\t// Renders the given events onto the grid\n\trenderEvents: function(events) {\n\t\tvar bgEvents = [];\n\t\tvar fgEvents = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < events.length; i++) {\n\t\t\t(isBgEvent(events[i]) ? bgEvents : fgEvents).push(events[i]);\n\t\t}\n\n\t\tthis.segs = [].concat( // record all segs\n\t\t\tthis.renderBgEvents(bgEvents),\n\t\t\tthis.renderFgEvents(fgEvents)\n\t\t);\n\t},\n\n\n\trenderBgEvents: function(events) {\n\t\tvar segs = this.eventsToSegs(events);\n\n\t\t// renderBgSegs might return a subset of segs, segs that were actually rendered\n\t\treturn this.renderBgSegs(segs) || segs;\n\t},\n\n\n\trenderFgEvents: function(events) {\n\t\tvar segs = this.eventsToSegs(events);\n\n\t\t// renderFgSegs might return a subset of segs, segs that were actually rendered\n\t\treturn this.renderFgSegs(segs) || segs;\n\t},\n\n\n\t// Unrenders all events currently rendered on the grid\n\tunrenderEvents: function() {\n\t\tthis.handleSegMouseout(); // trigger an eventMouseout if user's mouse is over an event\n\t\tthis.clearDragListeners();\n\n\t\tthis.unrenderFgSegs();\n\t\tthis.unrenderBgSegs();\n\n\t\tthis.segs = null;\n\t},\n\n\n\t// Retrieves all rendered segment objects currently rendered on the grid\n\tgetEventSegs: function() {\n\t\treturn this.segs || [];\n\t},\n\n\n\t/* Foreground Segment Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders foreground event segments onto the grid. May return a subset of segs that were rendered.\n\trenderFgSegs: function(segs) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders all currently rendered foreground segments\n\tunrenderFgSegs: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Renders and assigns an `el` property for each foreground event segment.\n\t// Only returns segments that successfully rendered.\n\t// A utility that subclasses may use.\n\trenderFgSegEls: function(segs, disableResizing) {\n\t\tvar view = this.view;\n\t\tvar html = '';\n\t\tvar renderedSegs = [];\n\t\tvar i;\n\n\t\tif (segs.length) { // don't build an empty html string\n\n\t\t\t// build a large concatenation of event segment HTML\n\t\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\t\thtml += this.fgSegHtml(segs[i], disableResizing);\n\t\t\t}\n\n\t\t\t// Grab individual elements from the combined HTML string. Use each as the default rendering.\n\t\t\t// Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\n\t\t\t$(html).each(function(i, node) {\n\t\t\t\tvar seg = segs[i];\n\t\t\t\tvar el = view.resolveEventEl(seg.event, $(node));\n\n\t\t\t\tif (el) {\n\t\t\t\t\tel.data('fc-seg', seg); // used by handlers\n\t\t\t\t\tseg.el = el;\n\t\t\t\t\trenderedSegs.push(seg);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn renderedSegs;\n\t},\n\n\n\t// Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()\n\tfgSegHtml: function(seg, disableResizing) {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Background Segment Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders the given background event segments onto the grid.\n\t// Returns a subset of the segs that were actually rendered.\n\trenderBgSegs: function(segs) {\n\t\treturn this.renderFill('bgEvent', segs);\n\t},\n\n\n\t// Unrenders all the currently rendered background event segments\n\tunrenderBgSegs: function() {\n\t\tthis.unrenderFill('bgEvent');\n\t},\n\n\n\t// Renders a background event element, given the default rendering. Called by the fill system.\n\tbgEventSegEl: function(seg, el) {\n\t\treturn this.view.resolveEventEl(seg.event, el); // will filter through eventRender\n\t},\n\n\n\t// Generates an array of classNames to be used for the default rendering of a background event.\n\t// Called by fillSegHtml.\n\tbgEventSegClasses: function(seg) {\n\t\tvar event = seg.event;\n\t\tvar source = event.source || {};\n\n\t\treturn [ 'fc-bgevent' ].concat(\n\t\t\tevent.className,\n\t\t\tsource.className || []\n\t\t);\n\t},\n\n\n\t// Generates a semicolon-separated CSS string to be used for the default rendering of a background event.\n\t// Called by fillSegHtml.\n\tbgEventSegCss: function(seg) {\n\t\treturn {\n\t\t\t'background-color': this.getSegSkinCss(seg)['background-color']\n\t\t};\n\t},\n\n\n\t// Generates an array of classNames to be used for the rendering business hours overlay. Called by the fill system.\n\t// Called by fillSegHtml.\n\tbusinessHoursSegClasses: function(seg) {\n\t\treturn [ 'fc-nonbusiness', 'fc-bgevent' ];\n\t},\n\n\n\t/* Business Hours\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Compute business hour segs for the grid's current date range.\n\t// Caller must ask if whole-day business hours are needed.\n\t// If no `businessHours` configuration value is specified, assumes the calendar default.\n\tbuildBusinessHourSegs: function(wholeDay, businessHours) {\n\t\treturn this.eventsToSegs(\n\t\t\tthis.buildBusinessHourEvents(wholeDay, businessHours)\n\t\t);\n\t},\n\n\n\t// Compute business hour *events* for the grid's current date range.\n\t// Caller must ask if whole-day business hours are needed.\n\t// If no `businessHours` configuration value is specified, assumes the calendar default.\n\tbuildBusinessHourEvents: function(wholeDay, businessHours) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar events;\n\n\t\tif (businessHours == null) {\n\t\t\t// fallback\n\t\t\t// access from calendawr. don't access from view. doesn't update with dynamic options.\n\t\t\tbusinessHours = calendar.opt('businessHours');\n\t\t}\n\n\t\tevents = calendar.computeBusinessHourEvents(wholeDay, businessHours);\n\n\t\t// HACK. Eventually refactor business hours \"events\" system.\n\t\t// If no events are given, but businessHours is activated, this means the entire visible range should be\n\t\t// marked as *not* business-hours, via inverse-background rendering.\n\t\tif (!events.length && businessHours) {\n\t\t\tevents = [\n\t\t\t\t$.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, {\n\t\t\t\t\tstart: this.view.activeRange.end, // guaranteed out-of-range\n\t\t\t\t\tend: this.view.activeRange.end, // \"\n\t\t\t\t\tdow: null\n\t\t\t\t})\n\t\t\t];\n\t\t}\n\n\t\treturn events;\n\t},\n\n\n\t/* Handlers\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Attaches event-element-related handlers for *all* rendered event segments of the view.\n\tbindSegHandlers: function() {\n\t\tthis.bindSegHandlersToEl(this.el);\n\t},\n\n\n\t// Attaches event-element-related handlers to an arbitrary container element. leverages bubbling.\n\tbindSegHandlersToEl: function(el) {\n\t\tthis.bindSegHandlerToEl(el, 'touchstart', this.handleSegTouchStart);\n\t\tthis.bindSegHandlerToEl(el, 'mouseenter', this.handleSegMouseover);\n\t\tthis.bindSegHandlerToEl(el, 'mouseleave', this.handleSegMouseout);\n\t\tthis.bindSegHandlerToEl(el, 'mousedown', this.handleSegMousedown);\n\t\tthis.bindSegHandlerToEl(el, 'click', this.handleSegClick);\n\t},\n\n\n\t// Executes a handler for any a user-interaction on a segment.\n\t// Handler gets called with (seg, ev), and with the `this` context of the Grid\n\tbindSegHandlerToEl: function(el, name, handler) {\n\t\tvar _this = this;\n\n\t\tel.on(name, this.segSelector, function(ev) {\n\t\t\tvar seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents\n\n\t\t\t// only call the handlers if there is not a drag/resize in progress\n\t\t\tif (seg && !_this.isDraggingSeg && !_this.isResizingSeg) {\n\t\t\t\treturn handler.call(_this, seg, ev); // context will be the Grid\n\t\t\t}\n\t\t});\n\t},\n\n\n\thandleSegClick: function(seg, ev) {\n\t\tvar res = this.view.publiclyTrigger('eventClick', seg.el[0], seg.event, ev); // can return `false` to cancel\n\t\tif (res === false) {\n\t\t\tev.preventDefault();\n\t\t}\n\t},\n\n\n\t// Updates internal state and triggers handlers for when an event element is moused over\n\thandleSegMouseover: function(seg, ev) {\n\t\tif (\n\t\t\t!GlobalEmitter.get().shouldIgnoreMouse() &&\n\t\t\t!this.mousedOverSeg\n\t\t) {\n\t\t\tthis.mousedOverSeg = seg;\n\t\t\tif (this.view.isEventResizable(seg.event)) {\n\t\t\t\tseg.el.addClass('fc-allow-mouse-resize');\n\t\t\t}\n\t\t\tthis.view.publiclyTrigger('eventMouseover', seg.el[0], seg.event, ev);\n\t\t}\n\t},\n\n\n\t// Updates internal state and triggers handlers for when an event element is moused out.\n\t// Can be given no arguments, in which case it will mouseout the segment that was previously moused over.\n\thandleSegMouseout: function(seg, ev) {\n\t\tev = ev || {}; // if given no args, make a mock mouse event\n\n\t\tif (this.mousedOverSeg) {\n\t\t\tseg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment\n\t\t\tthis.mousedOverSeg = null;\n\t\t\tif (this.view.isEventResizable(seg.event)) {\n\t\t\t\tseg.el.removeClass('fc-allow-mouse-resize');\n\t\t\t}\n\t\t\tthis.view.publiclyTrigger('eventMouseout', seg.el[0], seg.event, ev);\n\t\t}\n\t},\n\n\n\thandleSegMousedown: function(seg, ev) {\n\t\tvar isResizing = this.startSegResize(seg, ev, { distance: 5 });\n\n\t\tif (!isResizing && this.view.isEventDraggable(seg.event)) {\n\t\t\tthis.buildSegDragListener(seg)\n\t\t\t\t.startInteraction(ev, {\n\t\t\t\t\tdistance: 5\n\t\t\t\t});\n\t\t}\n\t},\n\n\n\thandleSegTouchStart: function(seg, ev) {\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\t\tvar isSelected = view.isEventSelected(event);\n\t\tvar isDraggable = view.isEventDraggable(event);\n\t\tvar isResizable = view.isEventResizable(event);\n\t\tvar isResizing = false;\n\t\tvar dragListener;\n\t\tvar eventLongPressDelay;\n\n\t\tif (isSelected && isResizable) {\n\t\t\t// only allow resizing of the event is selected\n\t\t\tisResizing = this.startSegResize(seg, ev);\n\t\t}\n\n\t\tif (!isResizing && (isDraggable || isResizable)) { // allowed to be selected?\n\n\t\t\teventLongPressDelay = view.opt('eventLongPressDelay');\n\t\t\tif (eventLongPressDelay == null) {\n\t\t\t\teventLongPressDelay = view.opt('longPressDelay'); // fallback\n\t\t\t}\n\n\t\t\tdragListener = isDraggable ?\n\t\t\t\tthis.buildSegDragListener(seg) :\n\t\t\t\tthis.buildSegSelectListener(seg); // seg isn't draggable, but still needs to be selected\n\n\t\t\tdragListener.startInteraction(ev, { // won't start if already started\n\t\t\t\tdelay: isSelected ? 0 : eventLongPressDelay // do delay if not already selected\n\t\t\t});\n\t\t}\n\t},\n\n\n\t// returns boolean whether resizing actually started or not.\n\t// assumes the seg allows resizing.\n\t// `dragOptions` are optional.\n\tstartSegResize: function(seg, ev, dragOptions) {\n\t\tif ($(ev.target).is('.fc-resizer')) {\n\t\t\tthis.buildSegResizeListener(seg, $(ev.target).is('.fc-start-resizer'))\n\t\t\t\t.startInteraction(ev, dragOptions);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\n\n\t/* Event Dragging\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Builds a listener that will track user-dragging on an event segment.\n\t// Generic enough to work with any type of Grid.\n\t// Has side effect of setting/unsetting `segDragListener`\n\tbuildSegDragListener: function(seg) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar el = seg.el;\n\t\tvar event = seg.event;\n\t\tvar isDragging;\n\t\tvar mouseFollower; // A clone of the original element that will move with the mouse\n\t\tvar dropLocation; // zoned event date properties\n\n\t\tif (this.segDragListener) {\n\t\t\treturn this.segDragListener;\n\t\t}\n\n\t\t// Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents\n\t\t// of the view.\n\t\tvar dragListener = this.segDragListener = new HitDragListener(view, {\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tsubjectEl: el,\n\t\t\tsubjectCenter: true,\n\t\t\tinteractionStart: function(ev) {\n\t\t\t\tseg.component = _this; // for renderDrag\n\t\t\t\tisDragging = false;\n\t\t\t\tmouseFollower = new MouseFollower(seg.el, {\n\t\t\t\t\tadditionalClass: 'fc-dragging',\n\t\t\t\t\tparentEl: view.el,\n\t\t\t\t\topacity: dragListener.isTouch ? null : view.opt('dragOpacity'),\n\t\t\t\t\trevertDuration: view.opt('dragRevertDuration'),\n\t\t\t\t\tzIndex: 2 // one above the .fc-view\n\t\t\t\t});\n\t\t\t\tmouseFollower.hide(); // don't show until we know this is a real drag\n\t\t\t\tmouseFollower.start(ev);\n\t\t\t},\n\t\t\tdragStart: function(ev) {\n\t\t\t\tif (dragListener.isTouch && !view.isEventSelected(event)) {\n\t\t\t\t\t// if not previously selected, will fire after a delay. then, select the event\n\t\t\t\t\tview.selectEvent(event);\n\t\t\t\t}\n\t\t\t\tisDragging = true;\n\t\t\t\t_this.handleSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported\n\t\t\t\t_this.segDragStart(seg, ev);\n\t\t\t\tview.hideEvent(event); // hide all event segments. our mouseFollower will take over\n\t\t\t},\n\t\t\thitOver: function(hit, isOrig, origHit) {\n\t\t\t\tvar isAllowed = true;\n\t\t\t\tvar origHitSpan;\n\t\t\t\tvar hitSpan;\n\t\t\t\tvar dragHelperEls;\n\n\t\t\t\t// starting hit could be forced (DayGrid.limit)\n\t\t\t\tif (seg.hit) {\n\t\t\t\t\torigHit = seg.hit;\n\t\t\t\t}\n\n\t\t\t\t// hit might not belong to this grid, so query origin grid\n\t\t\t\torigHitSpan = origHit.component.getSafeHitSpan(origHit);\n\t\t\t\thitSpan = hit.component.getSafeHitSpan(hit);\n\n\t\t\t\tif (origHitSpan && hitSpan) {\n\t\t\t\t\tdropLocation = _this.computeEventDrop(origHitSpan, hitSpan, event);\n\t\t\t\t\tisAllowed = dropLocation && _this.isEventLocationAllowed(dropLocation, event);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tisAllowed = false;\n\t\t\t\t}\n\n\t\t\t\tif (!isAllowed) {\n\t\t\t\t\tdropLocation = null;\n\t\t\t\t\tdisableCursor();\n\t\t\t\t}\n\n\t\t\t\t// if a valid drop location, have the subclass render a visual indication\n\t\t\t\tif (dropLocation && (dragHelperEls = view.renderDrag(dropLocation, seg))) {\n\n\t\t\t\t\tdragHelperEls.addClass('fc-dragging');\n\t\t\t\t\tif (!dragListener.isTouch) {\n\t\t\t\t\t\t_this.applyDragOpacity(dragHelperEls);\n\t\t\t\t\t}\n\n\t\t\t\t\tmouseFollower.hide(); // if the subclass is already using a mock event \"helper\", hide our own\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tmouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)\n\t\t\t\t}\n\n\t\t\t\tif (isOrig) {\n\t\t\t\t\tdropLocation = null; // needs to have moved hits to be a valid drop\n\t\t\t\t}\n\t\t\t},\n\t\t\thitOut: function() { // called before mouse moves to a different hit OR moved out of all hits\n\t\t\t\tview.unrenderDrag(); // unrender whatever was done in renderDrag\n\t\t\t\tmouseFollower.show(); // show in case we are moving out of all hits\n\t\t\t\tdropLocation = null;\n\t\t\t},\n\t\t\thitDone: function() { // Called after a hitOut OR before a dragEnd\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tinteractionEnd: function(ev) {\n\t\t\t\tdelete seg.component; // prevent side effects\n\n\t\t\t\t// do revert animation if hasn't changed. calls a callback when finished (whether animation or not)\n\t\t\t\tmouseFollower.stop(!dropLocation, function() {\n\t\t\t\t\tif (isDragging) {\n\t\t\t\t\t\tview.unrenderDrag();\n\t\t\t\t\t\t_this.segDragStop(seg, ev);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dropLocation) {\n\t\t\t\t\t\t// no need to re-show original, will rerender all anyways. esp important if eventRenderWait\n\t\t\t\t\t\tview.reportSegDrop(seg, dropLocation, _this.largeUnit, el, ev);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tview.showEvent(event);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t_this.segDragListener = null;\n\t\t\t}\n\t\t});\n\n\t\treturn dragListener;\n\t},\n\n\n\t// seg isn't draggable, but let's use a generic DragListener\n\t// simply for the delay, so it can be selected.\n\t// Has side effect of setting/unsetting `segDragListener`\n\tbuildSegSelectListener: function(seg) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\n\t\tif (this.segDragListener) {\n\t\t\treturn this.segDragListener;\n\t\t}\n\n\t\tvar dragListener = this.segDragListener = new DragListener({\n\t\t\tdragStart: function(ev) {\n\t\t\t\tif (dragListener.isTouch && !view.isEventSelected(event)) {\n\t\t\t\t\t// if not previously selected, will fire after a delay. then, select the event\n\t\t\t\t\tview.selectEvent(event);\n\t\t\t\t}\n\t\t\t},\n\t\t\tinteractionEnd: function(ev) {\n\t\t\t\t_this.segDragListener = null;\n\t\t\t}\n\t\t});\n\n\t\treturn dragListener;\n\t},\n\n\n\t// Called before event segment dragging starts\n\tsegDragStart: function(seg, ev) {\n\t\tthis.isDraggingSeg = true;\n\t\tthis.view.publiclyTrigger('eventDragStart', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Called after event segment dragging stops\n\tsegDragStop: function(seg, ev) {\n\t\tthis.isDraggingSeg = false;\n\t\tthis.view.publiclyTrigger('eventDragStop', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Given the spans an event drag began, and the span event was dropped, calculates the new zoned start/end/allDay\n\t// values for the event. Subclasses may override and set additional properties to be used by renderDrag.\n\t// A falsy returned value indicates an invalid drop.\n\t// DOES NOT consider overlap/constraint.\n\tcomputeEventDrop: function(startSpan, endSpan, event) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar dragStart = startSpan.start;\n\t\tvar dragEnd = endSpan.start;\n\t\tvar delta;\n\t\tvar dropLocation; // zoned event date properties\n\n\t\tif (dragStart.hasTime() === dragEnd.hasTime()) {\n\t\t\tdelta = this.diffDates(dragEnd, dragStart);\n\n\t\t\t// if an all-day event was in a timed area and it was dragged to a different time,\n\t\t\t// guarantee an end and adjust start/end to have times\n\t\t\tif (event.allDay && durationHasTime(delta)) {\n\t\t\t\tdropLocation = {\n\t\t\t\t\tstart: event.start.clone(),\n\t\t\t\t\tend: calendar.getEventEnd(event), // will be an ambig day\n\t\t\t\t\tallDay: false // for normalizeEventTimes\n\t\t\t\t};\n\t\t\t\tcalendar.normalizeEventTimes(dropLocation);\n\t\t\t}\n\t\t\t// othewise, work off existing values\n\t\t\telse {\n\t\t\t\tdropLocation = pluckEventDateProps(event);\n\t\t\t}\n\n\t\t\tdropLocation.start.add(delta);\n\t\t\tif (dropLocation.end) {\n\t\t\t\tdropLocation.end.add(delta);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// if switching from day <-> timed, start should be reset to the dropped date, and the end cleared\n\t\t\tdropLocation = {\n\t\t\t\tstart: dragEnd.clone(),\n\t\t\t\tend: null, // end should be cleared\n\t\t\t\tallDay: !dragEnd.hasTime()\n\t\t\t};\n\t\t}\n\n\t\treturn dropLocation;\n\t},\n\n\n\t// Utility for apply dragOpacity to a jQuery set\n\tapplyDragOpacity: function(els) {\n\t\tvar opacity = this.view.opt('dragOpacity');\n\n\t\tif (opacity != null) {\n\t\t\tels.css('opacity', opacity);\n\t\t}\n\t},\n\n\n\t/* External Element Dragging\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Called when a jQuery UI drag is initiated anywhere in the DOM\n\texternalDragStart: function(ev, ui) {\n\t\tvar view = this.view;\n\t\tvar el;\n\t\tvar accept;\n\n\t\tif (view.opt('droppable')) { // only listen if this setting is on\n\t\t\tel = $((ui ? ui.item : null) || ev.target);\n\n\t\t\t// Test that the dragged element passes the dropAccept selector or filter function.\n\t\t\t// FYI, the default is \"*\" (matches all)\n\t\t\taccept = view.opt('dropAccept');\n\t\t\tif ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {\n\t\t\t\tif (!this.isDraggingExternal) { // prevent double-listening if fired twice\n\t\t\t\t\tthis.listenToExternalDrag(el, ev, ui);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Called when a jQuery UI drag starts and it needs to be monitored for dropping\n\tlistenToExternalDrag: function(el, ev, ui) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create\n\t\tvar dropLocation; // a null value signals an unsuccessful drag\n\n\t\t// listener that tracks mouse movement over date-associated pixel regions\n\t\tvar dragListener = _this.externalDragListener = new HitDragListener(this, {\n\t\t\tinteractionStart: function() {\n\t\t\t\t_this.isDraggingExternal = true;\n\t\t\t},\n\t\t\thitOver: function(hit) {\n\t\t\t\tvar isAllowed = true;\n\t\t\t\tvar hitSpan = hit.component.getSafeHitSpan(hit); // hit might not belong to this grid\n\n\t\t\t\tif (hitSpan) {\n\t\t\t\t\tdropLocation = _this.computeExternalDrop(hitSpan, meta);\n\t\t\t\t\tisAllowed = dropLocation && _this.isExternalLocationAllowed(dropLocation, meta.eventProps);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tisAllowed = false;\n\t\t\t\t}\n\n\t\t\t\tif (!isAllowed) {\n\t\t\t\t\tdropLocation = null;\n\t\t\t\t\tdisableCursor();\n\t\t\t\t}\n\n\t\t\t\tif (dropLocation) {\n\t\t\t\t\t_this.renderDrag(dropLocation); // called without a seg parameter\n\t\t\t\t}\n\t\t\t},\n\t\t\thitOut: function() {\n\t\t\t\tdropLocation = null; // signal unsuccessful\n\t\t\t},\n\t\t\thitDone: function() { // Called after a hitOut OR before a dragEnd\n\t\t\t\tenableCursor();\n\t\t\t\t_this.unrenderDrag();\n\t\t\t},\n\t\t\tinteractionEnd: function(ev) {\n\t\t\t\tif (dropLocation) { // element was dropped on a valid hit\n\t\t\t\t\tview.reportExternalDrop(meta, dropLocation, el, ev, ui);\n\t\t\t\t}\n\t\t\t\t_this.isDraggingExternal = false;\n\t\t\t\t_this.externalDragListener = null;\n\t\t\t}\n\t\t});\n\n\t\tdragListener.startDrag(ev); // start listening immediately\n\t},\n\n\n\t// Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),\n\t// returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null.\n\t// Returning a null value signals an invalid drop hit.\n\t// DOES NOT consider overlap/constraint.\n\tcomputeExternalDrop: function(span, meta) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar dropLocation = {\n\t\t\tstart: calendar.applyTimezone(span.start), // simulate a zoned event start date\n\t\t\tend: null\n\t\t};\n\n\t\t// if dropped on an all-day span, and element's metadata specified a time, set it\n\t\tif (meta.startTime && !dropLocation.start.hasTime()) {\n\t\t\tdropLocation.start.time(meta.startTime);\n\t\t}\n\n\t\tif (meta.duration) {\n\t\t\tdropLocation.end = dropLocation.start.clone().add(meta.duration);\n\t\t}\n\n\t\treturn dropLocation;\n\t},\n\n\n\n\t/* Drag Rendering (for both events and an external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event or external element being dragged.\n\t// `dropLocation` contains hypothetical start/end/allDay values the event would have if dropped. end can be null.\n\t// `seg` is the internal segment object that is being dragged. If dragging an external element, `seg` is null.\n\t// A truthy returned value indicates this method has rendered a helper element.\n\t// Must return elements used for any mock events.\n\trenderDrag: function(dropLocation, seg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a visual indication of an event or external element being dragged\n\tunrenderDrag: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Resizing\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Creates a listener that tracks the user as they resize an event segment.\n\t// Generic enough to work with any type of Grid.\n\tbuildSegResizeListener: function(seg, isStart) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar calendar = view.calendar;\n\t\tvar el = seg.el;\n\t\tvar event = seg.event;\n\t\tvar eventEnd = calendar.getEventEnd(event);\n\t\tvar isDragging;\n\t\tvar resizeLocation; // zoned event date properties. falsy if invalid resize\n\n\t\t// Tracks mouse movement over the *grid's* coordinate map\n\t\tvar dragListener = this.segResizeListener = new HitDragListener(this, {\n\t\t\tscroll: view.opt('dragScroll'),\n\t\t\tsubjectEl: el,\n\t\t\tinteractionStart: function() {\n\t\t\t\tisDragging = false;\n\t\t\t},\n\t\t\tdragStart: function(ev) {\n\t\t\t\tisDragging = true;\n\t\t\t\t_this.handleSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported\n\t\t\t\t_this.segResizeStart(seg, ev);\n\t\t\t},\n\t\t\thitOver: function(hit, isOrig, origHit) {\n\t\t\t\tvar isAllowed = true;\n\t\t\t\tvar origHitSpan = _this.getSafeHitSpan(origHit);\n\t\t\t\tvar hitSpan = _this.getSafeHitSpan(hit);\n\n\t\t\t\tif (origHitSpan && hitSpan) {\n\t\t\t\t\tresizeLocation = isStart ?\n\t\t\t\t\t\t_this.computeEventStartResize(origHitSpan, hitSpan, event) :\n\t\t\t\t\t\t_this.computeEventEndResize(origHitSpan, hitSpan, event);\n\n\t\t\t\t\tisAllowed = resizeLocation && _this.isEventLocationAllowed(resizeLocation, event);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tisAllowed = false;\n\t\t\t\t}\n\n\t\t\t\tif (!isAllowed) {\n\t\t\t\t\tresizeLocation = null;\n\t\t\t\t\tdisableCursor();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (\n\t\t\t\t\t\tresizeLocation.start.isSame(event.start.clone().stripZone()) &&\n\t\t\t\t\t\tresizeLocation.end.isSame(eventEnd.clone().stripZone())\n\t\t\t\t\t) {\n\t\t\t\t\t\t// no change. (FYI, event dates might have zones)\n\t\t\t\t\t\tresizeLocation = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (resizeLocation) {\n\t\t\t\t\tview.hideEvent(event);\n\t\t\t\t\t_this.renderEventResize(resizeLocation, seg);\n\t\t\t\t}\n\t\t\t},\n\t\t\thitOut: function() { // called before mouse moves to a different hit OR moved out of all hits\n\t\t\t\tresizeLocation = null;\n\t\t\t\tview.showEvent(event); // for when out-of-bounds. show original\n\t\t\t},\n\t\t\thitDone: function() { // resets the rendering to show the original event\n\t\t\t\t_this.unrenderEventResize();\n\t\t\t\tenableCursor();\n\t\t\t},\n\t\t\tinteractionEnd: function(ev) {\n\t\t\t\tif (isDragging) {\n\t\t\t\t\t_this.segResizeStop(seg, ev);\n\t\t\t\t}\n\n\t\t\t\tif (resizeLocation) { // valid date to resize to?\n\t\t\t\t\t// no need to re-show original, will rerender all anyways. esp important if eventRenderWait\n\t\t\t\t\tview.reportSegResize(seg, resizeLocation, _this.largeUnit, el, ev);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tview.showEvent(event);\n\t\t\t\t}\n\t\t\t\t_this.segResizeListener = null;\n\t\t\t}\n\t\t});\n\n\t\treturn dragListener;\n\t},\n\n\n\t// Called before event segment resizing starts\n\tsegResizeStart: function(seg, ev) {\n\t\tthis.isResizingSeg = true;\n\t\tthis.view.publiclyTrigger('eventResizeStart', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Called after event segment resizing stops\n\tsegResizeStop: function(seg, ev) {\n\t\tthis.isResizingSeg = false;\n\t\tthis.view.publiclyTrigger('eventResizeStop', seg.el[0], seg.event, ev, {}); // last argument is jqui dummy\n\t},\n\n\n\t// Returns new date-information for an event segment being resized from its start\n\tcomputeEventStartResize: function(startSpan, endSpan, event) {\n\t\treturn this.computeEventResize('start', startSpan, endSpan, event);\n\t},\n\n\n\t// Returns new date-information for an event segment being resized from its end\n\tcomputeEventEndResize: function(startSpan, endSpan, event) {\n\t\treturn this.computeEventResize('end', startSpan, endSpan, event);\n\t},\n\n\n\t// Returns new zoned date information for an event segment being resized from its start OR end\n\t// `type` is either 'start' or 'end'.\n\t// DOES NOT consider overlap/constraint.\n\tcomputeEventResize: function(type, startSpan, endSpan, event) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar delta = this.diffDates(endSpan[type], startSpan[type]);\n\t\tvar resizeLocation; // zoned event date properties\n\t\tvar defaultDuration;\n\n\t\t// build original values to work from, guaranteeing a start and end\n\t\tresizeLocation = {\n\t\t\tstart: event.start.clone(),\n\t\t\tend: calendar.getEventEnd(event),\n\t\t\tallDay: event.allDay\n\t\t};\n\n\t\t// if an all-day event was in a timed area and was resized to a time, adjust start/end to have times\n\t\tif (resizeLocation.allDay && durationHasTime(delta)) {\n\t\t\tresizeLocation.allDay = false;\n\t\t\tcalendar.normalizeEventTimes(resizeLocation);\n\t\t}\n\n\t\tresizeLocation[type].add(delta); // apply delta to start or end\n\n\t\t// if the event was compressed too small, find a new reasonable duration for it\n\t\tif (!resizeLocation.start.isBefore(resizeLocation.end)) {\n\n\t\t\tdefaultDuration =\n\t\t\t\tthis.minResizeDuration || // TODO: hack\n\t\t\t\t(event.allDay ?\n\t\t\t\t\tcalendar.defaultAllDayEventDuration :\n\t\t\t\t\tcalendar.defaultTimedEventDuration);\n\n\t\t\tif (type == 'start') { // resizing the start?\n\t\t\t\tresizeLocation.start = resizeLocation.end.clone().subtract(defaultDuration);\n\t\t\t}\n\t\t\telse { // resizing the end?\n\t\t\t\tresizeLocation.end = resizeLocation.start.clone().add(defaultDuration);\n\t\t\t}\n\t\t}\n\n\t\treturn resizeLocation;\n\t},\n\n\n\t// Renders a visual indication of an event being resized.\n\t// `range` has the updated dates of the event. `seg` is the original segment object involved in the drag.\n\t// Must return elements used for any mock events.\n\trenderEventResize: function(range, seg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a visual indication of an event being resized.\n\tunrenderEventResize: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Rendering Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Compute the text that should be displayed on an event's element.\n\t// `range` can be the Event object itself, or something range-like, with at least a `start`.\n\t// If event times are disabled, or the event has no time, will return a blank string.\n\t// If not specified, formatStr will default to the eventTimeFormat setting,\n\t// and displayEnd will default to the displayEventEnd setting.\n\tgetEventTimeText: function(range, formatStr, displayEnd) {\n\n\t\tif (formatStr == null) {\n\t\t\tformatStr = this.eventTimeFormat;\n\t\t}\n\n\t\tif (displayEnd == null) {\n\t\t\tdisplayEnd = this.displayEventEnd;\n\t\t}\n\n\t\tif (this.displayEventTime && range.start.hasTime()) {\n\t\t\tif (displayEnd && range.end) {\n\t\t\t\treturn this.view.formatRange(range, formatStr);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn range.start.format(formatStr);\n\t\t\t}\n\t\t}\n\n\t\treturn '';\n\t},\n\n\n\t// Generic utility for generating the HTML classNames for an event segment's element\n\tgetSegClasses: function(seg, isDraggable, isResizable) {\n\t\tvar view = this.view;\n\t\tvar classes = [\n\t\t\t'fc-event',\n\t\t\tseg.isStart ? 'fc-start' : 'fc-not-start',\n\t\t\tseg.isEnd ? 'fc-end' : 'fc-not-end'\n\t\t].concat(this.getSegCustomClasses(seg));\n\n\t\tif (isDraggable) {\n\t\t\tclasses.push('fc-draggable');\n\t\t}\n\t\tif (isResizable) {\n\t\t\tclasses.push('fc-resizable');\n\t\t}\n\n\t\t// event is currently selected? attach a className.\n\t\tif (view.isEventSelected(seg.event)) {\n\t\t\tclasses.push('fc-selected');\n\t\t}\n\n\t\treturn classes;\n\t},\n\n\n\t// List of classes that were defined by the caller of the API in some way\n\tgetSegCustomClasses: function(seg) {\n\t\tvar event = seg.event;\n\n\t\treturn [].concat(\n\t\t\tevent.className, // guaranteed to be an array\n\t\t\tevent.source ? event.source.className : []\n\t\t);\n\t},\n\n\n\t// Utility for generating event skin-related CSS properties\n\tgetSegSkinCss: function(seg) {\n\t\treturn {\n\t\t\t'background-color': this.getSegBackgroundColor(seg),\n\t\t\t'border-color': this.getSegBorderColor(seg),\n\t\t\tcolor: this.getSegTextColor(seg)\n\t\t};\n\t},\n\n\n\t// Queries for caller-specified color, then falls back to default\n\tgetSegBackgroundColor: function(seg) {\n\t\treturn seg.event.backgroundColor ||\n\t\t\tseg.event.color ||\n\t\t\tthis.getSegDefaultBackgroundColor(seg);\n\t},\n\n\n\tgetSegDefaultBackgroundColor: function(seg) {\n\t\tvar source = seg.event.source || {};\n\n\t\treturn source.backgroundColor ||\n\t\t\tsource.color ||\n\t\t\tthis.view.opt('eventBackgroundColor') ||\n\t\t\tthis.view.opt('eventColor');\n\t},\n\n\n\t// Queries for caller-specified color, then falls back to default\n\tgetSegBorderColor: function(seg) {\n\t\treturn seg.event.borderColor ||\n\t\t\tseg.event.color ||\n\t\t\tthis.getSegDefaultBorderColor(seg);\n\t},\n\n\n\tgetSegDefaultBorderColor: function(seg) {\n\t\tvar source = seg.event.source || {};\n\n\t\treturn source.borderColor ||\n\t\t\tsource.color ||\n\t\t\tthis.view.opt('eventBorderColor') ||\n\t\t\tthis.view.opt('eventColor');\n\t},\n\n\n\t// Queries for caller-specified color, then falls back to default\n\tgetSegTextColor: function(seg) {\n\t\treturn seg.event.textColor ||\n\t\t\tthis.getSegDefaultTextColor(seg);\n\t},\n\n\n\tgetSegDefaultTextColor: function(seg) {\n\t\tvar source = seg.event.source || {};\n\n\t\treturn source.textColor ||\n\t\t\tthis.view.opt('eventTextColor');\n\t},\n\n\n\t/* Event Location Validation\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tisEventLocationAllowed: function(eventLocation, event) {\n\t\tif (this.isEventLocationInRange(eventLocation)) {\n\t\t\tvar calendar = this.view.calendar;\n\t\t\tvar eventSpans = this.eventToSpans(eventLocation);\n\t\t\tvar i;\n\n\t\t\tif (eventSpans.length) {\n\t\t\t\tfor (i = 0; i < eventSpans.length; i++) {\n\t\t\t\t\tif (!calendar.isEventSpanAllowed(eventSpans[i], event)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\n\tisExternalLocationAllowed: function(eventLocation, metaProps) { // FOR the external element\n\t\tif (this.isEventLocationInRange(eventLocation)) {\n\t\t\tvar calendar = this.view.calendar;\n\t\t\tvar eventSpans = this.eventToSpans(eventLocation);\n\t\t\tvar i;\n\n\t\t\tif (eventSpans.length) {\n\t\t\t\tfor (i = 0; i < eventSpans.length; i++) {\n\t\t\t\t\tif (!calendar.isExternalSpanAllowed(eventSpans[i], eventLocation, metaProps)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\n\tisEventLocationInRange: function(eventLocation) {\n\t\treturn isRangeWithinRange(\n\t\t\tthis.eventToRawRange(eventLocation),\n\t\t\tthis.view.validRange\n\t\t);\n\t},\n\n\n\t/* Converting events -> eventRange -> eventSpan -> eventSegs\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Generates an array of segments for the given single event\n\t// Can accept an event \"location\" as well (which only has start/end and no allDay)\n\teventToSegs: function(event) {\n\t\treturn this.eventsToSegs([ event ]);\n\t},\n\n\n\t// Generates spans (always unzoned) for the given event.\n\t// Does not do any inverting for inverse-background events.\n\t// Can accept an event \"location\" as well (which only has start/end and no allDay)\n\teventToSpans: function(event) {\n\t\tvar eventRange = this.eventToRange(event); // { start, end, isStart, isEnd }\n\n\t\tif (eventRange) {\n\t\t\treturn this.eventRangeToSpans(eventRange, event);\n\t\t}\n\t\telse { // out of view's valid range\n\t\t\treturn [];\n\t\t}\n\t},\n\n\n\n\t// Converts an array of event objects into an array of event segment objects.\n\t// A custom `segSliceFunc` may be given for arbitrarily slicing up events.\n\t// Doesn't guarantee an order for the resulting array.\n\teventsToSegs: function(allEvents, segSliceFunc) {\n\t\tvar _this = this;\n\t\tvar eventsById = groupEventsById(allEvents);\n\t\tvar segs = [];\n\n\t\t$.each(eventsById, function(id, events) {\n\t\t\tvar visibleEvents = [];\n\t\t\tvar eventRanges = [];\n\t\t\tvar eventRange; // { start, end, isStart, isEnd }\n\t\t\tvar i;\n\n\t\t\tfor (i = 0; i < events.length; i++) {\n\t\t\t\teventRange = _this.eventToRange(events[i]); // might be null if completely out of range\n\n\t\t\t\tif (eventRange) {\n\t\t\t\t\teventRanges.push(eventRange);\n\t\t\t\t\tvisibleEvents.push(events[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// inverse-background events (utilize only the first event in calculations)\n\t\t\tif (isInverseBgEvent(events[0])) {\n\t\t\t\teventRanges = _this.invertRanges(eventRanges); // will lose isStart/isEnd\n\n\t\t\t\tfor (i = 0; i < eventRanges.length; i++) {\n\t\t\t\t\tsegs.push.apply(segs, // append to\n\t\t\t\t\t\t_this.eventRangeToSegs(eventRanges[i], events[0], segSliceFunc)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// normal event ranges\n\t\t\telse {\n\t\t\t\tfor (i = 0; i < eventRanges.length; i++) {\n\t\t\t\t\tsegs.push.apply(segs, // append to\n\t\t\t\t\t\t_this.eventRangeToSegs(eventRanges[i], visibleEvents[i], segSliceFunc)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn segs;\n\t},\n\n\n\t// Generates the unzoned start/end dates an event appears to occupy\n\t// Can accept an event \"location\" as well (which only has start/end and no allDay)\n\t// returns { start, end, isStart, isEnd }\n\t// If the event is completely outside of the grid's valid range, will return undefined.\n\teventToRange: function(event) {\n\t\treturn this.refineRawEventRange(\n\t\t\tthis.eventToRawRange(event)\n\t\t);\n\t},\n\n\n\t// Ensures the given range is within the view's activeRange and is correctly localized.\n\t// Always returns a result\n\trefineRawEventRange: function(rawRange) {\n\t\tvar view = this.view;\n\t\tvar calendar = view.calendar;\n\t\tvar range = intersectRanges(rawRange, view.activeRange);\n\n\t\tif (range) { // otherwise, event doesn't have valid range\n\n\t\t\t// hack: dynamic locale change forgets to upate stored event localed\n\t\t\tcalendar.localizeMoment(range.start);\n\t\t\tcalendar.localizeMoment(range.end);\n\n\t\t\treturn range;\n\t\t}\n\t},\n\n\n\t// not constrained to valid dates\n\t// not given localizeMoment hack\n\teventToRawRange: function(event) {\n\t\tvar calendar = this.view.calendar;\n\t\tvar start = event.start.clone().stripZone();\n\t\tvar end = (\n\t\t\t\tevent.end ?\n\t\t\t\t\tevent.end.clone() :\n\t\t\t\t\t// derive the end from the start and allDay. compute allDay if necessary\n\t\t\t\t\tcalendar.getDefaultEventEnd(\n\t\t\t\t\t\tevent.allDay != null ?\n\t\t\t\t\t\t\tevent.allDay :\n\t\t\t\t\t\t\t!event.start.hasTime(),\n\t\t\t\t\t\tevent.start\n\t\t\t\t\t)\n\t\t\t).stripZone();\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\t// Given an event's range (unzoned start/end), and the event itself,\n\t// slice into segments (using the segSliceFunc function if specified)\n\t// eventRange - { start, end, isStart, isEnd }\n\teventRangeToSegs: function(eventRange, event, segSliceFunc) {\n\t\tvar eventSpans = this.eventRangeToSpans(eventRange, event);\n\t\tvar segs = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < eventSpans.length; i++) {\n\t\t\tsegs.push.apply(segs, // append to\n\t\t\t\tthis.eventSpanToSegs(eventSpans[i], event, segSliceFunc)\n\t\t\t);\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t// Given an event's unzoned date range, return an array of eventSpan objects.\n\t// eventSpan - { start, end, isStart, isEnd, otherthings... }\n\t// Subclasses can override.\n\t// Subclasses are obligated to forward eventRange.isStart/isEnd to the resulting spans.\n\teventRangeToSpans: function(eventRange, event) {\n\t\treturn [ $.extend({}, eventRange) ]; // copy into a single-item array\n\t},\n\n\n\t// Given an event's span (unzoned start/end and other misc data), and the event itself,\n\t// slices into segments and attaches event-derived properties to them.\n\t// eventSpan - { start, end, isStart, isEnd, otherthings... }\n\teventSpanToSegs: function(eventSpan, event, segSliceFunc) {\n\t\tvar segs = segSliceFunc ? segSliceFunc(eventSpan) : this.spanToSegs(eventSpan);\n\t\tvar i, seg;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\n\t\t\t// the eventSpan's isStart/isEnd takes precedence over the seg's\n\t\t\tif (!eventSpan.isStart) {\n\t\t\t\tseg.isStart = false;\n\t\t\t}\n\t\t\tif (!eventSpan.isEnd) {\n\t\t\t\tseg.isEnd = false;\n\t\t\t}\n\n\t\t\tseg.event = event;\n\t\t\tseg.eventStartMS = +eventSpan.start; // TODO: not the best name after making spans unzoned\n\t\t\tseg.eventDurationMS = eventSpan.end - eventSpan.start;\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t// Produces a new array of range objects that will cover all the time NOT covered by the given ranges.\n\t// SIDE EFFECT: will mutate the given array and will use its date references.\n\tinvertRanges: function(ranges) {\n\t\tvar view = this.view;\n\t\tvar viewStart = view.activeRange.start.clone(); // need a copy\n\t\tvar viewEnd = view.activeRange.end.clone(); // need a copy\n\t\tvar inverseRanges = [];\n\t\tvar start = viewStart; // the end of the previous range. the start of the new range\n\t\tvar i, range;\n\n\t\t// ranges need to be in order. required for our date-walking algorithm\n\t\tranges.sort(compareRanges);\n\n\t\tfor (i = 0; i < ranges.length; i++) {\n\t\t\trange = ranges[i];\n\n\t\t\t// add the span of time before the event (if there is any)\n\t\t\tif (range.start > start) { // compare millisecond time (skip any ambig logic)\n\t\t\t\tinverseRanges.push({\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: range.start\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (range.end > start) {\n\t\t\t\tstart = range.end;\n\t\t\t}\n\t\t}\n\n\t\t// add the span of time after the last event (if there is any)\n\t\tif (start < viewEnd) { // compare millisecond time (skip any ambig logic)\n\t\t\tinverseRanges.push({\n\t\t\t\tstart: start,\n\t\t\t\tend: viewEnd\n\t\t\t});\n\t\t}\n\n\t\treturn inverseRanges;\n\t},\n\n\n\tsortEventSegs: function(segs) {\n\t\tsegs.sort(proxy(this, 'compareEventSegs'));\n\t},\n\n\n\t// A cmp function for determining which segments should take visual priority\n\tcompareEventSegs: function(seg1, seg2) {\n\t\treturn seg1.eventStartMS - seg2.eventStartMS || // earlier events go first\n\t\t\tseg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first\n\t\t\tseg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1)\n\t\t\tcompareByFieldSpecs(seg1.event, seg2.event, this.view.eventOrderSpecs);\n\t}\n\n});\n\n\n/* Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction pluckEventDateProps(event) {\n\treturn {\n\t\tstart: event.start.clone(),\n\t\tend: event.end ? event.end.clone() : null,\n\t\tallDay: event.allDay // keep it the same\n\t};\n}\nFC.pluckEventDateProps = pluckEventDateProps;\n\n\nfunction isBgEvent(event) { // returns true if background OR inverse-background\n\tvar rendering = getEventRendering(event);\n\treturn rendering === 'background' || rendering === 'inverse-background';\n}\nFC.isBgEvent = isBgEvent; // export\n\n\nfunction isInverseBgEvent(event) {\n\treturn getEventRendering(event) === 'inverse-background';\n}\n\n\nfunction getEventRendering(event) {\n\treturn firstDefined((event.source || {}).rendering, event.rendering);\n}\n\n\nfunction groupEventsById(events) {\n\tvar eventsById = {};\n\tvar i, event;\n\n\tfor (i = 0; i < events.length; i++) {\n\t\tevent = events[i];\n\t\t(eventsById[event._id] || (eventsById[event._id] = [])).push(event);\n\t}\n\n\treturn eventsById;\n}\n\n\n// A cmp function for determining which non-inverted \"ranges\" (see above) happen earlier\nfunction compareRanges(range1, range2) {\n\treturn range1.start - range2.start; // earlier ranges go first\n}\n\n\n/* External-Dragging-Element Data\n----------------------------------------------------------------------------------------------------------------------*/\n\n// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.\n// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.\nFC.dataAttrPrefix = '';\n\n// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure\n// to be used for Event Object creation.\n// A defined `.eventProps`, even when empty, indicates that an event should be created.\nfunction getDraggedElMeta(el) {\n\tvar prefix = FC.dataAttrPrefix;\n\tvar eventProps; // properties for creating the event, not related to date/time\n\tvar startTime; // a Duration\n\tvar duration;\n\tvar stick;\n\n\tif (prefix) { prefix += '-'; }\n\teventProps = el.data(prefix + 'event') || null;\n\n\tif (eventProps) {\n\t\tif (typeof eventProps === 'object') {\n\t\t\teventProps = $.extend({}, eventProps); // make a copy\n\t\t}\n\t\telse { // something like 1 or true. still signal event creation\n\t\t\teventProps = {};\n\t\t}\n\n\t\t// pluck special-cased date/time properties\n\t\tstartTime = eventProps.start;\n\t\tif (startTime == null) { startTime = eventProps.time; } // accept 'time' as well\n\t\tduration = eventProps.duration;\n\t\tstick = eventProps.stick;\n\t\tdelete eventProps.start;\n\t\tdelete eventProps.time;\n\t\tdelete eventProps.duration;\n\t\tdelete eventProps.stick;\n\t}\n\n\t// fallback to standalone attribute values for each of the date/time properties\n\tif (startTime == null) { startTime = el.data(prefix + 'start'); }\n\tif (startTime == null) { startTime = el.data(prefix + 'time'); } // accept 'time' as well\n\tif (duration == null) { duration = el.data(prefix + 'duration'); }\n\tif (stick == null) { stick = el.data(prefix + 'stick'); }\n\n\t// massage into correct data types\n\tstartTime = startTime != null ? moment.duration(startTime) : null;\n\tduration = duration != null ? moment.duration(duration) : null;\n\tstick = Boolean(stick);\n\n\treturn { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };\n}\n\n\n;;\n\n/*\nA set of rendering and date-related methods for a visual component comprised of one or more rows of day columns.\nPrerequisite: the object being mixed into needs to be a *Grid*\n*/\nvar DayTableMixin = FC.DayTableMixin = {\n\n\tbreakOnWeeks: false, // should create a new row for each week?\n\tdayDates: null, // whole-day dates for each column. left to right\n\tdayIndices: null, // for each day from start, the offset\n\tdaysPerRow: null,\n\trowCnt: null,\n\tcolCnt: null,\n\tcolHeadFormat: null,\n\n\n\t// Populates internal variables used for date calculation and rendering\n\tupdateDayTable: function() {\n\t\tvar view = this.view;\n\t\tvar date = this.start.clone();\n\t\tvar dayIndex = -1;\n\t\tvar dayIndices = [];\n\t\tvar dayDates = [];\n\t\tvar daysPerRow;\n\t\tvar firstDay;\n\t\tvar rowCnt;\n\n\t\twhile (date.isBefore(this.end)) { // loop each day from start to end\n\t\t\tif (view.isHiddenDay(date)) {\n\t\t\t\tdayIndices.push(dayIndex + 0.5); // mark that it's between indices\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdayIndex++;\n\t\t\t\tdayIndices.push(dayIndex);\n\t\t\t\tdayDates.push(date.clone());\n\t\t\t}\n\t\t\tdate.add(1, 'days');\n\t\t}\n\n\t\tif (this.breakOnWeeks) {\n\t\t\t// count columns until the day-of-week repeats\n\t\t\tfirstDay = dayDates[0].day();\n\t\t\tfor (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {\n\t\t\t\tif (dayDates[daysPerRow].day() == firstDay) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\trowCnt = Math.ceil(dayDates.length / daysPerRow);\n\t\t}\n\t\telse {\n\t\t\trowCnt = 1;\n\t\t\tdaysPerRow = dayDates.length;\n\t\t}\n\n\t\tthis.dayDates = dayDates;\n\t\tthis.dayIndices = dayIndices;\n\t\tthis.daysPerRow = daysPerRow;\n\t\tthis.rowCnt = rowCnt;\n\n\t\tthis.updateDayTableCols();\n\t},\n\n\n\t// Computes and assigned the colCnt property and updates any options that may be computed from it\n\tupdateDayTableCols: function() {\n\t\tthis.colCnt = this.computeColCnt();\n\t\tthis.colHeadFormat = this.view.opt('columnFormat') || this.computeColHeadFormat();\n\t},\n\n\n\t// Determines how many columns there should be in the table\n\tcomputeColCnt: function() {\n\t\treturn this.daysPerRow;\n\t},\n\n\n\t// Computes the ambiguously-timed moment for the given cell\n\tgetCellDate: function(row, col) {\n\t\treturn this.dayDates[\n\t\t\t\tthis.getCellDayIndex(row, col)\n\t\t\t].clone();\n\t},\n\n\n\t// Computes the ambiguously-timed date range for the given cell\n\tgetCellRange: function(row, col) {\n\t\tvar start = this.getCellDate(row, col);\n\t\tvar end = start.clone().add(1, 'days');\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\t// Returns the number of day cells, chronologically, from the first of the grid (0-based)\n\tgetCellDayIndex: function(row, col) {\n\t\treturn row * this.daysPerRow + this.getColDayIndex(col);\n\t},\n\n\n\t// Returns the numner of day cells, chronologically, from the first cell in *any given row*\n\tgetColDayIndex: function(col) {\n\t\tif (this.isRTL) {\n\t\t\treturn this.colCnt - 1 - col;\n\t\t}\n\t\telse {\n\t\t\treturn col;\n\t\t}\n\t},\n\n\n\t// Given a date, returns its chronolocial cell-index from the first cell of the grid.\n\t// If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\n\t// If before the first offset, returns a negative number.\n\t// If after the last offset, returns an offset past the last cell offset.\n\t// Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\n\tgetDateDayIndex: function(date) {\n\t\tvar dayIndices = this.dayIndices;\n\t\tvar dayOffset = date.diff(this.start, 'days');\n\n\t\tif (dayOffset < 0) {\n\t\t\treturn dayIndices[0] - 1;\n\t\t}\n\t\telse if (dayOffset >= dayIndices.length) {\n\t\t\treturn dayIndices[dayIndices.length - 1] + 1;\n\t\t}\n\t\telse {\n\t\t\treturn dayIndices[dayOffset];\n\t\t}\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes a default column header formatting string if `colFormat` is not explicitly defined\n\tcomputeColHeadFormat: function() {\n\t\t// if more than one week row, or if there are a lot of columns with not much space,\n\t\t// put just the day numbers will be in each cell\n\t\tif (this.rowCnt > 1 || this.colCnt > 10) {\n\t\t\treturn 'ddd'; // \"Sat\"\n\t\t}\n\t\t// multiple days, so full single date string WON'T be in title text\n\t\telse if (this.colCnt > 1) {\n\t\t\treturn this.view.opt('dayOfMonthFormat'); // \"Sat 12/10\"\n\t\t}\n\t\t// single day, so full single date string will probably be in title text\n\t\telse {\n\t\t\treturn 'dddd'; // \"Saturday\"\n\t\t}\n\t},\n\n\n\t/* Slicing\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Slices up a date range into a segment for every week-row it intersects with\n\tsliceRangeByRow: function(range) {\n\t\tvar daysPerRow = this.daysPerRow;\n\t\tvar normalRange = this.view.computeDayRange(range); // make whole-day range, considering nextDayThreshold\n\t\tvar rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\n\t\tvar rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\n\t\tvar segs = [];\n\t\tvar row;\n\t\tvar rowFirst, rowLast; // inclusive day-index range for current row\n\t\tvar segFirst, segLast; // inclusive day-index range for segment\n\n\t\tfor (row = 0; row < this.rowCnt; row++) {\n\t\t\trowFirst = row * daysPerRow;\n\t\t\trowLast = rowFirst + daysPerRow - 1;\n\n\t\t\t// intersect segment's offset range with the row's\n\t\t\tsegFirst = Math.max(rangeFirst, rowFirst);\n\t\t\tsegLast = Math.min(rangeLast, rowLast);\n\n\t\t\t// deal with in-between indices\n\t\t\tsegFirst = Math.ceil(segFirst); // in-between starts round to next cell\n\t\t\tsegLast = Math.floor(segLast); // in-between ends round to prev cell\n\n\t\t\tif (segFirst <= segLast) { // was there any intersection with the current row?\n\t\t\t\tsegs.push({\n\t\t\t\t\trow: row,\n\n\t\t\t\t\t// normalize to start of row\n\t\t\t\t\tfirstRowDayIndex: segFirst - rowFirst,\n\t\t\t\t\tlastRowDayIndex: segLast - rowFirst,\n\n\t\t\t\t\t// must be matching integers to be the segment's start/end\n\t\t\t\t\tisStart: segFirst === rangeFirst,\n\t\t\t\t\tisEnd: segLast === rangeLast\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t// Slices up a date range into a segment for every day-cell it intersects with.\n\t// TODO: make more DRY with sliceRangeByRow somehow.\n\tsliceRangeByDay: function(range) {\n\t\tvar daysPerRow = this.daysPerRow;\n\t\tvar normalRange = this.view.computeDayRange(range); // make whole-day range, considering nextDayThreshold\n\t\tvar rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\n\t\tvar rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\n\t\tvar segs = [];\n\t\tvar row;\n\t\tvar rowFirst, rowLast; // inclusive day-index range for current row\n\t\tvar i;\n\t\tvar segFirst, segLast; // inclusive day-index range for segment\n\n\t\tfor (row = 0; row < this.rowCnt; row++) {\n\t\t\trowFirst = row * daysPerRow;\n\t\t\trowLast = rowFirst + daysPerRow - 1;\n\n\t\t\tfor (i = rowFirst; i <= rowLast; i++) {\n\n\t\t\t\t// intersect segment's offset range with the row's\n\t\t\t\tsegFirst = Math.max(rangeFirst, i);\n\t\t\t\tsegLast = Math.min(rangeLast, i);\n\n\t\t\t\t// deal with in-between indices\n\t\t\t\tsegFirst = Math.ceil(segFirst); // in-between starts round to next cell\n\t\t\t\tsegLast = Math.floor(segLast); // in-between ends round to prev cell\n\n\t\t\t\tif (segFirst <= segLast) { // was there any intersection with the current row?\n\t\t\t\t\tsegs.push({\n\t\t\t\t\t\trow: row,\n\n\t\t\t\t\t\t// normalize to start of row\n\t\t\t\t\t\tfirstRowDayIndex: segFirst - rowFirst,\n\t\t\t\t\t\tlastRowDayIndex: segLast - rowFirst,\n\n\t\t\t\t\t\t// must be matching integers to be the segment's start/end\n\t\t\t\t\t\tisStart: segFirst === rangeFirst,\n\t\t\t\t\t\tisEnd: segLast === rangeLast\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t/* Header Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderHeadHtml: function() {\n\t\tvar view = this.view;\n\n\t\treturn '' +\n\t\t\t'
' +\n\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\tthis.renderHeadTrHtml() +\n\t\t\t\t\t'' +\n\t\t\t\t'
' +\n\t\t\t'
';\n\t},\n\n\n\trenderHeadIntroHtml: function() {\n\t\treturn this.renderIntroHtml(); // fall back to generic\n\t},\n\n\n\trenderHeadTrHtml: function() {\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t(this.isRTL ? '' : this.renderHeadIntroHtml()) +\n\t\t\t\tthis.renderHeadDateCellsHtml() +\n\t\t\t\t(this.isRTL ? this.renderHeadIntroHtml() : '') +\n\t\t\t'';\n\t},\n\n\n\trenderHeadDateCellsHtml: function() {\n\t\tvar htmls = [];\n\t\tvar col, date;\n\n\t\tfor (col = 0; col < this.colCnt; col++) {\n\t\t\tdate = this.getCellDate(0, col);\n\t\t\thtmls.push(this.renderHeadDateCellHtml(date));\n\t\t}\n\n\t\treturn htmls.join('');\n\t},\n\n\n\t// TODO: when internalApiVersion, accept an object for HTML attributes\n\t// (colspan should be no different)\n\trenderHeadDateCellHtml: function(date, colspan, otherAttrs) {\n\t\tvar view = this.view;\n\t\tvar isDateValid = isDateWithinRange(date, view.activeRange); // TODO: called too frequently. cache somehow.\n\t\tvar classNames = [\n\t\t\t'fc-day-header',\n\t\t\tview.widgetHeaderClass\n\t\t];\n\t\tvar innerHtml = htmlEscape(date.format(this.colHeadFormat));\n\n\t\t// if only one row of days, the classNames on the header can represent the specific days beneath\n\t\tif (this.rowCnt === 1) {\n\t\t\tclassNames = classNames.concat(\n\t\t\t\t// includes the day-of-week class\n\t\t\t\t// noThemeHighlight=true (don't highlight the header)\n\t\t\t\tthis.getDayClasses(date, true)\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tclassNames.push('fc-' + dayIDs[date.day()]); // only add the day-of-week class\n\t\t}\n\n\t\treturn '' +\n ' 1 ?\n\t\t\t\t\t' colspan=\"' + colspan + '\"' :\n\t\t\t\t\t'') +\n\t\t\t\t(otherAttrs ?\n\t\t\t\t\t' ' + otherAttrs :\n\t\t\t\t\t'') +\n\t\t\t\t'>' +\n\t\t\t\t(isDateValid ?\n\t\t\t\t\t// don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)\n\t\t\t\t\tview.buildGotoAnchorHtml(\n\t\t\t\t\t\t{ date: date, forceOff: this.rowCnt > 1 || this.colCnt === 1 },\n\t\t\t\t\t\tinnerHtml\n\t\t\t\t\t) :\n\t\t\t\t\t// if not valid, display text, but no link\n\t\t\t\t\tinnerHtml\n\t\t\t\t) +\n\t\t\t'';\n\t},\n\n\n\t/* Background Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderBgTrHtml: function(row) {\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t(this.isRTL ? '' : this.renderBgIntroHtml(row)) +\n\t\t\t\tthis.renderBgCellsHtml(row) +\n\t\t\t\t(this.isRTL ? this.renderBgIntroHtml(row) : '') +\n\t\t\t'';\n\t},\n\n\n\trenderBgIntroHtml: function(row) {\n\t\treturn this.renderIntroHtml(); // fall back to generic\n\t},\n\n\n\trenderBgCellsHtml: function(row) {\n\t\tvar htmls = [];\n\t\tvar col, date;\n\n\t\tfor (col = 0; col < this.colCnt; col++) {\n\t\t\tdate = this.getCellDate(row, col);\n\t\t\thtmls.push(this.renderBgCellHtml(date));\n\t\t}\n\n\t\treturn htmls.join('');\n\t},\n\n\n\trenderBgCellHtml: function(date, otherAttrs) {\n\t\tvar view = this.view;\n\t\tvar isDateValid = isDateWithinRange(date, view.activeRange); // TODO: called too frequently. cache somehow.\n\t\tvar classes = this.getDayClasses(date);\n\n\t\tclasses.unshift('fc-day', view.widgetContentClass);\n\n\t\treturn '';\n\t},\n\n\n\t/* Generic\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Generates the default HTML intro for any row. User classes should override\n\trenderIntroHtml: function() {\n\t},\n\n\n\t// TODO: a generic method for dealing with , RTL, intro\n\t// when increment internalApiVersion\n\t// wrapTr (scheduler)\n\n\n\t/* Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Applies the generic \"intro\" and \"outro\" HTML to the given cells.\n\t// Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.\n\tbookendCells: function(trEl) {\n\t\tvar introHtml = this.renderIntroHtml();\n\n\t\tif (introHtml) {\n\t\t\tif (this.isRTL) {\n\t\t\t\ttrEl.append(introHtml);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttrEl.prepend(introHtml);\n\t\t\t}\n\t\t}\n\t}\n\n};\n\n;;\n\n/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar DayGrid = FC.DayGrid = Grid.extend(DayTableMixin, {\n\n\tnumbersVisible: false, // should render a row for day/week numbers? set by outside view. TODO: make internal\n\tbottomCoordPadding: 0, // hack for extending the hit area for the last row of the coordinate grid\n\n\trowEls: null, // set of fake row elements\n\tcellEls: null, // set of whole-day elements comprising the row's background\n\thelperEls: null, // set of cell skeleton elements for rendering the mock event \"helper\"\n\n\trowCoordCache: null,\n\tcolCoordCache: null,\n\n\n\t// Renders the rows and columns into the component's `this.el`, which should already be assigned.\n\t// isRigid determins whether the individual rows should ignore the contents and be a constant height.\n\t// Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.\n\trenderDates: function(isRigid) {\n\t\tvar view = this.view;\n\t\tvar rowCnt = this.rowCnt;\n\t\tvar colCnt = this.colCnt;\n\t\tvar html = '';\n\t\tvar row;\n\t\tvar col;\n\n\t\tfor (row = 0; row < rowCnt; row++) {\n\t\t\thtml += this.renderDayRowHtml(row, isRigid);\n\t\t}\n\t\tthis.el.html(html);\n\n\t\tthis.rowEls = this.el.find('.fc-row');\n\t\tthis.cellEls = this.el.find('.fc-day, .fc-disabled-day');\n\n\t\tthis.rowCoordCache = new CoordCache({\n\t\t\tels: this.rowEls,\n\t\t\tisVertical: true\n\t\t});\n\t\tthis.colCoordCache = new CoordCache({\n\t\t\tels: this.cellEls.slice(0, this.colCnt), // only the first row\n\t\t\tisHorizontal: true\n\t\t});\n\n\t\t// trigger dayRender with each cell's element\n\t\tfor (row = 0; row < rowCnt; row++) {\n\t\t\tfor (col = 0; col < colCnt; col++) {\n\t\t\t\tview.publiclyTrigger(\n\t\t\t\t\t'dayRender',\n\t\t\t\t\tnull,\n\t\t\t\t\tthis.getCellDate(row, col),\n\t\t\t\t\tthis.getCellEl(row, col)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\n\tunrenderDates: function() {\n\t\tthis.removeSegPopover();\n\t},\n\n\n\trenderBusinessHours: function() {\n\t\tvar segs = this.buildBusinessHourSegs(true); // wholeDay=true\n\t\tthis.renderFill('businessHours', segs, 'bgevent');\n\t},\n\n\n\tunrenderBusinessHours: function() {\n\t\tthis.unrenderFill('businessHours');\n\t},\n\n\n\t// Generates the HTML for a single row, which is a div that wraps a table.\n\t// `row` is the row number.\n\trenderDayRowHtml: function(row, isRigid) {\n\t\tvar view = this.view;\n\t\tvar classes = [ 'fc-row', 'fc-week', view.widgetContentClass ];\n\n\t\tif (isRigid) {\n\t\t\tclasses.push('fc-rigid');\n\t\t}\n\n\t\treturn '' +\n\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\tthis.renderBgTrHtml(row) +\n\t\t\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\t(this.numbersVisible ?\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\t\tthis.renderNumberTrHtml(row) +\n\t\t\t\t\t\t\t'' :\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t) +\n\t\t\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t'
';\n\t},\n\n\n\t/* Grid Number Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderNumberTrHtml: function(row) {\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t(this.isRTL ? '' : this.renderNumberIntroHtml(row)) +\n\t\t\t\tthis.renderNumberCellsHtml(row) +\n\t\t\t\t(this.isRTL ? this.renderNumberIntroHtml(row) : '') +\n\t\t\t'';\n\t},\n\n\n\trenderNumberIntroHtml: function(row) {\n\t\treturn this.renderIntroHtml();\n\t},\n\n\n\trenderNumberCellsHtml: function(row) {\n\t\tvar htmls = [];\n\t\tvar col, date;\n\n\t\tfor (col = 0; col < this.colCnt; col++) {\n\t\t\tdate = this.getCellDate(row, col);\n\t\t\thtmls.push(this.renderNumberCellHtml(date));\n\t\t}\n\n\t\treturn htmls.join('');\n\t},\n\n\n\t// Generates the HTML for the s of the \"number\" row in the DayGrid's content skeleton.\n\t// The number row will only exist if either day numbers or week numbers are turned on.\n\trenderNumberCellHtml: function(date) {\n\t\tvar view = this.view;\n\t\tvar html = '';\n\t\tvar isDateValid = isDateWithinRange(date, view.activeRange); // TODO: called too frequently. cache somehow.\n\t\tvar isDayNumberVisible = view.dayNumbersVisible && isDateValid;\n\t\tvar classes;\n\t\tvar weekCalcFirstDoW;\n\n\t\tif (!isDayNumberVisible && !view.cellWeekNumbersVisible) {\n\t\t\t// no numbers in day cell (week number must be along the side)\n\t\t\treturn ''; // will create an empty space above events :(\n\t\t}\n\n\t\tclasses = this.getDayClasses(date);\n\t\tclasses.unshift('fc-day-top');\n\n\t\tif (view.cellWeekNumbersVisible) {\n\t\t\t// To determine the day of week number change under ISO, we cannot\n\t\t\t// rely on moment.js methods such as firstDayOfWeek() or weekday(),\n\t\t\t// because they rely on the locale's dow (possibly overridden by\n\t\t\t// our firstDay option), which may not be Monday. We cannot change\n\t\t\t// dow, because that would affect the calendar start day as well.\n\t\t\tif (date._locale._fullCalendar_weekCalc === 'ISO') {\n\t\t\t\tweekCalcFirstDoW = 1; // Monday by ISO 8601 definition\n\t\t\t}\n\t\t\telse {\n\t\t\t\tweekCalcFirstDoW = date._locale.firstDayOfWeek();\n\t\t\t}\n\t\t}\n\n\t\thtml += '';\n\n\t\tif (view.cellWeekNumbersVisible && (date.day() == weekCalcFirstDoW)) {\n\t\t\thtml += view.buildGotoAnchorHtml(\n\t\t\t\t{ date: date, type: 'week' },\n\t\t\t\t{ 'class': 'fc-week-number' },\n\t\t\t\tdate.format('w') // inner HTML\n\t\t\t);\n\t\t}\n\n\t\tif (isDayNumberVisible) {\n\t\t\thtml += view.buildGotoAnchorHtml(\n\t\t\t\tdate,\n\t\t\t\t{ 'class': 'fc-day-number' },\n\t\t\t\tdate.date() // inner HTML\n\t\t\t);\n\t\t}\n\n\t\thtml += '';\n\n\t\treturn html;\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes a default event time formatting string if `timeFormat` is not explicitly defined\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('extraSmallTimeFormat'); // like \"6p\" or \"6:30p\"\n\t},\n\n\n\t// Computes a default `displayEventEnd` value if one is not expliclty defined\n\tcomputeDisplayEventEnd: function() {\n\t\treturn this.colCnt == 1; // we'll likely have space if there's only one day\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trangeUpdated: function() {\n\t\tthis.updateDayTable();\n\t},\n\n\n\t// Slices up the given span (unzoned start/end with other misc data) into an array of segments\n\tspanToSegs: function(span) {\n\t\tvar segs = this.sliceRangeByRow(span);\n\t\tvar i, seg;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tif (this.isRTL) {\n\t\t\t\tseg.leftCol = this.daysPerRow - 1 - seg.lastRowDayIndex;\n\t\t\t\tseg.rightCol = this.daysPerRow - 1 - seg.firstRowDayIndex;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tseg.leftCol = seg.firstRowDayIndex;\n\t\t\t\tseg.rightCol = seg.lastRowDayIndex;\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t/* Hit System\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tprepareHits: function() {\n\t\tthis.colCoordCache.build();\n\t\tthis.rowCoordCache.build();\n\t\tthis.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack\n\t},\n\n\n\treleaseHits: function() {\n\t\tthis.colCoordCache.clear();\n\t\tthis.rowCoordCache.clear();\n\t},\n\n\n\tqueryHit: function(leftOffset, topOffset) {\n\t\tif (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {\n\t\t\tvar col = this.colCoordCache.getHorizontalIndex(leftOffset);\n\t\t\tvar row = this.rowCoordCache.getVerticalIndex(topOffset);\n\n\t\t\tif (row != null && col != null) {\n\t\t\t\treturn this.getCellHit(row, col);\n\t\t\t}\n\t\t}\n\t},\n\n\n\tgetHitSpan: function(hit) {\n\t\treturn this.getCellRange(hit.row, hit.col);\n\t},\n\n\n\tgetHitEl: function(hit) {\n\t\treturn this.getCellEl(hit.row, hit.col);\n\t},\n\n\n\t/* Cell System\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// FYI: the first column is the leftmost column, regardless of date\n\n\n\tgetCellHit: function(row, col) {\n\t\treturn {\n\t\t\trow: row,\n\t\t\tcol: col,\n\t\t\tcomponent: this, // needed unfortunately :(\n\t\t\tleft: this.colCoordCache.getLeftOffset(col),\n\t\t\tright: this.colCoordCache.getRightOffset(col),\n\t\t\ttop: this.rowCoordCache.getTopOffset(row),\n\t\t\tbottom: this.rowCoordCache.getBottomOffset(row)\n\t\t};\n\t},\n\n\n\tgetCellEl: function(row, col) {\n\t\treturn this.cellEls.eq(row * this.colCnt + col);\n\t},\n\n\n\t/* Event Drag Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// TODO: move to DayGrid.event, similar to what we did with Grid's drag methods\n\n\n\t// Renders a visual indication of an event or external element being dragged.\n\t// `eventLocation` has zoned start and end (optional)\n\trenderDrag: function(eventLocation, seg) {\n\t\tvar eventSpans = this.eventToSpans(eventLocation);\n\t\tvar i;\n\n\t\t// always render a highlight underneath\n\t\tfor (i = 0; i < eventSpans.length; i++) {\n\t\t\tthis.renderHighlight(eventSpans[i]);\n\t\t}\n\n\t\t// if a segment from the same calendar but another component is being dragged, render a helper event\n\t\tif (seg && seg.component !== this) {\n\t\t\treturn this.renderEventLocationHelper(eventLocation, seg); // returns mock event elements\n\t\t}\n\t},\n\n\n\t// Unrenders any visual indication of a hovering event\n\tunrenderDrag: function() {\n\t\tthis.unrenderHighlight();\n\t\tthis.unrenderHelper();\n\t},\n\n\n\t/* Event Resize Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event being resized\n\trenderEventResize: function(eventLocation, seg) {\n\t\tvar eventSpans = this.eventToSpans(eventLocation);\n\t\tvar i;\n\n\t\tfor (i = 0; i < eventSpans.length; i++) {\n\t\t\tthis.renderHighlight(eventSpans[i]);\n\t\t}\n\n\t\treturn this.renderEventLocationHelper(eventLocation, seg); // returns mock event elements\n\t},\n\n\n\t// Unrenders a visual indication of an event being resized\n\tunrenderEventResize: function() {\n\t\tthis.unrenderHighlight();\n\t\tthis.unrenderHelper();\n\t},\n\n\n\t/* Event Helper\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a mock \"helper\" event. `sourceSeg` is the associated internal segment object. It can be null.\n\trenderHelper: function(event, sourceSeg) {\n\t\tvar helperNodes = [];\n\t\tvar segs = this.eventToSegs(event);\n\t\tvar rowStructs;\n\n\t\tsegs = this.renderFgSegEls(segs); // assigns each seg's el and returns a subset of segs that were rendered\n\t\trowStructs = this.renderSegRows(segs);\n\n\t\t// inject each new event skeleton into each associated row\n\t\tthis.rowEls.each(function(row, rowNode) {\n\t\t\tvar rowEl = $(rowNode); // the .fc-row\n\t\t\tvar skeletonEl = $('
'); // will be absolutely positioned\n\t\t\tvar skeletonTop;\n\n\t\t\t// If there is an original segment, match the top position. Otherwise, put it at the row's top level\n\t\t\tif (sourceSeg && sourceSeg.row === row) {\n\t\t\t\tskeletonTop = sourceSeg.el.position().top;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tskeletonTop = rowEl.find('.fc-content-skeleton tbody').position().top;\n\t\t\t}\n\n\t\t\tskeletonEl.css('top', skeletonTop)\n\t\t\t\t.find('table')\n\t\t\t\t\t.append(rowStructs[row].tbodyEl);\n\n\t\t\trowEl.append(skeletonEl);\n\t\t\thelperNodes.push(skeletonEl[0]);\n\t\t});\n\n\t\treturn ( // must return the elements rendered\n\t\t\tthis.helperEls = $(helperNodes) // array -> jQuery set\n\t\t);\n\t},\n\n\n\t// Unrenders any visual indication of a mock helper event\n\tunrenderHelper: function() {\n\t\tif (this.helperEls) {\n\t\t\tthis.helperEls.remove();\n\t\t\tthis.helperEls = null;\n\t\t}\n\t},\n\n\n\t/* Fill System (highlight, background events, business hours)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tfillSegTag: 'td', // override the default tag name\n\n\n\t// Renders a set of rectangles over the given segments of days.\n\t// Only returns segments that successfully rendered.\n\trenderFill: function(type, segs, className) {\n\t\tvar nodes = [];\n\t\tvar i, seg;\n\t\tvar skeletonEl;\n\n\t\tsegs = this.renderFillSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tskeletonEl = this.renderFillRow(type, seg, className);\n\t\t\tthis.rowEls.eq(seg.row).append(skeletonEl);\n\t\t\tnodes.push(skeletonEl[0]);\n\t\t}\n\n\t\tthis.elsByFill[type] = $(nodes);\n\n\t\treturn segs;\n\t},\n\n\n\t// Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\n\trenderFillRow: function(type, seg, className) {\n\t\tvar colCnt = this.colCnt;\n\t\tvar startCol = seg.leftCol;\n\t\tvar endCol = seg.rightCol + 1;\n\t\tvar skeletonEl;\n\t\tvar trEl;\n\n\t\tclassName = className || type.toLowerCase();\n\n\t\tskeletonEl = $(\n\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t'
'\n\t\t);\n\t\ttrEl = skeletonEl.find('tr');\n\n\t\tif (startCol > 0) {\n\t\t\ttrEl.append('');\n\t\t}\n\n\t\ttrEl.append(\n\t\t\tseg.el.attr('colspan', endCol - startCol)\n\t\t);\n\n\t\tif (endCol < colCnt) {\n\t\t\ttrEl.append('');\n\t\t}\n\n\t\tthis.bookendCells(trEl);\n\n\t\treturn skeletonEl;\n\t}\n\n});\n\n;;\n\n/* Event-rendering methods for the DayGrid class\n----------------------------------------------------------------------------------------------------------------------*/\n\nDayGrid.mixin({\n\n\trowStructs: null, // an array of objects, each holding information about a row's foreground event-rendering\n\n\n\t// Unrenders all events currently rendered on the grid\n\tunrenderEvents: function() {\n\t\tthis.removeSegPopover(); // removes the \"more..\" events popover\n\t\tGrid.prototype.unrenderEvents.apply(this, arguments); // calls the super-method\n\t},\n\n\n\t// Retrieves all rendered segment objects currently rendered on the grid\n\tgetEventSegs: function() {\n\t\treturn Grid.prototype.getEventSegs.call(this) // get the segments from the super-method\n\t\t\t.concat(this.popoverSegs || []); // append the segments from the \"more...\" popover\n\t},\n\n\n\t// Renders the given background event segments onto the grid\n\trenderBgSegs: function(segs) {\n\n\t\t// don't render timed background events\n\t\tvar allDaySegs = $.grep(segs, function(seg) {\n\t\t\treturn seg.event.allDay;\n\t\t});\n\n\t\treturn Grid.prototype.renderBgSegs.call(this, allDaySegs); // call the super-method\n\t},\n\n\n\t// Renders the given foreground event segments onto the grid\n\trenderFgSegs: function(segs) {\n\t\tvar rowStructs;\n\n\t\t// render an `.el` on each seg\n\t\t// returns a subset of the segs. segs that were actually rendered\n\t\tsegs = this.renderFgSegEls(segs);\n\n\t\trowStructs = this.rowStructs = this.renderSegRows(segs);\n\n\t\t// append to each row's content skeleton\n\t\tthis.rowEls.each(function(i, rowNode) {\n\t\t\t$(rowNode).find('.fc-content-skeleton > table').append(\n\t\t\t\trowStructs[i].tbodyEl\n\t\t\t);\n\t\t});\n\n\t\treturn segs; // return only the segs that were actually rendered\n\t},\n\n\n\t// Unrenders all currently rendered foreground event segments\n\tunrenderFgSegs: function() {\n\t\tvar rowStructs = this.rowStructs || [];\n\t\tvar rowStruct;\n\n\t\twhile ((rowStruct = rowStructs.pop())) {\n\t\t\trowStruct.tbodyEl.remove();\n\t\t}\n\n\t\tthis.rowStructs = null;\n\t},\n\n\n\t// Uses the given events array to generate elements that should be appended to each row's content skeleton.\n\t// Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\n\t// PRECONDITION: each segment shoud already have a rendered and assigned `.el`\n\trenderSegRows: function(segs) {\n\t\tvar rowStructs = [];\n\t\tvar segRows;\n\t\tvar row;\n\n\t\tsegRows = this.groupSegRows(segs); // group into nested arrays\n\n\t\t// iterate each row of segment groupings\n\t\tfor (row = 0; row < segRows.length; row++) {\n\t\t\trowStructs.push(\n\t\t\t\tthis.renderSegRow(row, segRows[row])\n\t\t\t);\n\t\t}\n\n\t\treturn rowStructs;\n\t},\n\n\n\t// Builds the HTML to be used for the default element for an individual segment\n\tfgSegHtml: function(seg, disableResizing) {\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\t\tvar isDraggable = view.isEventDraggable(event);\n\t\tvar isResizableFromStart = !disableResizing && event.allDay &&\n\t\t\tseg.isStart && view.isEventResizableFromStart(event);\n\t\tvar isResizableFromEnd = !disableResizing && event.allDay &&\n\t\t\tseg.isEnd && view.isEventResizableFromEnd(event);\n\t\tvar classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\n\t\tvar skinCss = cssToStr(this.getSegSkinCss(seg));\n\t\tvar timeHtml = '';\n\t\tvar timeText;\n\t\tvar titleHtml;\n\n\t\tclasses.unshift('fc-day-grid-event', 'fc-h-event');\n\n\t\t// Only display a timed events time if it is the starting segment\n\t\tif (seg.isStart) {\n\t\t\ttimeText = this.getEventTimeText(event);\n\t\t\tif (timeText) {\n\t\t\t\ttimeHtml = '' + htmlEscape(timeText) + '';\n\t\t\t}\n\t\t}\n\n\t\ttitleHtml =\n\t\t\t'' +\n\t\t\t\t(htmlEscape(event.title || '') || ' ') + // we always want one line of height\n\t\t\t'';\n\t\t\n\t\treturn '' +\n\t\t\t\t'
' +\n\t\t\t\t\t(this.isRTL ?\n\t\t\t\t\t\ttitleHtml + ' ' + timeHtml : // put a natural space in between\n\t\t\t\t\t\ttimeHtml + ' ' + titleHtml //\n\t\t\t\t\t\t) +\n\t\t\t\t'
' +\n\t\t\t\t(isResizableFromStart ?\n\t\t\t\t\t'
' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t\t(isResizableFromEnd ?\n\t\t\t\t\t'
' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t'';\n\t},\n\n\n\t// Given a row # and an array of segments all in the same row, render a element, a skeleton that contains\n\t// the segments. Returns object with a bunch of internal data about how the render was calculated.\n\t// NOTE: modifies rowSegs\n\trenderSegRow: function(row, rowSegs) {\n\t\tvar colCnt = this.colCnt;\n\t\tvar segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\n\t\tvar levelCnt = Math.max(1, segLevels.length); // ensure at least one level\n\t\tvar tbody = $('');\n\t\tvar segMatrix = []; // lookup for which segments are rendered into which level+col cells\n\t\tvar cellMatrix = []; // lookup for all elements of the level+col matrix\n\t\tvar loneCellMatrix = []; // lookup for elements that only take up a single column\n\t\tvar i, levelSegs;\n\t\tvar col;\n\t\tvar tr;\n\t\tvar j, seg;\n\t\tvar td;\n\n\t\t// populates empty cells from the current column (`col`) to `endCol`\n\t\tfunction emptyCellsUntil(endCol) {\n\t\t\twhile (col < endCol) {\n\t\t\t\t// try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\n\t\t\t\ttd = (loneCellMatrix[i - 1] || [])[col];\n\t\t\t\tif (td) {\n\t\t\t\t\ttd.attr(\n\t\t\t\t\t\t'rowspan',\n\t\t\t\t\t\tparseInt(td.attr('rowspan') || 1, 10) + 1\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttd = $('');\n\t\t\t\t\ttr.append(td);\n\t\t\t\t}\n\t\t\t\tcellMatrix[i][col] = td;\n\t\t\t\tloneCellMatrix[i][col] = td;\n\t\t\t\tcol++;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < levelCnt; i++) { // iterate through all levels\n\t\t\tlevelSegs = segLevels[i];\n\t\t\tcol = 0;\n\t\t\ttr = $('');\n\n\t\t\tsegMatrix.push([]);\n\t\t\tcellMatrix.push([]);\n\t\t\tloneCellMatrix.push([]);\n\n\t\t\t// levelCnt might be 1 even though there are no actual levels. protect against this.\n\t\t\t// this single empty row is useful for styling.\n\t\t\tif (levelSegs) {\n\t\t\t\tfor (j = 0; j < levelSegs.length; j++) { // iterate through segments in level\n\t\t\t\t\tseg = levelSegs[j];\n\n\t\t\t\t\temptyCellsUntil(seg.leftCol);\n\n\t\t\t\t\t// create a container that occupies or more columns. append the event element.\n\t\t\t\t\ttd = $('').append(seg.el);\n\t\t\t\t\tif (seg.leftCol != seg.rightCol) {\n\t\t\t\t\t\ttd.attr('colspan', seg.rightCol - seg.leftCol + 1);\n\t\t\t\t\t}\n\t\t\t\t\telse { // a single-column segment\n\t\t\t\t\t\tloneCellMatrix[i][col] = td;\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (col <= seg.rightCol) {\n\t\t\t\t\t\tcellMatrix[i][col] = td;\n\t\t\t\t\t\tsegMatrix[i][col] = seg;\n\t\t\t\t\t\tcol++;\n\t\t\t\t\t}\n\n\t\t\t\t\ttr.append(td);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temptyCellsUntil(colCnt); // finish off the row\n\t\t\tthis.bookendCells(tr);\n\t\t\ttbody.append(tr);\n\t\t}\n\n\t\treturn { // a \"rowStruct\"\n\t\t\trow: row, // the row number\n\t\t\ttbodyEl: tbody,\n\t\t\tcellMatrix: cellMatrix,\n\t\t\tsegMatrix: segMatrix,\n\t\t\tsegLevels: segLevels,\n\t\t\tsegs: rowSegs\n\t\t};\n\t},\n\n\n\t// Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\n\t// NOTE: modifies segs\n\tbuildSegLevels: function(segs) {\n\t\tvar levels = [];\n\t\tvar i, seg;\n\t\tvar j;\n\n\t\t// Give preference to elements with certain criteria, so they have\n\t\t// a chance to be closer to the top.\n\t\tthis.sortEventSegs(segs);\n\t\t\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\n\t\t\t// loop through levels, starting with the topmost, until the segment doesn't collide with other segments\n\t\t\tfor (j = 0; j < levels.length; j++) {\n\t\t\t\tif (!isDaySegCollision(seg, levels[j])) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// `j` now holds the desired subrow index\n\t\t\tseg.level = j;\n\n\t\t\t// create new level array if needed and append segment\n\t\t\t(levels[j] || (levels[j] = [])).push(seg);\n\t\t}\n\n\t\t// order segments left-to-right. very important if calendar is RTL\n\t\tfor (j = 0; j < levels.length; j++) {\n\t\t\tlevels[j].sort(compareDaySegCols);\n\t\t}\n\n\t\treturn levels;\n\t},\n\n\n\t// Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\n\tgroupSegRows: function(segs) {\n\t\tvar segRows = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < this.rowCnt; i++) {\n\t\t\tsegRows.push([]);\n\t\t}\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tsegRows[segs[i].row].push(segs[i]);\n\t\t}\n\n\t\treturn segRows;\n\t}\n\n});\n\n\n// Computes whether two segments' columns collide. They are assumed to be in the same row.\nfunction isDaySegCollision(seg, otherSegs) {\n\tvar i, otherSeg;\n\n\tfor (i = 0; i < otherSegs.length; i++) {\n\t\totherSeg = otherSegs[i];\n\n\t\tif (\n\t\t\totherSeg.leftCol <= seg.rightCol &&\n\t\t\totherSeg.rightCol >= seg.leftCol\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n\n// A cmp function for determining the leftmost event\nfunction compareDaySegCols(a, b) {\n\treturn a.leftCol - b.leftCol;\n}\n\n;;\n\n/* Methods relate to limiting the number events for a given day on a DayGrid\n----------------------------------------------------------------------------------------------------------------------*/\n// NOTE: all the segs being passed around in here are foreground segs\n\nDayGrid.mixin({\n\n\tsegPopover: null, // the Popover that holds events that can't fit in a cell. null when not visible\n\tpopoverSegs: null, // an array of segment objects that the segPopover holds. null when not visible\n\n\n\tremoveSegPopover: function() {\n\t\tif (this.segPopover) {\n\t\t\tthis.segPopover.hide(); // in handler, will call segPopover's removeElement\n\t\t}\n\t},\n\n\n\t// Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\n\t// `levelLimit` can be false (don't limit), a number, or true (should be computed).\n\tlimitRows: function(levelLimit) {\n\t\tvar rowStructs = this.rowStructs || [];\n\t\tvar row; // row #\n\t\tvar rowLevelLimit;\n\n\t\tfor (row = 0; row < rowStructs.length; row++) {\n\t\t\tthis.unlimitRow(row);\n\n\t\t\tif (!levelLimit) {\n\t\t\t\trowLevelLimit = false;\n\t\t\t}\n\t\t\telse if (typeof levelLimit === 'number') {\n\t\t\t\trowLevelLimit = levelLimit;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trowLevelLimit = this.computeRowLevelLimit(row);\n\t\t\t}\n\n\t\t\tif (rowLevelLimit !== false) {\n\t\t\t\tthis.limitRow(row, rowLevelLimit);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Computes the number of levels a row will accomodate without going outside its bounds.\n\t// Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\n\t// `row` is the row number.\n\tcomputeRowLevelLimit: function(row) {\n\t\tvar rowEl = this.rowEls.eq(row); // the containing \"fake\" row div\n\t\tvar rowHeight = rowEl.height(); // TODO: cache somehow?\n\t\tvar trEls = this.rowStructs[row].tbodyEl.children();\n\t\tvar i, trEl;\n\t\tvar trHeight;\n\n\t\tfunction iterInnerHeights(i, childNode) {\n\t\t\ttrHeight = Math.max(trHeight, $(childNode).outerHeight());\n\t\t}\n\n\t\t// Reveal one level at a time and stop when we find one out of bounds\n\t\tfor (i = 0; i < trEls.length; i++) {\n\t\t\ttrEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)\n\n\t\t\t// with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,\n\t\t\t// so instead, find the tallest inner content element.\n\t\t\ttrHeight = 0;\n\t\t\ttrEl.find('> td > :first-child').each(iterInnerHeights);\n\n\t\t\tif (trEl.position().top + trHeight > rowHeight) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn false; // should not limit at all\n\t},\n\n\n\t// Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\n\t// `row` is the row number.\n\t// `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\n\tlimitRow: function(row, levelLimit) {\n\t\tvar _this = this;\n\t\tvar rowStruct = this.rowStructs[row];\n\t\tvar moreNodes = []; // array of \"more\" links and DOM nodes\n\t\tvar col = 0; // col #, left-to-right (not chronologically)\n\t\tvar levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\n\t\tvar cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row\n\t\tvar limitedNodes; // array of temporarily hidden level and segment DOM nodes\n\t\tvar i, seg;\n\t\tvar segsBelow; // array of segment objects below `seg` in the current `col`\n\t\tvar totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\n\t\tvar colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\n\t\tvar td, rowspan;\n\t\tvar segMoreNodes; // array of \"more\" cells that will stand-in for the current seg's cell\n\t\tvar j;\n\t\tvar moreTd, moreWrap, moreLink;\n\n\t\t// Iterates through empty level cells and places \"more\" links inside if need be\n\t\tfunction emptyCellsUntil(endCol) { // goes from current `col` to `endCol`\n\t\t\twhile (col < endCol) {\n\t\t\t\tsegsBelow = _this.getCellSegs(row, col, levelLimit);\n\t\t\t\tif (segsBelow.length) {\n\t\t\t\t\ttd = cellMatrix[levelLimit - 1][col];\n\t\t\t\t\tmoreLink = _this.renderMoreLink(row, col, segsBelow);\n\t\t\t\t\tmoreWrap = $('
').append(moreLink);\n\t\t\t\t\ttd.append(moreWrap);\n\t\t\t\t\tmoreNodes.push(moreWrap[0]);\n\t\t\t\t}\n\t\t\t\tcol++;\n\t\t\t}\n\t\t}\n\n\t\tif (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?\n\t\t\tlevelSegs = rowStruct.segLevels[levelLimit - 1];\n\t\t\tcellMatrix = rowStruct.cellMatrix;\n\n\t\t\tlimitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level elements past the limit\n\t\t\t\t.addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array\n\n\t\t\t// iterate though segments in the last allowable level\n\t\t\tfor (i = 0; i < levelSegs.length; i++) {\n\t\t\t\tseg = levelSegs[i];\n\t\t\t\temptyCellsUntil(seg.leftCol); // process empty cells before the segment\n\n\t\t\t\t// determine *all* segments below `seg` that occupy the same columns\n\t\t\t\tcolSegsBelow = [];\n\t\t\t\ttotalSegsBelow = 0;\n\t\t\t\twhile (col <= seg.rightCol) {\n\t\t\t\t\tsegsBelow = this.getCellSegs(row, col, levelLimit);\n\t\t\t\t\tcolSegsBelow.push(segsBelow);\n\t\t\t\t\ttotalSegsBelow += segsBelow.length;\n\t\t\t\t\tcol++;\n\t\t\t\t}\n\n\t\t\t\tif (totalSegsBelow) { // do we need to replace this segment with one or many \"more\" links?\n\t\t\t\t\ttd = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell\n\t\t\t\t\trowspan = td.attr('rowspan') || 1;\n\t\t\t\t\tsegMoreNodes = [];\n\n\t\t\t\t\t// make a replacement for each column the segment occupies. will be one for each colspan\n\t\t\t\t\tfor (j = 0; j < colSegsBelow.length; j++) {\n\t\t\t\t\t\tmoreTd = $('').attr('rowspan', rowspan);\n\t\t\t\t\t\tsegsBelow = colSegsBelow[j];\n\t\t\t\t\t\tmoreLink = this.renderMoreLink(\n\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\tseg.leftCol + j,\n\t\t\t\t\t\t\t[ seg ].concat(segsBelow) // count seg as hidden too\n\t\t\t\t\t\t);\n\t\t\t\t\t\tmoreWrap = $('
').append(moreLink);\n\t\t\t\t\t\tmoreTd.append(moreWrap);\n\t\t\t\t\t\tsegMoreNodes.push(moreTd[0]);\n\t\t\t\t\t\tmoreNodes.push(moreTd[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\ttd.addClass('fc-limited').after($(segMoreNodes)); // hide original and inject replacements\n\t\t\t\t\tlimitedNodes.push(td[0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temptyCellsUntil(this.colCnt); // finish off the level\n\t\t\trowStruct.moreEls = $(moreNodes); // for easy undoing later\n\t\t\trowStruct.limitedEls = $(limitedNodes); // for easy undoing later\n\t\t}\n\t},\n\n\n\t// Reveals all levels and removes all \"more\"-related elements for a grid's row.\n\t// `row` is a row number.\n\tunlimitRow: function(row) {\n\t\tvar rowStruct = this.rowStructs[row];\n\n\t\tif (rowStruct.moreEls) {\n\t\t\trowStruct.moreEls.remove();\n\t\t\trowStruct.moreEls = null;\n\t\t}\n\n\t\tif (rowStruct.limitedEls) {\n\t\t\trowStruct.limitedEls.removeClass('fc-limited');\n\t\t\trowStruct.limitedEls = null;\n\t\t}\n\t},\n\n\n\t// Renders an element that represents hidden event element for a cell.\n\t// Responsible for attaching click handler as well.\n\trenderMoreLink: function(row, col, hiddenSegs) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\n\t\treturn $('')\n\t\t\t.text(\n\t\t\t\tthis.getMoreLinkText(hiddenSegs.length)\n\t\t\t)\n\t\t\t.on('click', function(ev) {\n\t\t\t\tvar clickOption = view.opt('eventLimitClick');\n\t\t\t\tvar date = _this.getCellDate(row, col);\n\t\t\t\tvar moreEl = $(this);\n\t\t\t\tvar dayEl = _this.getCellEl(row, col);\n\t\t\t\tvar allSegs = _this.getCellSegs(row, col);\n\n\t\t\t\t// rescope the segments to be within the cell's date\n\t\t\t\tvar reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\n\t\t\t\tvar reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\n\n\t\t\t\tif (typeof clickOption === 'function') {\n\t\t\t\t\t// the returned value can be an atomic option\n\t\t\t\t\tclickOption = view.publiclyTrigger('eventLimitClick', null, {\n\t\t\t\t\t\tdate: date,\n\t\t\t\t\t\tdayEl: dayEl,\n\t\t\t\t\t\tmoreEl: moreEl,\n\t\t\t\t\t\tsegs: reslicedAllSegs,\n\t\t\t\t\t\thiddenSegs: reslicedHiddenSegs\n\t\t\t\t\t}, ev);\n\t\t\t\t}\n\n\t\t\t\tif (clickOption === 'popover') {\n\t\t\t\t\t_this.showSegPopover(row, col, moreEl, reslicedAllSegs);\n\t\t\t\t}\n\t\t\t\telse if (typeof clickOption === 'string') { // a view name\n\t\t\t\t\tview.calendar.zoomTo(date, clickOption);\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\n\t// Reveals the popover that displays all events within a cell\n\tshowSegPopover: function(row, col, moreLink, segs) {\n\t\tvar _this = this;\n\t\tvar view = this.view;\n\t\tvar moreWrap = moreLink.parent(); // the
wrapper around the \n\t\tvar topEl; // the element we want to match the top coordinate of\n\t\tvar options;\n\n\t\tif (this.rowCnt == 1) {\n\t\t\ttopEl = view.el; // will cause the popover to cover any sort of header\n\t\t}\n\t\telse {\n\t\t\ttopEl = this.rowEls.eq(row); // will align with top of row\n\t\t}\n\n\t\toptions = {\n\t\t\tclassName: 'fc-more-popover',\n\t\t\tcontent: this.renderSegPopoverContent(row, col, segs),\n\t\t\tparentEl: this.view.el, // attach to root of view. guarantees outside of scrollbars.\n\t\t\ttop: topEl.offset().top,\n\t\t\tautoHide: true, // when the user clicks elsewhere, hide the popover\n\t\t\tviewportConstrain: view.opt('popoverViewportConstrain'),\n\t\t\thide: function() {\n\t\t\t\t// kill everything when the popover is hidden\n\t\t\t\t// notify events to be removed\n\t\t\t\tif (_this.popoverSegs) {\n\t\t\t\t\tvar seg;\n\t\t\t\t\tfor (var i = 0; i < _this.popoverSegs.length; ++i) {\n\t\t\t\t\t\tseg = _this.popoverSegs[i];\n\t\t\t\t\t\tview.publiclyTrigger('eventDestroy', seg.event, seg.event, seg.el);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_this.segPopover.removeElement();\n\t\t\t\t_this.segPopover = null;\n\t\t\t\t_this.popoverSegs = null;\n\t\t\t}\n\t\t};\n\n\t\t// Determine horizontal coordinate.\n\t\t// We use the moreWrap instead of the to avoid border confusion.\n\t\tif (this.isRTL) {\n\t\t\toptions.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border\n\t\t}\n\t\telse {\n\t\t\toptions.left = moreWrap.offset().left - 1; // -1 to be over cell border\n\t\t}\n\n\t\tthis.segPopover = new Popover(options);\n\t\tthis.segPopover.show();\n\n\t\t// the popover doesn't live within the grid's container element, and thus won't get the event\n\t\t// delegated-handlers for free. attach event-related handlers to the popover.\n\t\tthis.bindSegHandlersToEl(this.segPopover.el);\n\t},\n\n\n\t// Builds the inner DOM contents of the segment popover\n\trenderSegPopoverContent: function(row, col, segs) {\n\t\tvar view = this.view;\n\t\tvar isTheme = view.opt('theme');\n\t\tvar title = this.getCellDate(row, col).format(view.opt('dayPopoverFormat'));\n\t\tvar content = $(\n\t\t\t'
' +\n\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t\thtmlEscape(title) +\n\t\t\t\t'' +\n\t\t\t\t'
' +\n\t\t\t'
' +\n\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t'
'\n\t\t);\n\t\tvar segContainer = content.find('.fc-event-container');\n\t\tvar i;\n\n\t\t// render each seg's `el` and only return the visible segs\n\t\tsegs = this.renderFgSegEls(segs, true); // disableResizing=true\n\t\tthis.popoverSegs = segs;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\n\t\t\t// because segments in the popover are not part of a grid coordinate system, provide a hint to any\n\t\t\t// grids that want to do drag-n-drop about which cell it came from\n\t\t\tthis.hitsNeeded();\n\t\t\tsegs[i].hit = this.getCellHit(row, col);\n\t\t\tthis.hitsNotNeeded();\n\n\t\t\tsegContainer.append(segs[i].el);\n\t\t}\n\n\t\treturn content;\n\t},\n\n\n\t// Given the events within an array of segment objects, reslice them to be in a single day\n\tresliceDaySegs: function(segs, dayDate) {\n\n\t\t// build an array of the original events\n\t\tvar events = $.map(segs, function(seg) {\n\t\t\treturn seg.event;\n\t\t});\n\n\t\tvar dayStart = dayDate.clone();\n\t\tvar dayEnd = dayStart.clone().add(1, 'days');\n\t\tvar dayRange = { start: dayStart, end: dayEnd };\n\n\t\t// slice the events with a custom slicing function\n\t\tsegs = this.eventsToSegs(\n\t\t\tevents,\n\t\t\tfunction(range) {\n\t\t\t\tvar seg = intersectRanges(range, dayRange); // undefind if no intersection\n\t\t\t\treturn seg ? [ seg ] : []; // must return an array of segments\n\t\t\t}\n\t\t);\n\n\t\t// force an order because eventsToSegs doesn't guarantee one\n\t\tthis.sortEventSegs(segs);\n\n\t\treturn segs;\n\t},\n\n\n\t// Generates the text that should be inside a \"more\" link, given the number of events it represents\n\tgetMoreLinkText: function(num) {\n\t\tvar opt = this.view.opt('eventLimitText');\n\n\t\tif (typeof opt === 'function') {\n\t\t\treturn opt(num);\n\t\t}\n\t\telse {\n\t\t\treturn '+' + num + ' ' + opt;\n\t\t}\n\t},\n\n\n\t// Returns segments within a given cell.\n\t// If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\n\tgetCellSegs: function(row, col, startLevel) {\n\t\tvar segMatrix = this.rowStructs[row].segMatrix;\n\t\tvar level = startLevel || 0;\n\t\tvar segs = [];\n\t\tvar seg;\n\n\t\twhile (level < segMatrix.length) {\n\t\t\tseg = segMatrix[level][col];\n\t\t\tif (seg) {\n\t\t\t\tsegs.push(seg);\n\t\t\t}\n\t\t\tlevel++;\n\t\t}\n\n\t\treturn segs;\n\t}\n\n});\n\n;;\n\n/* A component that renders one or more columns of vertical time slots\n----------------------------------------------------------------------------------------------------------------------*/\n// We mixin DayTable, even though there is only a single row of days\n\nvar TimeGrid = FC.TimeGrid = Grid.extend(DayTableMixin, {\n\n\tslotDuration: null, // duration of a \"slot\", a distinct time segment on given day, visualized by lines\n\tsnapDuration: null, // granularity of time for dragging and selecting\n\tsnapsPerSlot: null,\n\tlabelFormat: null, // formatting string for times running along vertical axis\n\tlabelInterval: null, // duration of how often a label should be displayed for a slot\n\n\tcolEls: null, // cells elements in the day-row background\n\tslatContainerEl: null, // div that wraps all the slat rows\n\tslatEls: null, // elements running horizontally across all columns\n\tnowIndicatorEls: null,\n\n\tcolCoordCache: null,\n\tslatCoordCache: null,\n\n\n\tconstructor: function() {\n\t\tGrid.apply(this, arguments); // call the super-constructor\n\n\t\tthis.processOptions();\n\t},\n\n\n\t// Renders the time grid into `this.el`, which should already be assigned.\n\t// Relies on the view's colCnt. In the future, this component should probably be self-sufficient.\n\trenderDates: function() {\n\t\tthis.el.html(this.renderHtml());\n\t\tthis.colEls = this.el.find('.fc-day, .fc-disabled-day');\n\t\tthis.slatContainerEl = this.el.find('.fc-slats');\n\t\tthis.slatEls = this.slatContainerEl.find('tr');\n\n\t\tthis.colCoordCache = new CoordCache({\n\t\t\tels: this.colEls,\n\t\t\tisHorizontal: true\n\t\t});\n\t\tthis.slatCoordCache = new CoordCache({\n\t\t\tels: this.slatEls,\n\t\t\tisVertical: true\n\t\t});\n\n\t\tthis.renderContentSkeleton();\n\t},\n\n\n\t// Renders the basic HTML skeleton for the grid\n\trenderHtml: function() {\n\t\treturn '' +\n\t\t\t'
' +\n\t\t\t\t'' +\n\t\t\t\t\tthis.renderBgTrHtml(0) + // row=0\n\t\t\t\t'
' +\n\t\t\t'
' +\n\t\t\t'
' +\n\t\t\t\t'' +\n\t\t\t\t\tthis.renderSlatRowHtml() +\n\t\t\t\t'
' +\n\t\t\t'
';\n\t},\n\n\n\t// Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\n\trenderSlatRowHtml: function() {\n\t\tvar view = this.view;\n\t\tvar isRTL = this.isRTL;\n\t\tvar html = '';\n\t\tvar slotTime = moment.duration(+this.view.minTime); // wish there was .clone() for durations\n\t\tvar slotDate; // will be on the view's first day, but we only care about its time\n\t\tvar isLabeled;\n\t\tvar axisHtml;\n\n\t\t// Calculate the time for each slot\n\t\twhile (slotTime < this.view.maxTime) {\n\t\t\tslotDate = this.start.clone().time(slotTime);\n\t\t\tisLabeled = isInt(divideDurationByDuration(slotTime, this.labelInterval));\n\n\t\t\taxisHtml =\n\t\t\t\t'' +\n\t\t\t\t\t(isLabeled ?\n\t\t\t\t\t\t'' + // for matchCellWidths\n\t\t\t\t\t\t\thtmlEscape(slotDate.format(this.labelFormat)) +\n\t\t\t\t\t\t'' :\n\t\t\t\t\t\t''\n\t\t\t\t\t\t) +\n\t\t\t\t'';\n\n\t\t\thtml +=\n\t\t\t\t'' +\n\t\t\t\t\t(!isRTL ? axisHtml : '') +\n\t\t\t\t\t'' +\n\t\t\t\t\t(isRTL ? axisHtml : '') +\n\t\t\t\t\"\";\n\n\t\t\tslotTime.add(this.slotDuration);\n\t\t}\n\n\t\treturn html;\n\t},\n\n\n\t/* Options\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Parses various options into properties of this object\n\tprocessOptions: function() {\n\t\tvar view = this.view;\n\t\tvar slotDuration = view.opt('slotDuration');\n\t\tvar snapDuration = view.opt('snapDuration');\n\t\tvar input;\n\n\t\tslotDuration = moment.duration(slotDuration);\n\t\tsnapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;\n\n\t\tthis.slotDuration = slotDuration;\n\t\tthis.snapDuration = snapDuration;\n\t\tthis.snapsPerSlot = slotDuration / snapDuration; // TODO: ensure an integer multiple?\n\n\t\tthis.minResizeDuration = snapDuration; // hack\n\n\t\t// might be an array value (for TimelineView).\n\t\t// if so, getting the most granular entry (the last one probably).\n\t\tinput = view.opt('slotLabelFormat');\n\t\tif ($.isArray(input)) {\n\t\t\tinput = input[input.length - 1];\n\t\t}\n\n\t\tthis.labelFormat =\n\t\t\tinput ||\n\t\t\tview.opt('smallTimeFormat'); // the computed default\n\n\t\tinput = view.opt('slotLabelInterval');\n\t\tthis.labelInterval = input ?\n\t\t\tmoment.duration(input) :\n\t\t\tthis.computeLabelInterval(slotDuration);\n\t},\n\n\n\t// Computes an automatic value for slotLabelInterval\n\tcomputeLabelInterval: function(slotDuration) {\n\t\tvar i;\n\t\tvar labelInterval;\n\t\tvar slotsPerLabel;\n\n\t\t// find the smallest stock label interval that results in more than one slots-per-label\n\t\tfor (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {\n\t\t\tlabelInterval = moment.duration(AGENDA_STOCK_SUB_DURATIONS[i]);\n\t\t\tslotsPerLabel = divideDurationByDuration(labelInterval, slotDuration);\n\t\t\tif (isInt(slotsPerLabel) && slotsPerLabel > 1) {\n\t\t\t\treturn labelInterval;\n\t\t\t}\n\t\t}\n\n\t\treturn moment.duration(slotDuration); // fall back. clone\n\t},\n\n\n\t// Computes a default event time formatting string if `timeFormat` is not explicitly defined\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('noMeridiemTimeFormat'); // like \"6:30\" (no AM/PM)\n\t},\n\n\n\t// Computes a default `displayEventEnd` value if one is not expliclty defined\n\tcomputeDisplayEventEnd: function() {\n\t\treturn true;\n\t},\n\n\n\t/* Hit System\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tprepareHits: function() {\n\t\tthis.colCoordCache.build();\n\t\tthis.slatCoordCache.build();\n\t},\n\n\n\treleaseHits: function() {\n\t\tthis.colCoordCache.clear();\n\t\t// NOTE: don't clear slatCoordCache because we rely on it for computeTimeTop\n\t},\n\n\n\tqueryHit: function(leftOffset, topOffset) {\n\t\tvar snapsPerSlot = this.snapsPerSlot;\n\t\tvar colCoordCache = this.colCoordCache;\n\t\tvar slatCoordCache = this.slatCoordCache;\n\n\t\tif (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {\n\t\t\tvar colIndex = colCoordCache.getHorizontalIndex(leftOffset);\n\t\t\tvar slatIndex = slatCoordCache.getVerticalIndex(topOffset);\n\n\t\t\tif (colIndex != null && slatIndex != null) {\n\t\t\t\tvar slatTop = slatCoordCache.getTopOffset(slatIndex);\n\t\t\t\tvar slatHeight = slatCoordCache.getHeight(slatIndex);\n\t\t\t\tvar partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1\n\t\t\t\tvar localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat\n\t\t\t\tvar snapIndex = slatIndex * snapsPerSlot + localSnapIndex;\n\t\t\t\tvar snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;\n\t\t\t\tvar snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;\n\n\t\t\t\treturn {\n\t\t\t\t\tcol: colIndex,\n\t\t\t\t\tsnap: snapIndex,\n\t\t\t\t\tcomponent: this, // needed unfortunately :(\n\t\t\t\t\tleft: colCoordCache.getLeftOffset(colIndex),\n\t\t\t\t\tright: colCoordCache.getRightOffset(colIndex),\n\t\t\t\t\ttop: snapTop,\n\t\t\t\t\tbottom: snapBottom\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t},\n\n\n\tgetHitSpan: function(hit) {\n\t\tvar start = this.getCellDate(0, hit.col); // row=0\n\t\tvar time = this.computeSnapTime(hit.snap); // pass in the snap-index\n\t\tvar end;\n\n\t\tstart.time(time);\n\t\tend = start.clone().add(this.snapDuration);\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\tgetHitEl: function(hit) {\n\t\treturn this.colEls.eq(hit.col);\n\t},\n\n\n\t/* Dates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trangeUpdated: function() {\n\t\tthis.updateDayTable();\n\t},\n\n\n\t// Given a row number of the grid, representing a \"snap\", returns a time (Duration) from its start-of-day\n\tcomputeSnapTime: function(snapIndex) {\n\t\treturn moment.duration(this.view.minTime + this.snapDuration * snapIndex);\n\t},\n\n\n\t// Slices up the given span (unzoned start/end with other misc data) into an array of segments\n\tspanToSegs: function(span) {\n\t\tvar segs = this.sliceRangeByTimes(span);\n\t\tvar i;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tif (this.isRTL) {\n\t\t\t\tsegs[i].col = this.daysPerRow - 1 - segs[i].dayIndex;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsegs[i].col = segs[i].dayIndex;\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\tsliceRangeByTimes: function(range) {\n\t\tvar segs = [];\n\t\tvar seg;\n\t\tvar dayIndex;\n\t\tvar dayDate;\n\t\tvar dayRange;\n\n\t\tfor (dayIndex = 0; dayIndex < this.daysPerRow; dayIndex++) {\n\t\t\tdayDate = this.dayDates[dayIndex].clone().time(0); // TODO: better API for this?\n\t\t\tdayRange = {\n\t\t\t\tstart: dayDate.clone().add(this.view.minTime), // don't use .time() because it sux with negatives\n\t\t\t\tend: dayDate.clone().add(this.view.maxTime)\n\t\t\t};\n\t\t\tseg = intersectRanges(range, dayRange); // both will be ambig timezone\n\t\t\tif (seg) {\n\t\t\t\tseg.dayIndex = dayIndex;\n\t\t\t\tsegs.push(seg);\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\n\t/* Coordinates\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tupdateSize: function(isResize) { // NOT a standard Grid method\n\t\tthis.slatCoordCache.build();\n\n\t\tif (isResize) {\n\t\t\tthis.updateSegVerticals(\n\t\t\t\t[].concat(this.fgSegs || [], this.bgSegs || [], this.businessSegs || [])\n\t\t\t);\n\t\t}\n\t},\n\n\n\tgetTotalSlatHeight: function() {\n\t\treturn this.slatContainerEl.outerHeight();\n\t},\n\n\n\t// Computes the top coordinate, relative to the bounds of the grid, of the given date.\n\t// A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\n\tcomputeDateTop: function(date, startOfDayDate) {\n\t\treturn this.computeTimeTop(\n\t\t\tmoment.duration(\n\t\t\t\tdate - startOfDayDate.clone().stripTime()\n\t\t\t)\n\t\t);\n\t},\n\n\n\t// Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\n\tcomputeTimeTop: function(time) {\n\t\tvar len = this.slatEls.length;\n\t\tvar slatCoverage = (time - this.view.minTime) / this.slotDuration; // floating-point value of # of slots covered\n\t\tvar slatIndex;\n\t\tvar slatRemainder;\n\n\t\t// compute a floating-point number for how many slats should be progressed through.\n\t\t// from 0 to number of slats (inclusive)\n\t\t// constrained because minTime/maxTime might be customized.\n\t\tslatCoverage = Math.max(0, slatCoverage);\n\t\tslatCoverage = Math.min(len, slatCoverage);\n\n\t\t// an integer index of the furthest whole slat\n\t\t// from 0 to number slats (*exclusive*, so len-1)\n\t\tslatIndex = Math.floor(slatCoverage);\n\t\tslatIndex = Math.min(slatIndex, len - 1);\n\n\t\t// how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.\n\t\t// could be 1.0 if slatCoverage is covering *all* the slots\n\t\tslatRemainder = slatCoverage - slatIndex;\n\n\t\treturn this.slatCoordCache.getTopPosition(slatIndex) +\n\t\t\tthis.slatCoordCache.getHeight(slatIndex) * slatRemainder;\n\t},\n\n\n\n\t/* Event Drag Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event being dragged over the specified date(s).\n\t// A returned value of `true` signals that a mock \"helper\" event has been rendered.\n\trenderDrag: function(eventLocation, seg) {\n\t\tvar eventSpans;\n\t\tvar i;\n\n\t\tif (seg) { // if there is event information for this drag, render a helper event\n\n\t\t\t// returns mock event elements\n\t\t\t// signal that a helper has been rendered\n\t\t\treturn this.renderEventLocationHelper(eventLocation, seg);\n\t\t}\n\t\telse { // otherwise, just render a highlight\n\t\t\teventSpans = this.eventToSpans(eventLocation);\n\n\t\t\tfor (i = 0; i < eventSpans.length; i++) {\n\t\t\t\tthis.renderHighlight(eventSpans[i]);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Unrenders any visual indication of an event being dragged\n\tunrenderDrag: function() {\n\t\tthis.unrenderHelper();\n\t\tthis.unrenderHighlight();\n\t},\n\n\n\t/* Event Resize Visualization\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of an event being resized\n\trenderEventResize: function(eventLocation, seg) {\n\t\treturn this.renderEventLocationHelper(eventLocation, seg); // returns mock event elements\n\t},\n\n\n\t// Unrenders any visual indication of an event being resized\n\tunrenderEventResize: function() {\n\t\tthis.unrenderHelper();\n\t},\n\n\n\t/* Event Helper\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a mock \"helper\" event. `sourceSeg` is the original segment object and might be null (an external drag)\n\trenderHelper: function(event, sourceSeg) {\n\t\treturn this.renderHelperSegs(this.eventToSegs(event), sourceSeg); // returns mock event elements\n\t},\n\n\n\t// Unrenders any mock helper event\n\tunrenderHelper: function() {\n\t\tthis.unrenderHelperSegs();\n\t},\n\n\n\t/* Business Hours\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderBusinessHours: function() {\n\t\tthis.renderBusinessSegs(\n\t\t\tthis.buildBusinessHourSegs()\n\t\t);\n\t},\n\n\n\tunrenderBusinessHours: function() {\n\t\tthis.unrenderBusinessSegs();\n\t},\n\n\n\t/* Now Indicator\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tgetNowIndicatorUnit: function() {\n\t\treturn 'minute'; // will refresh on the minute\n\t},\n\n\n\trenderNowIndicator: function(date) {\n\t\t// seg system might be overkill, but it handles scenario where line needs to be rendered\n\t\t// more than once because of columns with the same date (resources columns for example)\n\t\tvar segs = this.spanToSegs({ start: date, end: date });\n\t\tvar top = this.computeDateTop(date, date);\n\t\tvar nodes = [];\n\t\tvar i;\n\n\t\t// render lines within the columns\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tnodes.push($('
')\n\t\t\t\t.css('top', top)\n\t\t\t\t.appendTo(this.colContainerEls.eq(segs[i].col))[0]);\n\t\t}\n\n\t\t// render an arrow over the axis\n\t\tif (segs.length > 0) { // is the current time in view?\n\t\t\tnodes.push($('
')\n\t\t\t\t.css('top', top)\n\t\t\t\t.appendTo(this.el.find('.fc-content-skeleton'))[0]);\n\t\t}\n\n\t\tthis.nowIndicatorEls = $(nodes);\n\t},\n\n\n\tunrenderNowIndicator: function() {\n\t\tif (this.nowIndicatorEls) {\n\t\t\tthis.nowIndicatorEls.remove();\n\t\t\tthis.nowIndicatorEls = null;\n\t\t}\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\n\trenderSelection: function(span) {\n\t\tif (this.view.opt('selectHelper')) { // this setting signals that a mock helper event should be rendered\n\n\t\t\t// normally acceps an eventLocation, span has a start/end, which is good enough\n\t\t\tthis.renderEventLocationHelper(span);\n\t\t}\n\t\telse {\n\t\t\tthis.renderHighlight(span);\n\t\t}\n\t},\n\n\n\t// Unrenders any visual indication of a selection\n\tunrenderSelection: function() {\n\t\tthis.unrenderHelper();\n\t\tthis.unrenderHighlight();\n\t},\n\n\n\t/* Highlight\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderHighlight: function(span) {\n\t\tthis.renderHighlightSegs(this.spanToSegs(span));\n\t},\n\n\n\tunrenderHighlight: function() {\n\t\tthis.unrenderHighlightSegs();\n\t}\n\n});\n\n;;\n\n/* Methods for rendering SEGMENTS, pieces of content that live on the view\n ( this file is no longer just for events )\n----------------------------------------------------------------------------------------------------------------------*/\n\nTimeGrid.mixin({\n\n\tcolContainerEls: null, // containers for each column\n\n\t// inner-containers for each column where different types of segs live\n\tfgContainerEls: null,\n\tbgContainerEls: null,\n\thelperContainerEls: null,\n\thighlightContainerEls: null,\n\tbusinessContainerEls: null,\n\n\t// arrays of different types of displayed segments\n\tfgSegs: null,\n\tbgSegs: null,\n\thelperSegs: null,\n\thighlightSegs: null,\n\tbusinessSegs: null,\n\n\n\t// Renders the DOM that the view's content will live in\n\trenderContentSkeleton: function() {\n\t\tvar cellHtml = '';\n\t\tvar i;\n\t\tvar skeletonEl;\n\n\t\tfor (i = 0; i < this.colCnt; i++) {\n\t\t\tcellHtml +=\n\t\t\t\t'' +\n\t\t\t\t\t'
' +\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t'
' +\n\t\t\t\t'';\n\t\t}\n\n\t\tskeletonEl = $(\n\t\t\t'
' +\n\t\t\t\t'' +\n\t\t\t\t\t'' + cellHtml + '' +\n\t\t\t\t'
' +\n\t\t\t'
'\n\t\t);\n\n\t\tthis.colContainerEls = skeletonEl.find('.fc-content-col');\n\t\tthis.helperContainerEls = skeletonEl.find('.fc-helper-container');\n\t\tthis.fgContainerEls = skeletonEl.find('.fc-event-container:not(.fc-helper-container)');\n\t\tthis.bgContainerEls = skeletonEl.find('.fc-bgevent-container');\n\t\tthis.highlightContainerEls = skeletonEl.find('.fc-highlight-container');\n\t\tthis.businessContainerEls = skeletonEl.find('.fc-business-container');\n\n\t\tthis.bookendCells(skeletonEl.find('tr')); // TODO: do this on string level\n\t\tthis.el.append(skeletonEl);\n\t},\n\n\n\t/* Foreground Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderFgSegs: function(segs) {\n\t\tsegs = this.renderFgSegsIntoContainers(segs, this.fgContainerEls);\n\t\tthis.fgSegs = segs;\n\t\treturn segs; // needed for Grid::renderEvents\n\t},\n\n\n\tunrenderFgSegs: function() {\n\t\tthis.unrenderNamedSegs('fgSegs');\n\t},\n\n\n\t/* Foreground Helper Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderHelperSegs: function(segs, sourceSeg) {\n\t\tvar helperEls = [];\n\t\tvar i, seg;\n\t\tvar sourceEl;\n\n\t\tsegs = this.renderFgSegsIntoContainers(segs, this.helperContainerEls);\n\n\t\t// Try to make the segment that is in the same row as sourceSeg look the same\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tif (sourceSeg && sourceSeg.col === seg.col) {\n\t\t\t\tsourceEl = sourceSeg.el;\n\t\t\t\tseg.el.css({\n\t\t\t\t\tleft: sourceEl.css('left'),\n\t\t\t\t\tright: sourceEl.css('right'),\n\t\t\t\t\t'margin-left': sourceEl.css('margin-left'),\n\t\t\t\t\t'margin-right': sourceEl.css('margin-right')\n\t\t\t\t});\n\t\t\t}\n\t\t\thelperEls.push(seg.el[0]);\n\t\t}\n\n\t\tthis.helperSegs = segs;\n\n\t\treturn $(helperEls); // must return rendered helpers\n\t},\n\n\n\tunrenderHelperSegs: function() {\n\t\tthis.unrenderNamedSegs('helperSegs');\n\t},\n\n\n\t/* Background Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderBgSegs: function(segs) {\n\t\tsegs = this.renderFillSegEls('bgEvent', segs); // TODO: old fill system\n\t\tthis.updateSegVerticals(segs);\n\t\tthis.attachSegsByCol(this.groupSegsByCol(segs), this.bgContainerEls);\n\t\tthis.bgSegs = segs;\n\t\treturn segs; // needed for Grid::renderEvents\n\t},\n\n\n\tunrenderBgSegs: function() {\n\t\tthis.unrenderNamedSegs('bgSegs');\n\t},\n\n\n\t/* Highlight\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderHighlightSegs: function(segs) {\n\t\tsegs = this.renderFillSegEls('highlight', segs); // TODO: old fill system\n\t\tthis.updateSegVerticals(segs);\n\t\tthis.attachSegsByCol(this.groupSegsByCol(segs), this.highlightContainerEls);\n\t\tthis.highlightSegs = segs;\n\t},\n\n\n\tunrenderHighlightSegs: function() {\n\t\tthis.unrenderNamedSegs('highlightSegs');\n\t},\n\n\n\t/* Business Hours\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderBusinessSegs: function(segs) {\n\t\tsegs = this.renderFillSegEls('businessHours', segs); // TODO: old fill system\n\t\tthis.updateSegVerticals(segs);\n\t\tthis.attachSegsByCol(this.groupSegsByCol(segs), this.businessContainerEls);\n\t\tthis.businessSegs = segs;\n\t},\n\n\n\tunrenderBusinessSegs: function() {\n\t\tthis.unrenderNamedSegs('businessSegs');\n\t},\n\n\n\t/* Seg Rendering Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\n\tgroupSegsByCol: function(segs) {\n\t\tvar segsByCol = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < this.colCnt; i++) {\n\t\t\tsegsByCol.push([]);\n\t\t}\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tsegsByCol[segs[i].col].push(segs[i]);\n\t\t}\n\n\t\treturn segsByCol;\n\t},\n\n\n\t// Given segments grouped by column, insert the segments' elements into a parallel array of container\n\t// elements, each living within a column.\n\tattachSegsByCol: function(segsByCol, containerEls) {\n\t\tvar col;\n\t\tvar segs;\n\t\tvar i;\n\n\t\tfor (col = 0; col < this.colCnt; col++) { // iterate each column grouping\n\t\t\tsegs = segsByCol[col];\n\n\t\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\t\tcontainerEls.eq(col).append(segs[i].el);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Given the name of a property of `this` object, assumed to be an array of segments,\n\t// loops through each segment and removes from DOM. Will null-out the property afterwards.\n\tunrenderNamedSegs: function(propName) {\n\t\tvar segs = this[propName];\n\t\tvar i;\n\n\t\tif (segs) {\n\t\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\t\tsegs[i].el.remove();\n\t\t\t}\n\t\t\tthis[propName] = null;\n\t\t}\n\t},\n\n\n\n\t/* Foreground Event Rendering Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Given an array of foreground segments, render a DOM element for each, computes position,\n\t// and attaches to the column inner-container elements.\n\trenderFgSegsIntoContainers: function(segs, containerEls) {\n\t\tvar segsByCol;\n\t\tvar col;\n\n\t\tsegs = this.renderFgSegEls(segs); // will call fgSegHtml\n\t\tsegsByCol = this.groupSegsByCol(segs);\n\n\t\tfor (col = 0; col < this.colCnt; col++) {\n\t\t\tthis.updateFgSegCoords(segsByCol[col]);\n\t\t}\n\n\t\tthis.attachSegsByCol(segsByCol, containerEls);\n\n\t\treturn segs;\n\t},\n\n\n\t// Renders the HTML for a single event segment's default rendering\n\tfgSegHtml: function(seg, disableResizing) {\n\t\tvar view = this.view;\n\t\tvar event = seg.event;\n\t\tvar isDraggable = view.isEventDraggable(event);\n\t\tvar isResizableFromStart = !disableResizing && seg.isStart && view.isEventResizableFromStart(event);\n\t\tvar isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventResizableFromEnd(event);\n\t\tvar classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\n\t\tvar skinCss = cssToStr(this.getSegSkinCss(seg));\n\t\tvar timeText;\n\t\tvar fullTimeText; // more verbose time text. for the print stylesheet\n\t\tvar startTimeText; // just the start time text\n\n\t\tclasses.unshift('fc-time-grid-event', 'fc-v-event');\n\n\t\tif (view.isMultiDayEvent(event)) { // if the event appears to span more than one day...\n\t\t\t// Don't display time text on segments that run entirely through a day.\n\t\t\t// That would appear as midnight-midnight and would look dumb.\n\t\t\t// Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\n\t\t\tif (seg.isStart || seg.isEnd) {\n\t\t\t\ttimeText = this.getEventTimeText(seg);\n\t\t\t\tfullTimeText = this.getEventTimeText(seg, 'LT');\n\t\t\t\tstartTimeText = this.getEventTimeText(seg, null, false); // displayEnd=false\n\t\t\t}\n\t\t} else {\n\t\t\t// Display the normal time text for the *event's* times\n\t\t\ttimeText = this.getEventTimeText(event);\n\t\t\tfullTimeText = this.getEventTimeText(event, 'LT');\n\t\t\tstartTimeText = this.getEventTimeText(event, null, false); // displayEnd=false\n\t\t}\n\n\t\treturn '
' +\n\t\t\t\t'
' +\n\t\t\t\t\t(timeText ?\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t'' + htmlEscape(timeText) + '' +\n\t\t\t\t\t\t'
' :\n\t\t\t\t\t\t''\n\t\t\t\t\t\t) +\n\t\t\t\t\t(event.title ?\n\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\thtmlEscape(event.title) +\n\t\t\t\t\t\t'
' :\n\t\t\t\t\t\t''\n\t\t\t\t\t\t) +\n\t\t\t\t'
' +\n\t\t\t\t'
' +\n\t\t\t\t/* TODO: write CSS for this\n\t\t\t\t(isResizableFromStart ?\n\t\t\t\t\t'
' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t\t*/\n\t\t\t\t(isResizableFromEnd ?\n\t\t\t\t\t'
' :\n\t\t\t\t\t''\n\t\t\t\t\t) +\n\t\t\t'';\n\t},\n\n\n\t/* Seg Position Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Refreshes the CSS top/bottom coordinates for each segment element.\n\t// Works when called after initial render, after a window resize/zoom for example.\n\tupdateSegVerticals: function(segs) {\n\t\tthis.computeSegVerticals(segs);\n\t\tthis.assignSegVerticals(segs);\n\t},\n\n\n\t// For each segment in an array, computes and assigns its top and bottom properties\n\tcomputeSegVerticals: function(segs) {\n\t\tvar i, seg;\n\t\tvar dayDate;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tdayDate = this.dayDates[seg.dayIndex];\n\n\t\t\tseg.top = this.computeDateTop(seg.start, dayDate);\n\t\t\tseg.bottom = this.computeDateTop(seg.end, dayDate);\n\t\t}\n\t},\n\n\n\t// Given segments that already have their top/bottom properties computed, applies those values to\n\t// the segments' elements.\n\tassignSegVerticals: function(segs) {\n\t\tvar i, seg;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\tseg.el.css(this.generateSegVerticalCss(seg));\n\t\t}\n\t},\n\n\n\t// Generates an object with CSS properties for the top/bottom coordinates of a segment element\n\tgenerateSegVerticalCss: function(seg) {\n\t\treturn {\n\t\t\ttop: seg.top,\n\t\t\tbottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\n\t\t};\n\t},\n\n\n\t/* Foreground Event Positioning Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Given segments that are assumed to all live in the *same column*,\n\t// compute their verical/horizontal coordinates and assign to their elements.\n\tupdateFgSegCoords: function(segs) {\n\t\tthis.computeSegVerticals(segs); // horizontals relies on this\n\t\tthis.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array\n\t\tthis.assignSegVerticals(segs);\n\t\tthis.assignFgSegHorizontals(segs);\n\t},\n\n\n\t// Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\n\t// NOTE: Also reorders the given array by date!\n\tcomputeFgSegHorizontals: function(segs) {\n\t\tvar levels;\n\t\tvar level0;\n\t\tvar i;\n\n\t\tthis.sortEventSegs(segs); // order by certain criteria\n\t\tlevels = buildSlotSegLevels(segs);\n\t\tcomputeForwardSlotSegs(levels);\n\n\t\tif ((level0 = levels[0])) {\n\n\t\t\tfor (i = 0; i < level0.length; i++) {\n\t\t\t\tcomputeSlotSegPressures(level0[i]);\n\t\t\t}\n\n\t\t\tfor (i = 0; i < level0.length; i++) {\n\t\t\t\tthis.computeFgSegForwardBack(level0[i], 0, 0);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\n\t// from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\n\t// seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\n\t//\n\t// The segment might be part of a \"series\", which means consecutive segments with the same pressure\n\t// who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\n\t// segments behind this one in the current series, and `seriesBackwardCoord` is the starting\n\t// coordinate of the first segment in the series.\n\tcomputeFgSegForwardBack: function(seg, seriesBackwardPressure, seriesBackwardCoord) {\n\t\tvar forwardSegs = seg.forwardSegs;\n\t\tvar i;\n\n\t\tif (seg.forwardCoord === undefined) { // not already computed\n\n\t\t\tif (!forwardSegs.length) {\n\n\t\t\t\t// if there are no forward segments, this segment should butt up against the edge\n\t\t\t\tseg.forwardCoord = 1;\n\t\t\t}\n\t\t\telse {\n\n\t\t\t\t// sort highest pressure first\n\t\t\t\tthis.sortForwardSegs(forwardSegs);\n\n\t\t\t\t// this segment's forwardCoord will be calculated from the backwardCoord of the\n\t\t\t\t// highest-pressure forward segment.\n\t\t\t\tthis.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\n\t\t\t\tseg.forwardCoord = forwardSegs[0].backwardCoord;\n\t\t\t}\n\n\t\t\t// calculate the backwardCoord from the forwardCoord. consider the series\n\t\t\tseg.backwardCoord = seg.forwardCoord -\n\t\t\t\t(seg.forwardCoord - seriesBackwardCoord) / // available width for series\n\t\t\t\t(seriesBackwardPressure + 1); // # of segments in the series\n\n\t\t\t// use this segment's coordinates to computed the coordinates of the less-pressurized\n\t\t\t// forward segments\n\t\t\tfor (i=0; i seg2.top && seg1.top < seg2.bottom;\n}\n\n;;\n\n/* An abstract class from which other views inherit from\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar View = FC.View = Model.extend({\n\n\ttype: null, // subclass' view name (string)\n\tname: null, // deprecated. use `type` instead\n\ttitle: null, // the text that will be displayed in the header's title\n\n\tcalendar: null, // owner Calendar object\n\tviewSpec: null,\n\toptions: null, // hash containing all options. already merged with view-specific-options\n\tel: null, // the view's containing element. set by Calendar\n\n\trenderQueue: null,\n\tbatchRenderDepth: 0,\n\tisDatesRendered: false,\n\tisEventsRendered: false,\n\tisBaseRendered: false, // related to viewRender/viewDestroy triggers\n\n\tqueuedScroll: null,\n\n\tisRTL: false,\n\tisSelected: false, // boolean whether a range of time is user-selected or not\n\tselectedEvent: null,\n\n\teventOrderSpecs: null, // criteria for ordering events when they have same date/time\n\n\t// classNames styled by jqui themes\n\twidgetHeaderClass: null,\n\twidgetContentClass: null,\n\thighlightStateClass: null,\n\n\t// for date utils, computed from options\n\tnextDayThreshold: null,\n\tisHiddenDayHash: null,\n\n\t// now indicator\n\tisNowIndicatorRendered: null,\n\tinitialNowDate: null, // result first getNow call\n\tinitialNowQueriedMs: null, // ms time the getNow was called\n\tnowIndicatorTimeoutID: null, // for refresh timing of now indicator\n\tnowIndicatorIntervalID: null, // \"\n\n\n\tconstructor: function(calendar, viewSpec) {\n\t\tModel.prototype.constructor.call(this);\n\n\t\tthis.calendar = calendar;\n\t\tthis.viewSpec = viewSpec;\n\n\t\t// shortcuts\n\t\tthis.type = viewSpec.type;\n\t\tthis.options = viewSpec.options;\n\n\t\t// .name is deprecated\n\t\tthis.name = this.type;\n\n\t\tthis.nextDayThreshold = moment.duration(this.opt('nextDayThreshold'));\n\t\tthis.initThemingProps();\n\t\tthis.initHiddenDays();\n\t\tthis.isRTL = this.opt('isRTL');\n\n\t\tthis.eventOrderSpecs = parseFieldSpecs(this.opt('eventOrder'));\n\n\t\tthis.renderQueue = this.buildRenderQueue();\n\t\tthis.initAutoBatchRender();\n\n\t\tthis.initialize();\n\t},\n\n\n\tbuildRenderQueue: function() {\n\t\tvar _this = this;\n\t\tvar renderQueue = new RenderQueue({\n\t\t\tevent: this.opt('eventRenderWait')\n\t\t});\n\n\t\trenderQueue.on('start', function() {\n\t\t\t_this.freezeHeight();\n\t\t\t_this.addScroll(_this.queryScroll());\n\t\t});\n\n\t\trenderQueue.on('stop', function() {\n\t\t\t_this.thawHeight();\n\t\t\t_this.popScroll();\n\t\t});\n\n\t\treturn renderQueue;\n\t},\n\n\n\tinitAutoBatchRender: function() {\n\t\tvar _this = this;\n\n\t\tthis.on('before:change', function() {\n\t\t\t_this.startBatchRender();\n\t\t});\n\n\t\tthis.on('change', function() {\n\t\t\t_this.stopBatchRender();\n\t\t});\n\t},\n\n\n\tstartBatchRender: function() {\n\t\tif (!(this.batchRenderDepth++)) {\n\t\t\tthis.renderQueue.pause();\n\t\t}\n\t},\n\n\n\tstopBatchRender: function() {\n\t\tif (!(--this.batchRenderDepth)) {\n\t\t\tthis.renderQueue.resume();\n\t\t}\n\t},\n\n\n\t// A good place for subclasses to initialize member variables\n\tinitialize: function() {\n\t\t// subclasses can implement\n\t},\n\n\n\t// Retrieves an option with the given name\n\topt: function(name) {\n\t\treturn this.options[name];\n\t},\n\n\n\t// Triggers handlers that are view-related. Modifies args before passing to calendar.\n\tpubliclyTrigger: function(name, thisObj) { // arguments beyond thisObj are passed along\n\t\tvar calendar = this.calendar;\n\n\t\treturn calendar.publiclyTrigger.apply(\n\t\t\tcalendar,\n\t\t\t[name, thisObj || this].concat(\n\t\t\t\tArray.prototype.slice.call(arguments, 2), // arguments beyond thisObj\n\t\t\t\t[ this ] // always make the last argument a reference to the view. TODO: deprecate\n\t\t\t)\n\t\t);\n\t},\n\n\n\t/* Title and Date Formatting\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Sets the view's title property to the most updated computed value\n\tupdateTitle: function() {\n\t\tthis.title = this.computeTitle();\n\t\tthis.calendar.setToolbarsTitle(this.title);\n\t},\n\n\n\t// Computes what the title at the top of the calendar should be for this view\n\tcomputeTitle: function() {\n\t\tvar range;\n\n\t\t// for views that span a large unit of time, show the proper interval, ignoring stray days before and after\n\t\tif (/^(year|month)$/.test(this.currentRangeUnit)) {\n\t\t\trange = this.currentRange;\n\t\t}\n\t\telse { // for day units or smaller, use the actual day range\n\t\t\trange = this.activeRange;\n\t\t}\n\n\t\treturn this.formatRange(\n\t\t\t{\n\t\t\t\t// in case currentRange has a time, make sure timezone is correct\n\t\t\t\tstart: this.calendar.applyTimezone(range.start),\n\t\t\t\tend: this.calendar.applyTimezone(range.end)\n\t\t\t},\n\t\t\tthis.opt('titleFormat') || this.computeTitleFormat(),\n\t\t\tthis.opt('titleRangeSeparator')\n\t\t);\n\t},\n\n\n\t// Generates the format string that should be used to generate the title for the current date range.\n\t// Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\n\tcomputeTitleFormat: function() {\n\t\tif (this.currentRangeUnit == 'year') {\n\t\t\treturn 'YYYY';\n\t\t}\n\t\telse if (this.currentRangeUnit == 'month') {\n\t\t\treturn this.opt('monthYearFormat'); // like \"September 2014\"\n\t\t}\n\t\telse if (this.currentRangeAs('days') > 1) {\n\t\t\treturn 'll'; // multi-day range. shorter, like \"Sep 9 - 10 2014\"\n\t\t}\n\t\telse {\n\t\t\treturn 'LL'; // one day. longer, like \"September 9 2014\"\n\t\t}\n\t},\n\n\n\t// Utility for formatting a range. Accepts a range object, formatting string, and optional separator.\n\t// Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.\n\t// The timezones of the dates within `range` will be respected.\n\tformatRange: function(range, formatStr, separator) {\n\t\tvar end = range.end;\n\n\t\tif (!end.hasTime()) { // all-day?\n\t\t\tend = end.clone().subtract(1); // convert to inclusive. last ms of previous day\n\t\t}\n\n\t\treturn formatRange(range.start, end, formatStr, separator, this.opt('isRTL'));\n\t},\n\n\n\tgetAllDayHtml: function() {\n\t\treturn this.opt('allDayHtml') || htmlEscape(this.opt('allDayText'));\n\t},\n\n\n\t/* Navigation\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Generates HTML for an anchor to another view into the calendar.\n\t// Will either generate an tag or a non-clickable tag, depending on enabled settings.\n\t// `gotoOptions` can either be a moment input, or an object with the form:\n\t// { date, type, forceOff }\n\t// `type` is a view-type like \"day\" or \"week\". default value is \"day\".\n\t// `attrs` and `innerHtml` are use to generate the rest of the HTML tag.\n\tbuildGotoAnchorHtml: function(gotoOptions, attrs, innerHtml) {\n\t\tvar date, type, forceOff;\n\t\tvar finalOptions;\n\n\t\tif ($.isPlainObject(gotoOptions)) {\n\t\t\tdate = gotoOptions.date;\n\t\t\ttype = gotoOptions.type;\n\t\t\tforceOff = gotoOptions.forceOff;\n\t\t}\n\t\telse {\n\t\t\tdate = gotoOptions; // a single moment input\n\t\t}\n\t\tdate = FC.moment(date); // if a string, parse it\n\n\t\tfinalOptions = { // for serialization into the link\n\t\t\tdate: date.format('YYYY-MM-DD'),\n\t\t\ttype: type || 'day'\n\t\t};\n\n\t\tif (typeof attrs === 'string') {\n\t\t\tinnerHtml = attrs;\n\t\t\tattrs = null;\n\t\t}\n\n\t\tattrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space\n\t\tinnerHtml = innerHtml || '';\n\n\t\tif (!forceOff && this.opt('navLinks')) {\n\t\t\treturn '' +\n\t\t\t\tinnerHtml +\n\t\t\t\t'';\n\t\t}\n\t\telse {\n\t\t\treturn '' +\n\t\t\t\tinnerHtml +\n\t\t\t\t'';\n\t\t}\n\t},\n\n\n\t// Rendering Non-date-related Content\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Sets the container element that the view should render inside of, does global DOM-related initializations,\n\t// and renders all the non-date-related content inside.\n\tsetElement: function(el) {\n\t\tthis.el = el;\n\t\tthis.bindGlobalHandlers();\n\t\tthis.bindBaseRenderHandlers();\n\t\tthis.renderSkeleton();\n\t},\n\n\n\t// Removes the view's container element from the DOM, clearing any content beforehand.\n\t// Undoes any other DOM-related attachments.\n\tremoveElement: function() {\n\t\tthis.unsetDate();\n\t\tthis.unrenderSkeleton();\n\n\t\tthis.unbindGlobalHandlers();\n\t\tthis.unbindBaseRenderHandlers();\n\n\t\tthis.el.remove();\n\t\t// NOTE: don't null-out this.el in case the View was destroyed within an API callback.\n\t\t// We don't null-out the View's other jQuery element references upon destroy,\n\t\t// so we shouldn't kill this.el either.\n\t},\n\n\n\t// Renders the basic structure of the view before any content is rendered\n\trenderSkeleton: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders the basic structure of the view\n\tunrenderSkeleton: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Date Setting/Unsetting\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tsetDate: function(date) {\n\t\tvar currentDateProfile = this.get('dateProfile');\n\t\tvar newDateProfile = this.buildDateProfile(date, null, true); // forceToValid=true\n\n\t\tif (\n\t\t\t!currentDateProfile ||\n\t\t\t!isRangesEqual(currentDateProfile.activeRange, newDateProfile.activeRange)\n\t\t) {\n\t\t\tthis.set('dateProfile', newDateProfile);\n\t\t}\n\n\t\treturn newDateProfile.date;\n\t},\n\n\n\tunsetDate: function() {\n\t\tthis.unset('dateProfile');\n\t},\n\n\n\t// Date Rendering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\trequestDateRender: function(dateProfile) {\n\t\tvar _this = this;\n\n\t\tthis.renderQueue.queue(function() {\n\t\t\t_this.executeDateRender(dateProfile);\n\t\t}, 'date', 'init');\n\t},\n\n\n\trequestDateUnrender: function() {\n\t\tvar _this = this;\n\n\t\tthis.renderQueue.queue(function() {\n\t\t\t_this.executeDateUnrender();\n\t\t}, 'date', 'destroy');\n\t},\n\n\n\t// Event Data\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tfetchInitialEvents: function(dateProfile) {\n\t\treturn this.calendar.requestEvents(\n\t\t\tdateProfile.activeRange.start,\n\t\t\tdateProfile.activeRange.end\n\t\t);\n\t},\n\n\n\tbindEventChanges: function() {\n\t\tthis.listenTo(this.calendar, 'eventsReset', this.resetEvents);\n\t},\n\n\n\tunbindEventChanges: function() {\n\t\tthis.stopListeningTo(this.calendar, 'eventsReset');\n\t},\n\n\n\tsetEvents: function(events) {\n\t\tthis.set('currentEvents', events);\n\t\tthis.set('hasEvents', true);\n\t},\n\n\n\tunsetEvents: function() {\n\t\tthis.unset('currentEvents');\n\t\tthis.unset('hasEvents');\n\t},\n\n\n\tresetEvents: function(events) {\n\t\tthis.startBatchRender();\n\t\tthis.unsetEvents();\n\t\tthis.setEvents(events);\n\t\tthis.stopBatchRender();\n\t},\n\n\n\t// Event Rendering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\trequestEventsRender: function(events) {\n\t\tvar _this = this;\n\n\t\tthis.renderQueue.queue(function() {\n\t\t\t_this.executeEventsRender(events);\n\t\t}, 'event', 'init');\n\t},\n\n\n\trequestEventsUnrender: function() {\n\t\tvar _this = this;\n\n\t\tthis.renderQueue.queue(function() {\n\t\t\t_this.executeEventsUnrender();\n\t\t}, 'event', 'destroy');\n\t},\n\n\n\t// Date High-level Rendering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// if dateProfile not specified, uses current\n\texecuteDateRender: function(dateProfile, skipScroll) {\n\n\t\tthis.setDateProfileForRendering(dateProfile);\n\t\tthis.updateTitle();\n\t\tthis.calendar.updateToolbarButtons();\n\n\t\tif (this.render) {\n\t\t\tthis.render(); // TODO: deprecate\n\t\t}\n\n\t\tthis.renderDates();\n\t\tthis.updateSize();\n\t\tthis.renderBusinessHours(); // might need coordinates, so should go after updateSize()\n\t\tthis.startNowIndicator();\n\n\t\tif (!skipScroll) {\n\t\t\tthis.addScroll(this.computeInitialDateScroll());\n\t\t}\n\n\t\tthis.isDatesRendered = true;\n\t\tthis.trigger('datesRendered');\n\t},\n\n\n\texecuteDateUnrender: function() {\n\n\t\tthis.unselect();\n\t\tthis.stopNowIndicator();\n\n\t\tthis.trigger('before:datesUnrendered');\n\n\t\tthis.unrenderBusinessHours();\n\t\tthis.unrenderDates();\n\n\t\tif (this.destroy) {\n\t\t\tthis.destroy(); // TODO: deprecate\n\t\t}\n\n\t\tthis.isDatesRendered = false;\n\t},\n\n\n\t// Date Low-level Rendering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// date-cell content only\n\trenderDates: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// date-cell content only\n\tunrenderDates: function() {\n\t\t// subclasses should override\n\t},\n\n\n\t// Determing when the \"meat\" of the view is rendered (aka the base)\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tbindBaseRenderHandlers: function() {\n\t\tvar _this = this;\n\n\t\tthis.on('datesRendered.baseHandler', function() {\n\t\t\t_this.onBaseRender();\n\t\t});\n\n\t\tthis.on('before:datesUnrendered.baseHandler', function() {\n\t\t\t_this.onBeforeBaseUnrender();\n\t\t});\n\t},\n\n\n\tunbindBaseRenderHandlers: function() {\n\t\tthis.off('.baseHandler');\n\t},\n\n\n\tonBaseRender: function() {\n\t\tthis.applyScreenState();\n\t\tthis.publiclyTrigger('viewRender', this, this, this.el);\n\t},\n\n\n\tonBeforeBaseUnrender: function() {\n\t\tthis.applyScreenState();\n\t\tthis.publiclyTrigger('viewDestroy', this, this, this.el);\n\t},\n\n\n\t// Misc view rendering utils\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Binds DOM handlers to elements that reside outside the view container, such as the document\n\tbindGlobalHandlers: function() {\n\t\tthis.listenTo(GlobalEmitter.get(), {\n\t\t\ttouchstart: this.processUnselect,\n\t\t\tmousedown: this.handleDocumentMousedown\n\t\t});\n\t},\n\n\n\t// Unbinds DOM handlers from elements that reside outside the view container\n\tunbindGlobalHandlers: function() {\n\t\tthis.stopListeningTo(GlobalEmitter.get());\n\t},\n\n\n\t// Initializes internal variables related to theming\n\tinitThemingProps: function() {\n\t\tvar tm = this.opt('theme') ? 'ui' : 'fc';\n\n\t\tthis.widgetHeaderClass = tm + '-widget-header';\n\t\tthis.widgetContentClass = tm + '-widget-content';\n\t\tthis.highlightStateClass = tm + '-state-highlight';\n\t},\n\n\n\t/* Business Hours\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders business-hours onto the view. Assumes updateSize has already been called.\n\trenderBusinessHours: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Unrenders previously-rendered business-hours\n\tunrenderBusinessHours: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Now Indicator\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Immediately render the current time indicator and begins re-rendering it at an interval,\n\t// which is defined by this.getNowIndicatorUnit().\n\t// TODO: somehow do this for the current whole day's background too\n\tstartNowIndicator: function() {\n\t\tvar _this = this;\n\t\tvar unit;\n\t\tvar update;\n\t\tvar delay; // ms wait value\n\n\t\tif (this.opt('nowIndicator')) {\n\t\t\tunit = this.getNowIndicatorUnit();\n\t\t\tif (unit) {\n\t\t\t\tupdate = proxy(this, 'updateNowIndicator'); // bind to `this`\n\n\t\t\t\tthis.initialNowDate = this.calendar.getNow();\n\t\t\t\tthis.initialNowQueriedMs = +new Date();\n\t\t\t\tthis.renderNowIndicator(this.initialNowDate);\n\t\t\t\tthis.isNowIndicatorRendered = true;\n\n\t\t\t\t// wait until the beginning of the next interval\n\t\t\t\tdelay = this.initialNowDate.clone().startOf(unit).add(1, unit) - this.initialNowDate;\n\t\t\t\tthis.nowIndicatorTimeoutID = setTimeout(function() {\n\t\t\t\t\t_this.nowIndicatorTimeoutID = null;\n\t\t\t\t\tupdate();\n\t\t\t\t\tdelay = +moment.duration(1, unit);\n\t\t\t\t\tdelay = Math.max(100, delay); // prevent too frequent\n\t\t\t\t\t_this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval\n\t\t\t\t}, delay);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// rerenders the now indicator, computing the new current time from the amount of time that has passed\n\t// since the initial getNow call.\n\tupdateNowIndicator: function() {\n\t\tif (this.isNowIndicatorRendered) {\n\t\t\tthis.unrenderNowIndicator();\n\t\t\tthis.renderNowIndicator(\n\t\t\t\tthis.initialNowDate.clone().add(new Date() - this.initialNowQueriedMs) // add ms\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// Immediately unrenders the view's current time indicator and stops any re-rendering timers.\n\t// Won't cause side effects if indicator isn't rendered.\n\tstopNowIndicator: function() {\n\t\tif (this.isNowIndicatorRendered) {\n\n\t\t\tif (this.nowIndicatorTimeoutID) {\n\t\t\t\tclearTimeout(this.nowIndicatorTimeoutID);\n\t\t\t\tthis.nowIndicatorTimeoutID = null;\n\t\t\t}\n\t\t\tif (this.nowIndicatorIntervalID) {\n\t\t\t\tclearTimeout(this.nowIndicatorIntervalID);\n\t\t\t\tthis.nowIndicatorIntervalID = null;\n\t\t\t}\n\n\t\t\tthis.unrenderNowIndicator();\n\t\t\tthis.isNowIndicatorRendered = false;\n\t\t}\n\t},\n\n\n\t// Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator\n\t// should be refreshed. If something falsy is returned, no time indicator is rendered at all.\n\tgetNowIndicatorUnit: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Renders a current time indicator at the given datetime\n\trenderNowIndicator: function(date) {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Undoes the rendering actions from renderNowIndicator\n\tunrenderNowIndicator: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Dimensions\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Refreshes anything dependant upon sizing of the container element of the grid\n\tupdateSize: function(isResize) {\n\t\tvar scroll;\n\n\t\tif (isResize) {\n\t\t\tscroll = this.queryScroll();\n\t\t}\n\n\t\tthis.updateHeight(isResize);\n\t\tthis.updateWidth(isResize);\n\t\tthis.updateNowIndicator();\n\n\t\tif (isResize) {\n\t\t\tthis.applyScroll(scroll);\n\t\t}\n\t},\n\n\n\t// Refreshes the horizontal dimensions of the calendar\n\tupdateWidth: function(isResize) {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Refreshes the vertical dimensions of the calendar\n\tupdateHeight: function(isResize) {\n\t\tvar calendar = this.calendar; // we poll the calendar for height information\n\n\t\tthis.setHeight(\n\t\t\tcalendar.getSuggestedViewHeight(),\n\t\t\tcalendar.isHeightAuto()\n\t\t);\n\t},\n\n\n\t// Updates the vertical dimensions of the calendar to the specified height.\n\t// if `isAuto` is set to true, height becomes merely a suggestion and the view should use its \"natural\" height.\n\tsetHeight: function(height, isAuto) {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Scroller\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\taddForcedScroll: function(scroll) {\n\t\tthis.addScroll(\n\t\t\t$.extend(scroll, { isForced: true })\n\t\t);\n\t},\n\n\n\taddScroll: function(scroll) {\n\t\tvar queuedScroll = this.queuedScroll || (this.queuedScroll = {});\n\n\t\tif (!queuedScroll.isForced) {\n\t\t\t$.extend(queuedScroll, scroll);\n\t\t}\n\t},\n\n\n\tpopScroll: function() {\n\t\tthis.applyQueuedScroll();\n\t\tthis.queuedScroll = null;\n\t},\n\n\n\tapplyQueuedScroll: function() {\n\t\tif (this.queuedScroll) {\n\t\t\tthis.applyScroll(this.queuedScroll);\n\t\t}\n\t},\n\n\n\tqueryScroll: function() {\n\t\tvar scroll = {};\n\n\t\tif (this.isDatesRendered) {\n\t\t\t$.extend(scroll, this.queryDateScroll());\n\t\t}\n\n\t\treturn scroll;\n\t},\n\n\n\tapplyScroll: function(scroll) {\n\t\tif (this.isDatesRendered) {\n\t\t\tthis.applyDateScroll(scroll);\n\t\t}\n\t},\n\n\n\tcomputeInitialDateScroll: function() {\n\t\treturn {}; // subclasses must implement\n\t},\n\n\n\tqueryDateScroll: function() {\n\t\treturn {}; // subclasses must implement\n\t},\n\n\n\tapplyDateScroll: function(scroll) {\n\t\t; // subclasses must implement\n\t},\n\n\n\t/* Height Freezing\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tfreezeHeight: function() {\n\t\tthis.calendar.freezeContentHeight();\n\t},\n\n\n\tthawHeight: function() {\n\t\tthis.calendar.thawContentHeight();\n\t},\n\n\n\t// Event High-level Rendering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\texecuteEventsRender: function(events) {\n\t\tthis.renderEvents(events);\n\t\tthis.isEventsRendered = true;\n\n\t\tthis.onEventsRender();\n\t},\n\n\n\texecuteEventsUnrender: function() {\n\t\tthis.onBeforeEventsUnrender();\n\n\t\tif (this.destroyEvents) {\n\t\t\tthis.destroyEvents(); // TODO: deprecate\n\t\t}\n\n\t\tthis.unrenderEvents();\n\t\tthis.isEventsRendered = false;\n\t},\n\n\n\t// Event Rendering Triggers\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Signals that all events have been rendered\n\tonEventsRender: function() {\n\t\tthis.applyScreenState();\n\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tthis.publiclyTrigger('eventAfterRender', seg.event, seg.event, seg.el);\n\t\t});\n\t\tthis.publiclyTrigger('eventAfterAllRender');\n\t},\n\n\n\t// Signals that all event elements are about to be removed\n\tonBeforeEventsUnrender: function() {\n\t\tthis.applyScreenState();\n\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tthis.publiclyTrigger('eventDestroy', seg.event, seg.event, seg.el);\n\t\t});\n\t},\n\n\n\tapplyScreenState: function() {\n\t\tthis.thawHeight();\n\t\tthis.freezeHeight();\n\t\tthis.applyQueuedScroll();\n\t},\n\n\n\t// Event Low-level Rendering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Renders the events onto the view.\n\trenderEvents: function(events) {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Removes event elements from the view.\n\tunrenderEvents: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Event Rendering Utils\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Given an event and the default element used for rendering, returns the element that should actually be used.\n\t// Basically runs events and elements through the eventRender hook.\n\tresolveEventEl: function(event, el) {\n\t\tvar custom = this.publiclyTrigger('eventRender', event, event, el);\n\n\t\tif (custom === false) { // means don't render at all\n\t\t\tel = null;\n\t\t}\n\t\telse if (custom && custom !== true) {\n\t\t\tel = $(custom);\n\t\t}\n\n\t\treturn el;\n\t},\n\n\n\t// Hides all rendered event segments linked to the given event\n\tshowEvent: function(event) {\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tseg.el.css('visibility', '');\n\t\t}, event);\n\t},\n\n\n\t// Shows all rendered event segments linked to the given event\n\thideEvent: function(event) {\n\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\tseg.el.css('visibility', 'hidden');\n\t\t}, event);\n\t},\n\n\n\t// Iterates through event segments that have been rendered (have an el). Goes through all by default.\n\t// If the optional `event` argument is specified, only iterates through segments linked to that event.\n\t// The `this` value of the callback function will be the view.\n\trenderedEventSegEach: function(func, event) {\n\t\tvar segs = this.getEventSegs();\n\t\tvar i;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tif (!event || segs[i].event._id === event._id) {\n\t\t\t\tif (segs[i].el) {\n\t\t\t\t\tfunc.call(this, segs[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Retrieves all the rendered segment objects for the view\n\tgetEventSegs: function() {\n\t\t// subclasses must implement\n\t\treturn [];\n\t},\n\n\n\t/* Event Drag-n-Drop\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes if the given event is allowed to be dragged by the user\n\tisEventDraggable: function(event) {\n\t\treturn this.isEventStartEditable(event);\n\t},\n\n\n\tisEventStartEditable: function(event) {\n\t\treturn firstDefined(\n\t\t\tevent.startEditable,\n\t\t\t(event.source || {}).startEditable,\n\t\t\tthis.opt('eventStartEditable'),\n\t\t\tthis.isEventGenerallyEditable(event)\n\t\t);\n\t},\n\n\n\tisEventGenerallyEditable: function(event) {\n\t\treturn firstDefined(\n\t\t\tevent.editable,\n\t\t\t(event.source || {}).editable,\n\t\t\tthis.opt('editable')\n\t\t);\n\t},\n\n\n\t// Must be called when an event in the view is dropped onto new location.\n\t// `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.\n\treportSegDrop: function(seg, dropLocation, largeUnit, el, ev) {\n\t\tvar calendar = this.calendar;\n\t\tvar mutateResult = calendar.mutateSeg(seg, dropLocation, largeUnit);\n\t\tvar undoFunc = function() {\n\t\t\tmutateResult.undo();\n\t\t\tcalendar.reportEventChange();\n\t\t};\n\n\t\tthis.triggerEventDrop(seg.event, mutateResult.dateDelta, undoFunc, el, ev);\n\t\tcalendar.reportEventChange(); // will rerender events\n\t},\n\n\n\t// Triggers event-drop handlers that have subscribed via the API\n\ttriggerEventDrop: function(event, dateDelta, undoFunc, el, ev) {\n\t\tthis.publiclyTrigger('eventDrop', el[0], event, dateDelta, undoFunc, ev, {}); // {} = jqui dummy\n\t},\n\n\n\t/* External Element Drag-n-Drop\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Must be called when an external element, via jQuery UI, has been dropped onto the calendar.\n\t// `meta` is the parsed data that has been embedded into the dragging event.\n\t// `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.\n\treportExternalDrop: function(meta, dropLocation, el, ev, ui) {\n\t\tvar eventProps = meta.eventProps;\n\t\tvar eventInput;\n\t\tvar event;\n\n\t\t// Try to build an event object and render it. TODO: decouple the two\n\t\tif (eventProps) {\n\t\t\teventInput = $.extend({}, eventProps, dropLocation);\n\t\t\tevent = this.calendar.renderEvent(eventInput, meta.stick)[0]; // renderEvent returns an array\n\t\t}\n\n\t\tthis.triggerExternalDrop(event, dropLocation, el, ev, ui);\n\t},\n\n\n\t// Triggers external-drop handlers that have subscribed via the API\n\ttriggerExternalDrop: function(event, dropLocation, el, ev, ui) {\n\n\t\t// trigger 'drop' regardless of whether element represents an event\n\t\tthis.publiclyTrigger('drop', el[0], dropLocation.start, ev, ui);\n\n\t\tif (event) {\n\t\t\tthis.publiclyTrigger('eventReceive', null, event); // signal an external event landed\n\t\t}\n\t},\n\n\n\t/* Drag-n-Drop Rendering (for both events and external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a event or external-element drag over the given drop zone.\n\t// If an external-element, seg will be `null`.\n\t// Must return elements used for any mock events.\n\trenderDrag: function(dropLocation, seg) {\n\t\t// subclasses must implement\n\t},\n\n\n\t// Unrenders a visual indication of an event or external-element being dragged.\n\tunrenderDrag: function() {\n\t\t// subclasses must implement\n\t},\n\n\n\t/* Event Resizing\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes if the given event is allowed to be resized from its starting edge\n\tisEventResizableFromStart: function(event) {\n\t\treturn this.opt('eventResizableFromStart') && this.isEventResizable(event);\n\t},\n\n\n\t// Computes if the given event is allowed to be resized from its ending edge\n\tisEventResizableFromEnd: function(event) {\n\t\treturn this.isEventResizable(event);\n\t},\n\n\n\t// Computes if the given event is allowed to be resized by the user at all\n\tisEventResizable: function(event) {\n\t\tvar source = event.source || {};\n\n\t\treturn firstDefined(\n\t\t\tevent.durationEditable,\n\t\t\tsource.durationEditable,\n\t\t\tthis.opt('eventDurationEditable'),\n\t\t\tevent.editable,\n\t\t\tsource.editable,\n\t\t\tthis.opt('editable')\n\t\t);\n\t},\n\n\n\t// Must be called when an event in the view has been resized to a new length\n\treportSegResize: function(seg, resizeLocation, largeUnit, el, ev) {\n\t\tvar calendar = this.calendar;\n\t\tvar mutateResult = calendar.mutateSeg(seg, resizeLocation, largeUnit);\n\t\tvar undoFunc = function() {\n\t\t\tmutateResult.undo();\n\t\t\tcalendar.reportEventChange();\n\t\t};\n\n\t\tthis.triggerEventResize(seg.event, mutateResult.durationDelta, undoFunc, el, ev);\n\t\tcalendar.reportEventChange(); // will rerender events\n\t},\n\n\n\t// Triggers event-resize handlers that have subscribed via the API\n\ttriggerEventResize: function(event, durationDelta, undoFunc, el, ev) {\n\t\tthis.publiclyTrigger('eventResize', el[0], event, durationDelta, undoFunc, ev, {}); // {} = jqui dummy\n\t},\n\n\n\t/* Selection (time range)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Selects a date span on the view. `start` and `end` are both Moments.\n\t// `ev` is the native mouse event that begin the interaction.\n\tselect: function(span, ev) {\n\t\tthis.unselect(ev);\n\t\tthis.renderSelection(span);\n\t\tthis.reportSelection(span, ev);\n\t},\n\n\n\t// Renders a visual indication of the selection\n\trenderSelection: function(span) {\n\t\t// subclasses should implement\n\t},\n\n\n\t// Called when a new selection is made. Updates internal state and triggers handlers.\n\treportSelection: function(span, ev) {\n\t\tthis.isSelected = true;\n\t\tthis.triggerSelect(span, ev);\n\t},\n\n\n\t// Triggers handlers to 'select'\n\ttriggerSelect: function(span, ev) {\n\t\tthis.publiclyTrigger(\n\t\t\t'select',\n\t\t\tnull,\n\t\t\tthis.calendar.applyTimezone(span.start), // convert to calendar's tz for external API\n\t\t\tthis.calendar.applyTimezone(span.end), // \"\n\t\t\tev\n\t\t);\n\t},\n\n\n\t// Undoes a selection. updates in the internal state and triggers handlers.\n\t// `ev` is the native mouse event that began the interaction.\n\tunselect: function(ev) {\n\t\tif (this.isSelected) {\n\t\t\tthis.isSelected = false;\n\t\t\tif (this.destroySelection) {\n\t\t\t\tthis.destroySelection(); // TODO: deprecate\n\t\t\t}\n\t\t\tthis.unrenderSelection();\n\t\t\tthis.publiclyTrigger('unselect', null, ev);\n\t\t}\n\t},\n\n\n\t// Unrenders a visual indication of selection\n\tunrenderSelection: function() {\n\t\t// subclasses should implement\n\t},\n\n\n\t/* Event Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tselectEvent: function(event) {\n\t\tif (!this.selectedEvent || this.selectedEvent !== event) {\n\t\t\tthis.unselectEvent();\n\t\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\t\tseg.el.addClass('fc-selected');\n\t\t\t}, event);\n\t\t\tthis.selectedEvent = event;\n\t\t}\n\t},\n\n\n\tunselectEvent: function() {\n\t\tif (this.selectedEvent) {\n\t\t\tthis.renderedEventSegEach(function(seg) {\n\t\t\t\tseg.el.removeClass('fc-selected');\n\t\t\t}, this.selectedEvent);\n\t\t\tthis.selectedEvent = null;\n\t\t}\n\t},\n\n\n\tisEventSelected: function(event) {\n\t\t// event references might change on refetchEvents(), while selectedEvent doesn't,\n\t\t// so compare IDs\n\t\treturn this.selectedEvent && this.selectedEvent._id === event._id;\n\t},\n\n\n\t/* Mouse / Touch Unselecting (time range & event unselection)\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// TODO: move consistently to down/start or up/end?\n\t// TODO: don't kill previous selection if touch scrolling\n\n\n\thandleDocumentMousedown: function(ev) {\n\t\tif (isPrimaryMouseButton(ev)) {\n\t\t\tthis.processUnselect(ev);\n\t\t}\n\t},\n\n\n\tprocessUnselect: function(ev) {\n\t\tthis.processRangeUnselect(ev);\n\t\tthis.processEventUnselect(ev);\n\t},\n\n\n\tprocessRangeUnselect: function(ev) {\n\t\tvar ignore;\n\n\t\t// is there a time-range selection?\n\t\tif (this.isSelected && this.opt('unselectAuto')) {\n\t\t\t// only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element\n\t\t\tignore = this.opt('unselectCancel');\n\t\t\tif (!ignore || !$(ev.target).closest(ignore).length) {\n\t\t\t\tthis.unselect(ev);\n\t\t\t}\n\t\t}\n\t},\n\n\n\tprocessEventUnselect: function(ev) {\n\t\tif (this.selectedEvent) {\n\t\t\tif (!$(ev.target).closest('.fc-selected').length) {\n\t\t\t\tthis.unselectEvent();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/* Day Click\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Triggers handlers to 'dayClick'\n\t// Span has start/end of the clicked area. Only the start is useful.\n\ttriggerDayClick: function(span, dayEl, ev) {\n\t\tthis.publiclyTrigger(\n\t\t\t'dayClick',\n\t\t\tdayEl,\n\t\t\tthis.calendar.applyTimezone(span.start), // convert to calendar's timezone for external API\n\t\t\tev\n\t\t);\n\t},\n\n\n\t/* Date Utils\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Returns the date range of the full days the given range visually appears to occupy.\n\t// Returns a new range object.\n\tcomputeDayRange: function(range) {\n\t\tvar startDay = range.start.clone().stripTime(); // the beginning of the day the range starts\n\t\tvar end = range.end;\n\t\tvar endDay = null;\n\t\tvar endTimeMS;\n\n\t\tif (end) {\n\t\t\tendDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends\n\t\t\tendTimeMS = +end.time(); // # of milliseconds into `endDay`\n\n\t\t\t// If the end time is actually inclusively part of the next day and is equal to or\n\t\t\t// beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\n\t\t\t// Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\n\t\t\tif (endTimeMS && endTimeMS >= this.nextDayThreshold) {\n\t\t\t\tendDay.add(1, 'days');\n\t\t\t}\n\t\t}\n\n\t\t// If no end was specified, or if it is within `startDay` but not past nextDayThreshold,\n\t\t// assign the default duration of one day.\n\t\tif (!end || endDay <= startDay) {\n\t\t\tendDay = startDay.clone().add(1, 'days');\n\t\t}\n\n\t\treturn { start: startDay, end: endDay };\n\t},\n\n\n\t// Does the given event visually appear to occupy more than one day?\n\tisMultiDayEvent: function(event) {\n\t\tvar range = this.computeDayRange(event); // event is range-ish\n\n\t\treturn range.end.diff(range.start, 'days') > 1;\n\t}\n\n});\n\n\nView.watch('displayingDates', [ 'dateProfile' ], function(deps) {\n\tthis.requestDateRender(deps.dateProfile);\n}, function() {\n\tthis.requestDateUnrender();\n});\n\n\nView.watch('initialEvents', [ 'dateProfile' ], function(deps) {\n\treturn this.fetchInitialEvents(deps.dateProfile);\n});\n\n\nView.watch('bindingEvents', [ 'initialEvents' ], function(deps) {\n\tthis.setEvents(deps.initialEvents);\n\tthis.bindEventChanges();\n}, function() {\n\tthis.unbindEventChanges();\n\tthis.unsetEvents();\n});\n\n\nView.watch('displayingEvents', [ 'displayingDates', 'hasEvents' ], function() {\n\tthis.requestEventsRender(this.get('currentEvents')); // if there were event mutations after initialEvents\n}, function() {\n\tthis.requestEventsUnrender();\n});\n\n;;\n\nView.mixin({\n\n\t// range the view is formally responsible for.\n\t// for example, a month view might have 1st-31st, excluding padded dates\n\tcurrentRange: null,\n\tcurrentRangeUnit: null, // name of largest unit being displayed, like \"month\" or \"week\"\n\n\t// date range with a rendered skeleton\n\t// includes not-active days that need some sort of DOM\n\trenderRange: null,\n\n\t// dates that display events and accept drag-n-drop\n\tactiveRange: null,\n\n\t// constraint for where prev/next operations can go and where events can be dragged/resized to.\n\t// an object with optional start and end properties.\n\tvalidRange: null,\n\n\t// how far the current date will move for a prev/next operation\n\tdateIncrement: null,\n\n\tminTime: null, // Duration object that denotes the first visible time of any given day\n\tmaxTime: null, // Duration object that denotes the exclusive visible end time of any given day\n\tusesMinMaxTime: false, // whether minTime/maxTime will affect the activeRange. Views must opt-in.\n\n\t// DEPRECATED\n\tstart: null, // use activeRange.start\n\tend: null, // use activeRange.end\n\tintervalStart: null, // use currentRange.start\n\tintervalEnd: null, // use currentRange.end\n\n\n\t/* Date Range Computation\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tsetDateProfileForRendering: function(dateProfile) {\n\t\tthis.currentRange = dateProfile.currentRange;\n\t\tthis.currentRangeUnit = dateProfile.currentRangeUnit;\n\t\tthis.renderRange = dateProfile.renderRange;\n\t\tthis.activeRange = dateProfile.activeRange;\n\t\tthis.validRange = dateProfile.validRange;\n\t\tthis.dateIncrement = dateProfile.dateIncrement;\n\t\tthis.minTime = dateProfile.minTime;\n\t\tthis.maxTime = dateProfile.maxTime;\n\n\t\t// DEPRECATED, but we need to keep it updated\n\t\tthis.start = dateProfile.activeRange.start;\n\t\tthis.end = dateProfile.activeRange.end;\n\t\tthis.intervalStart = dateProfile.currentRange.start;\n\t\tthis.intervalEnd = dateProfile.currentRange.end;\n\t},\n\n\n\t// Builds a structure with info about what the dates/ranges will be for the \"prev\" view.\n\tbuildPrevDateProfile: function(date) {\n\t\tvar prevDate = date.clone().startOf(this.currentRangeUnit).subtract(this.dateIncrement);\n\n\t\treturn this.buildDateProfile(prevDate, -1);\n\t},\n\n\n\t// Builds a structure with info about what the dates/ranges will be for the \"next\" view.\n\tbuildNextDateProfile: function(date) {\n\t\tvar nextDate = date.clone().startOf(this.currentRangeUnit).add(this.dateIncrement);\n\n\t\treturn this.buildDateProfile(nextDate, 1);\n\t},\n\n\n\t// Builds a structure holding dates/ranges for rendering around the given date.\n\t// Optional direction param indicates whether the date is being incremented/decremented\n\t// from its previous value. decremented = -1, incremented = 1 (default).\n\tbuildDateProfile: function(date, direction, forceToValid) {\n\t\tvar validRange = this.buildValidRange();\n\t\tvar minTime = null;\n\t\tvar maxTime = null;\n\t\tvar currentInfo;\n\t\tvar renderRange;\n\t\tvar activeRange;\n\t\tvar isValid;\n\n\t\tif (forceToValid) {\n\t\t\tdate = constrainDate(date, validRange);\n\t\t}\n\n\t\tcurrentInfo = this.buildCurrentRangeInfo(date, direction);\n\t\trenderRange = this.buildRenderRange(currentInfo.range, currentInfo.unit);\n\t\tactiveRange = cloneRange(renderRange);\n\n\t\tif (!this.opt('showNonCurrentDates')) {\n\t\t\tactiveRange = constrainRange(activeRange, currentInfo.range);\n\t\t}\n\n\t\tminTime = moment.duration(this.opt('minTime'));\n\t\tmaxTime = moment.duration(this.opt('maxTime'));\n\t\tthis.adjustActiveRange(activeRange, minTime, maxTime);\n\n\t\tactiveRange = constrainRange(activeRange, validRange);\n\t\tdate = constrainDate(date, activeRange);\n\n\t\t// it's invalid if the originally requested date is not contained,\n\t\t// or if the range is completely outside of the valid range.\n\t\tisValid = doRangesIntersect(currentInfo.range, validRange);\n\n\t\treturn {\n\t\t\tvalidRange: validRange,\n\t\t\tcurrentRange: currentInfo.range,\n\t\t\tcurrentRangeUnit: currentInfo.unit,\n\t\t\tactiveRange: activeRange,\n\t\t\trenderRange: renderRange,\n\t\t\tminTime: minTime,\n\t\t\tmaxTime: maxTime,\n\t\t\tisValid: isValid,\n\t\t\tdate: date,\n\t\t\tdateIncrement: this.buildDateIncrement(currentInfo.duration)\n\t\t\t\t// pass a fallback (might be null) ^\n\t\t};\n\t},\n\n\n\t// Builds an object with optional start/end properties.\n\t// Indicates the minimum/maximum dates to display.\n\tbuildValidRange: function() {\n\t\treturn this.getRangeOption('validRange', this.calendar.getNow()) || {};\n\t},\n\n\n\t// Builds a structure with info about the \"current\" range, the range that is\n\t// highlighted as being the current month for example.\n\t// See buildDateProfile for a description of `direction`.\n\t// Guaranteed to have `range` and `unit` properties. `duration` is optional.\n\tbuildCurrentRangeInfo: function(date, direction) {\n\t\tvar duration = null;\n\t\tvar unit = null;\n\t\tvar range = null;\n\t\tvar dayCount;\n\n\t\tif (this.viewSpec.duration) {\n\t\t\tduration = this.viewSpec.duration;\n\t\t\tunit = this.viewSpec.durationUnit;\n\t\t\trange = this.buildRangeFromDuration(date, direction, duration, unit);\n\t\t}\n\t\telse if ((dayCount = this.opt('dayCount'))) {\n\t\t\tunit = 'day';\n\t\t\trange = this.buildRangeFromDayCount(date, direction, dayCount);\n\t\t}\n\t\telse if ((range = this.buildCustomVisibleRange(date))) {\n\t\t\tunit = computeGreatestUnit(range.start, range.end);\n\t\t}\n\t\telse {\n\t\t\tduration = this.getFallbackDuration();\n\t\t\tunit = computeGreatestUnit(duration);\n\t\t\trange = this.buildRangeFromDuration(date, direction, duration, unit);\n\t\t}\n\n\t\tthis.normalizeCurrentRange(range, unit); // modifies in-place\n\n\t\treturn { duration: duration, unit: unit, range: range };\n\t},\n\n\n\tgetFallbackDuration: function() {\n\t\treturn moment.duration({ days: 1 });\n\t},\n\n\n\t// If the range has day units or larger, remove times. Otherwise, ensure times.\n\tnormalizeCurrentRange: function(range, unit) {\n\n\t\tif (/^(year|month|week|day)$/.test(unit)) { // whole-days?\n\t\t\trange.start.stripTime();\n\t\t\trange.end.stripTime();\n\t\t}\n\t\telse { // needs to have a time?\n\t\t\tif (!range.start.hasTime()) {\n\t\t\t\trange.start.time(0); // give 00:00 time\n\t\t\t}\n\t\t\tif (!range.end.hasTime()) {\n\t\t\t\trange.end.time(0); // give 00:00 time\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Mutates the given activeRange to have time values (un-ambiguate)\n\t// if the minTime or maxTime causes the range to expand.\n\t// TODO: eventually activeRange should *always* have times.\n\tadjustActiveRange: function(range, minTime, maxTime) {\n\t\tvar hasSpecialTimes = false;\n\n\t\tif (this.usesMinMaxTime) {\n\n\t\t\tif (minTime < 0) {\n\t\t\t\trange.start.time(0).add(minTime);\n\t\t\t\thasSpecialTimes = true;\n\t\t\t}\n\n\t\t\tif (maxTime > 24 * 60 * 60 * 1000) { // beyond 24 hours?\n\t\t\t\trange.end.time(maxTime - (24 * 60 * 60 * 1000));\n\t\t\t\thasSpecialTimes = true;\n\t\t\t}\n\n\t\t\tif (hasSpecialTimes) {\n\t\t\t\tif (!range.start.hasTime()) {\n\t\t\t\t\trange.start.time(0);\n\t\t\t\t}\n\t\t\t\tif (!range.end.hasTime()) {\n\t\t\t\t\trange.end.time(0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Builds the \"current\" range when it is specified as an explicit duration.\n\t// `unit` is the already-computed computeGreatestUnit value of duration.\n\tbuildRangeFromDuration: function(date, direction, duration, unit) {\n\t\tvar alignment = this.opt('dateAlignment');\n\t\tvar start = date.clone();\n\t\tvar end;\n\t\tvar dateIncrementInput;\n\t\tvar dateIncrementDuration;\n\n\t\t// if the view displays a single day or smaller\n\t\tif (duration.as('days') <= 1) {\n\t\t\tif (this.isHiddenDay(start)) {\n\t\t\t\tstart = this.skipHiddenDays(start, direction);\n\t\t\t\tstart.startOf('day');\n\t\t\t}\n\t\t}\n\n\t\t// compute what the alignment should be\n\t\tif (!alignment) {\n\t\t\tdateIncrementInput = this.opt('dateIncrement');\n\n\t\t\tif (dateIncrementInput) {\n\t\t\t\tdateIncrementDuration = moment.duration(dateIncrementInput);\n\n\t\t\t\t// use the smaller of the two units\n\t\t\t\tif (dateIncrementDuration < duration) {\n\t\t\t\t\talignment = computeDurationGreatestUnit(dateIncrementDuration, dateIncrementInput);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\talignment = unit;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\talignment = unit;\n\t\t\t}\n\t\t}\n\n\t\tstart.startOf(alignment);\n\t\tend = start.clone().add(duration);\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\t// Builds the \"current\" range when a dayCount is specified.\n\tbuildRangeFromDayCount: function(date, direction, dayCount) {\n\t\tvar customAlignment = this.opt('dateAlignment');\n\t\tvar runningCount = 0;\n\t\tvar start = date.clone();\n\t\tvar end;\n\n\t\tif (customAlignment) {\n\t\t\tstart.startOf(customAlignment);\n\t\t}\n\n\t\tstart.startOf('day');\n\t\tstart = this.skipHiddenDays(start, direction);\n\n\t\tend = start.clone();\n\t\tdo {\n\t\t\tend.add(1, 'day');\n\t\t\tif (!this.isHiddenDay(end)) {\n\t\t\t\trunningCount++;\n\t\t\t}\n\t\t} while (runningCount < dayCount);\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\t// Builds a normalized range object for the \"visible\" range,\n\t// which is a way to define the currentRange and activeRange at the same time.\n\tbuildCustomVisibleRange: function(date) {\n\t\tvar visibleRange = this.getRangeOption(\n\t\t\t'visibleRange',\n\t\t\tthis.calendar.moment(date) // correct zone. also generates new obj that avoids mutations\n\t\t);\n\n\t\tif (visibleRange && (!visibleRange.start || !visibleRange.end)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn visibleRange;\n\t},\n\n\n\t// Computes the range that will represent the element/cells for *rendering*,\n\t// but which may have voided days/times.\n\tbuildRenderRange: function(currentRange, currentRangeUnit) {\n\t\t// cut off days in the currentRange that are hidden\n\t\treturn this.trimHiddenDays(currentRange);\n\t},\n\n\n\t// Compute the duration value that should be added/substracted to the current date\n\t// when a prev/next operation happens.\n\tbuildDateIncrement: function(fallback) {\n\t\tvar dateIncrementInput = this.opt('dateIncrement');\n\t\tvar customAlignment;\n\n\t\tif (dateIncrementInput) {\n\t\t\treturn moment.duration(dateIncrementInput);\n\t\t}\n\t\telse if ((customAlignment = this.opt('dateAlignment'))) {\n\t\t\treturn moment.duration(1, customAlignment);\n\t\t}\n\t\telse if (fallback) {\n\t\t\treturn fallback;\n\t\t}\n\t\telse {\n\t\t\treturn moment.duration({ days: 1 });\n\t\t}\n\t},\n\n\n\t// Remove days from the beginning and end of the range that are computed as hidden.\n\ttrimHiddenDays: function(inputRange) {\n\t\treturn {\n\t\t\tstart: this.skipHiddenDays(inputRange.start),\n\t\t\tend: this.skipHiddenDays(inputRange.end, -1, true) // exclusively move backwards\n\t\t};\n\t},\n\n\n\t// Compute the number of the give units in the \"current\" range.\n\t// Will return a floating-point number. Won't round.\n\tcurrentRangeAs: function(unit) {\n\t\tvar currentRange = this.currentRange;\n\t\treturn currentRange.end.diff(currentRange.start, unit, true);\n\t},\n\n\n\t// Arguments after name will be forwarded to a hypothetical function value\n\t// WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.\n\t// Always clone your objects if you fear mutation.\n\tgetRangeOption: function(name) {\n\t\tvar val = this.opt(name);\n\n\t\tif (typeof val === 'function') {\n\t\t\tval = val.apply(\n\t\t\t\tnull,\n\t\t\t\tArray.prototype.slice.call(arguments, 1)\n\t\t\t);\n\t\t}\n\n\t\tif (val) {\n\t\t\treturn this.calendar.parseRange(val);\n\t\t}\n\t},\n\n\n\t/* Hidden Days\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Initializes internal variables related to calculating hidden days-of-week\n\tinitHiddenDays: function() {\n\t\tvar hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden\n\t\tvar isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\n\t\tvar dayCnt = 0;\n\t\tvar i;\n\n\t\tif (this.opt('weekends') === false) {\n\t\t\thiddenDays.push(0, 6); // 0=sunday, 6=saturday\n\t\t}\n\n\t\tfor (i = 0; i < 7; i++) {\n\t\t\tif (\n\t\t\t\t!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)\n\t\t\t) {\n\t\t\t\tdayCnt++;\n\t\t\t}\n\t\t}\n\n\t\tif (!dayCnt) {\n\t\t\tthrow 'invalid hiddenDays'; // all days were hidden? bad.\n\t\t}\n\n\t\tthis.isHiddenDayHash = isHiddenDayHash;\n\t},\n\n\n\t// Is the current day hidden?\n\t// `day` is a day-of-week index (0-6), or a Moment\n\tisHiddenDay: function(day) {\n\t\tif (moment.isMoment(day)) {\n\t\t\tday = day.day();\n\t\t}\n\t\treturn this.isHiddenDayHash[day];\n\t},\n\n\n\t// Incrementing the current day until it is no longer a hidden day, returning a copy.\n\t// DOES NOT CONSIDER validRange!\n\t// If the initial value of `date` is not a hidden day, don't do anything.\n\t// Pass `isExclusive` as `true` if you are dealing with an end date.\n\t// `inc` defaults to `1` (increment one day forward each time)\n\tskipHiddenDays: function(date, inc, isExclusive) {\n\t\tvar out = date.clone();\n\t\tinc = inc || 1;\n\t\twhile (\n\t\t\tthis.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]\n\t\t) {\n\t\t\tout.add(inc, 'days');\n\t\t}\n\t\treturn out;\n\t}\n\n});\n\n;;\n\n/*\nEmbodies a div that has potential scrollbars\n*/\nvar Scroller = FC.Scroller = Class.extend({\n\n\tel: null, // the guaranteed outer element\n\tscrollEl: null, // the element with the scrollbars\n\toverflowX: null,\n\toverflowY: null,\n\n\n\tconstructor: function(options) {\n\t\toptions = options || {};\n\t\tthis.overflowX = options.overflowX || options.overflow || 'auto';\n\t\tthis.overflowY = options.overflowY || options.overflow || 'auto';\n\t},\n\n\n\trender: function() {\n\t\tthis.el = this.renderEl();\n\t\tthis.applyOverflow();\n\t},\n\n\n\trenderEl: function() {\n\t\treturn (this.scrollEl = $('
'));\n\t},\n\n\n\t// sets to natural height, unlocks overflow\n\tclear: function() {\n\t\tthis.setHeight('auto');\n\t\tthis.applyOverflow();\n\t},\n\n\n\tdestroy: function() {\n\t\tthis.el.remove();\n\t},\n\n\n\t// Overflow\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tapplyOverflow: function() {\n\t\tthis.scrollEl.css({\n\t\t\t'overflow-x': this.overflowX,\n\t\t\t'overflow-y': this.overflowY\n\t\t});\n\t},\n\n\n\t// Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.\n\t// Useful for preserving scrollbar widths regardless of future resizes.\n\t// Can pass in scrollbarWidths for optimization.\n\tlockOverflow: function(scrollbarWidths) {\n\t\tvar overflowX = this.overflowX;\n\t\tvar overflowY = this.overflowY;\n\n\t\tscrollbarWidths = scrollbarWidths || this.getScrollbarWidths();\n\n\t\tif (overflowX === 'auto') {\n\t\t\toverflowX = (\n\t\t\t\t\tscrollbarWidths.top || scrollbarWidths.bottom || // horizontal scrollbars?\n\t\t\t\t\t// OR scrolling pane with massless scrollbars?\n\t\t\t\t\tthis.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth\n\t\t\t\t\t\t// subtract 1 because of IE off-by-one issue\n\t\t\t\t) ? 'scroll' : 'hidden';\n\t\t}\n\n\t\tif (overflowY === 'auto') {\n\t\t\toverflowY = (\n\t\t\t\t\tscrollbarWidths.left || scrollbarWidths.right || // vertical scrollbars?\n\t\t\t\t\t// OR scrolling pane with massless scrollbars?\n\t\t\t\t\tthis.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight\n\t\t\t\t\t\t// subtract 1 because of IE off-by-one issue\n\t\t\t\t) ? 'scroll' : 'hidden';\n\t\t}\n\n\t\tthis.scrollEl.css({ 'overflow-x': overflowX, 'overflow-y': overflowY });\n\t},\n\n\n\t// Getters / Setters\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tsetHeight: function(height) {\n\t\tthis.scrollEl.height(height);\n\t},\n\n\n\tgetScrollTop: function() {\n\t\treturn this.scrollEl.scrollTop();\n\t},\n\n\n\tsetScrollTop: function(top) {\n\t\tthis.scrollEl.scrollTop(top);\n\t},\n\n\n\tgetClientWidth: function() {\n\t\treturn this.scrollEl[0].clientWidth;\n\t},\n\n\n\tgetClientHeight: function() {\n\t\treturn this.scrollEl[0].clientHeight;\n\t},\n\n\n\tgetScrollbarWidths: function() {\n\t\treturn getScrollbarWidths(this.scrollEl);\n\t}\n\n});\n\n;;\nfunction Iterator(items) {\n this.items = items || [];\n}\n\n\n/* Calls a method on every item passing the arguments through */\nIterator.prototype.proxyCall = function(methodName) {\n var args = Array.prototype.slice.call(arguments, 1);\n var results = [];\n\n this.items.forEach(function(item) {\n results.push(item[methodName].apply(item, args));\n });\n\n return results;\n};\n\n;;\n\n/* Toolbar with buttons and title\n----------------------------------------------------------------------------------------------------------------------*/\n\nfunction Toolbar(calendar, toolbarOptions) {\n\tvar t = this;\n\n\t// exports\n\tt.setToolbarOptions = setToolbarOptions;\n\tt.render = render;\n\tt.removeElement = removeElement;\n\tt.updateTitle = updateTitle;\n\tt.activateButton = activateButton;\n\tt.deactivateButton = deactivateButton;\n\tt.disableButton = disableButton;\n\tt.enableButton = enableButton;\n\tt.getViewsWithButtons = getViewsWithButtons;\n\tt.el = null; // mirrors local `el`\n\n\t// locals\n\tvar el;\n\tvar viewsWithButtons = [];\n\tvar tm;\n\n\t// method to update toolbar-specific options, not calendar-wide options\n\tfunction setToolbarOptions(newToolbarOptions) {\n\t\ttoolbarOptions = newToolbarOptions;\n\t}\n\n\t// can be called repeatedly and will rerender\n\tfunction render() {\n\t\tvar sections = toolbarOptions.layout;\n\n\t\ttm = calendar.opt('theme') ? 'ui' : 'fc';\n\n\t\tif (sections) {\n\t\t\tif (!el) {\n\t\t\t\tel = this.el = $(\"
\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\tel.empty();\n\t\t\t}\n\t\t\tel.append(renderSection('left'))\n\t\t\t\t.append(renderSection('right'))\n\t\t\t\t.append(renderSection('center'))\n\t\t\t\t.append('
');\n\t\t}\n\t\telse {\n\t\t\tremoveElement();\n\t\t}\n\t}\n\n\n\tfunction removeElement() {\n\t\tif (el) {\n\t\t\tel.remove();\n\t\t\tel = t.el = null;\n\t\t}\n\t}\n\n\n\tfunction renderSection(position) {\n\t\tvar sectionEl = $('
');\n\t\tvar buttonStr = toolbarOptions.layout[position];\n\t\tvar calendarCustomButtons = calendar.opt('customButtons') || {};\n\t\tvar calendarButtonText = calendar.opt('buttonText') || {};\n\n\t\tif (buttonStr) {\n\t\t\t$.each(buttonStr.split(' '), function(i) {\n\t\t\t\tvar groupChildren = $();\n\t\t\t\tvar isOnlyButtons = true;\n\t\t\t\tvar groupEl;\n\n\t\t\t\t$.each(this.split(','), function(j, buttonName) {\n\t\t\t\t\tvar customButtonProps;\n\t\t\t\t\tvar viewSpec;\n\t\t\t\t\tvar buttonClick;\n\t\t\t\t\tvar overrideText; // text explicitly set by calendar's constructor options. overcomes icons\n\t\t\t\t\tvar defaultText;\n\t\t\t\t\tvar themeIcon;\n\t\t\t\t\tvar normalIcon;\n\t\t\t\t\tvar innerHtml;\n\t\t\t\t\tvar classes;\n\t\t\t\t\tvar button; // the element\n\n\t\t\t\t\tif (buttonName == 'title') {\n\t\t\t\t\t\tgroupChildren = groupChildren.add($('

 

')); // we always want it to take up height\n\t\t\t\t\t\tisOnlyButtons = false;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif ((customButtonProps = calendarCustomButtons[buttonName])) {\n\t\t\t\t\t\t\tbuttonClick = function(ev) {\n\t\t\t\t\t\t\t\tif (customButtonProps.click) {\n\t\t\t\t\t\t\t\t\tcustomButtonProps.click.call(button[0], ev);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\toverrideText = ''; // icons will override text\n\t\t\t\t\t\t\tdefaultText = customButtonProps.text;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ((viewSpec = calendar.getViewSpec(buttonName))) {\n\t\t\t\t\t\t\tbuttonClick = function() {\n\t\t\t\t\t\t\t\tcalendar.changeView(buttonName);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tviewsWithButtons.push(buttonName);\n\t\t\t\t\t\t\toverrideText = viewSpec.buttonTextOverride;\n\t\t\t\t\t\t\tdefaultText = viewSpec.buttonTextDefault;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (calendar[buttonName]) { // a calendar method\n\t\t\t\t\t\t\tbuttonClick = function() {\n\t\t\t\t\t\t\t\tcalendar[buttonName]();\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\toverrideText = (calendar.overrides.buttonText || {})[buttonName];\n\t\t\t\t\t\t\tdefaultText = calendarButtonText[buttonName]; // everything else is considered default\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (buttonClick) {\n\n\t\t\t\t\t\t\tthemeIcon =\n\t\t\t\t\t\t\t\tcustomButtonProps ?\n\t\t\t\t\t\t\t\t\tcustomButtonProps.themeIcon :\n\t\t\t\t\t\t\t\t\tcalendar.opt('themeButtonIcons')[buttonName];\n\n\t\t\t\t\t\t\tnormalIcon =\n\t\t\t\t\t\t\t\tcustomButtonProps ?\n\t\t\t\t\t\t\t\t\tcustomButtonProps.icon :\n\t\t\t\t\t\t\t\t\tcalendar.opt('buttonIcons')[buttonName];\n\n\t\t\t\t\t\t\tif (overrideText) {\n\t\t\t\t\t\t\t\tinnerHtml = htmlEscape(overrideText);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (themeIcon && calendar.opt('theme')) {\n\t\t\t\t\t\t\t\tinnerHtml = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (normalIcon && !calendar.opt('theme')) {\n\t\t\t\t\t\t\t\tinnerHtml = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tinnerHtml = htmlEscape(defaultText);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tclasses = [\n\t\t\t\t\t\t\t\t'fc-' + buttonName + '-button',\n\t\t\t\t\t\t\t\ttm + '-button',\n\t\t\t\t\t\t\t\ttm + '-state-default'\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tbutton = $( // type=\"button\" so that it doesn't submit a form\n\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.click(function(ev) {\n\t\t\t\t\t\t\t\t\t// don't process clicks for disabled buttons\n\t\t\t\t\t\t\t\t\tif (!button.hasClass(tm + '-state-disabled')) {\n\n\t\t\t\t\t\t\t\t\t\tbuttonClick(ev);\n\n\t\t\t\t\t\t\t\t\t\t// after the click action, if the button becomes the \"active\" tab, or disabled,\n\t\t\t\t\t\t\t\t\t\t// it should never have a hover class, so remove it now.\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tbutton.hasClass(tm + '-state-active') ||\n\t\t\t\t\t\t\t\t\t\t\tbutton.hasClass(tm + '-state-disabled')\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tbutton.removeClass(tm + '-state-hover');\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.mousedown(function() {\n\t\t\t\t\t\t\t\t\t// the *down* effect (mouse pressed in).\n\t\t\t\t\t\t\t\t\t// only on buttons that are not the \"active\" tab, or disabled\n\t\t\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-active')\n\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-disabled')\n\t\t\t\t\t\t\t\t\t\t.addClass(tm + '-state-down');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.mouseup(function() {\n\t\t\t\t\t\t\t\t\t// undo the *down* effect\n\t\t\t\t\t\t\t\t\tbutton.removeClass(tm + '-state-down');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.hover(\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\t// the *hover* effect.\n\t\t\t\t\t\t\t\t\t\t// only on buttons that are not the \"active\" tab, or disabled\n\t\t\t\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-active')\n\t\t\t\t\t\t\t\t\t\t\t.not('.' + tm + '-state-disabled')\n\t\t\t\t\t\t\t\t\t\t\t.addClass(tm + '-state-hover');\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\t// undo the *hover* effect\n\t\t\t\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t\t\t\t.removeClass(tm + '-state-hover')\n\t\t\t\t\t\t\t\t\t\t\t.removeClass(tm + '-state-down'); // if mouseleave happens before mouseup\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tgroupChildren = groupChildren.add(button);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (isOnlyButtons) {\n\t\t\t\t\tgroupChildren\n\t\t\t\t\t\t.first().addClass(tm + '-corner-left').end()\n\t\t\t\t\t\t.last().addClass(tm + '-corner-right').end();\n\t\t\t\t}\n\n\t\t\t\tif (groupChildren.length > 1) {\n\t\t\t\t\tgroupEl = $('
');\n\t\t\t\t\tif (isOnlyButtons) {\n\t\t\t\t\t\tgroupEl.addClass('fc-button-group');\n\t\t\t\t\t}\n\t\t\t\t\tgroupEl.append(groupChildren);\n\t\t\t\t\tsectionEl.append(groupEl);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsectionEl.append(groupChildren); // 1 or 0 children\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn sectionEl;\n\t}\n\n\n\tfunction updateTitle(text) {\n\t\tif (el) {\n\t\t\tel.find('h2').text(text);\n\t\t}\n\t}\n\n\n\tfunction activateButton(buttonName) {\n\t\tif (el) {\n\t\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t\t.addClass(tm + '-state-active');\n\t\t}\n\t}\n\n\n\tfunction deactivateButton(buttonName) {\n\t\tif (el) {\n\t\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t\t.removeClass(tm + '-state-active');\n\t\t}\n\t}\n\n\n\tfunction disableButton(buttonName) {\n\t\tif (el) {\n\t\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t\t.prop('disabled', true)\n\t\t\t\t.addClass(tm + '-state-disabled');\n\t\t}\n\t}\n\n\n\tfunction enableButton(buttonName) {\n\t\tif (el) {\n\t\t\tel.find('.fc-' + buttonName + '-button')\n\t\t\t\t.prop('disabled', false)\n\t\t\t\t.removeClass(tm + '-state-disabled');\n\t\t}\n\t}\n\n\n\tfunction getViewsWithButtons() {\n\t\treturn viewsWithButtons;\n\t}\n\n}\n\n;;\n\nvar Calendar = FC.Calendar = Class.extend(EmitterMixin, {\n\n\tview: null, // current View object\n\tviewsByType: null, // holds all instantiated view instances, current or not\n\tcurrentDate: null, // unzoned moment. private (public API should use getDate instead)\n\tloadingLevel: 0, // number of simultaneous loading tasks\n\n\n\tconstructor: function(el, overrides) {\n\n\t\t// declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.\n\t\t// unneeded() is called in destroy.\n\t\tGlobalEmitter.needed();\n\n\t\tthis.el = el;\n\t\tthis.viewsByType = {};\n\t\tthis.viewSpecCache = {};\n\n\t\tthis.initOptionsInternals(overrides);\n\t\tthis.initMomentInternals(); // needs to happen after options hash initialized\n\t\tthis.initCurrentDate();\n\n\t\tEventManager.call(this); // needs options immediately\n\t\tthis.initialize();\n\t},\n\n\n\t// Subclasses can override this for initialization logic after the constructor has been called\n\tinitialize: function() {\n\t},\n\n\n\t// Public API\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tgetCalendar: function() {\n\t\treturn this;\n\t},\n\n\n\tgetView: function() {\n\t\treturn this.view;\n\t},\n\n\n\tpubliclyTrigger: function(name, thisObj) {\n\t\tvar args = Array.prototype.slice.call(arguments, 2);\n\t\tvar optHandler = this.opt(name);\n\n\t\tthisObj = thisObj || this.el[0];\n\t\tthis.triggerWith(name, thisObj, args); // Emitter's method\n\n\t\tif (optHandler) {\n\t\t\treturn optHandler.apply(thisObj, args);\n\t\t}\n\t},\n\n\n\t// View\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Given a view name for a custom view or a standard view, creates a ready-to-go View object\n\tinstantiateView: function(viewType) {\n\t\tvar spec = this.getViewSpec(viewType);\n\n\t\treturn new spec['class'](this, spec);\n\t},\n\n\n\t// Returns a boolean about whether the view is okay to instantiate at some point\n\tisValidViewType: function(viewType) {\n\t\treturn Boolean(this.getViewSpec(viewType));\n\t},\n\n\n\tchangeView: function(viewName, dateOrRange) {\n\n\t\tif (dateOrRange) {\n\n\t\t\tif (dateOrRange.start && dateOrRange.end) { // a range\n\t\t\t\tthis.recordOptionOverrides({ // will not rerender\n\t\t\t\t\tvisibleRange: dateOrRange\n\t\t\t\t});\n\t\t\t}\n\t\t\telse { // a date\n\t\t\t\tthis.currentDate = this.moment(dateOrRange).stripZone(); // just like gotoDate\n\t\t\t}\n\t\t}\n\n\t\tthis.renderView(viewName);\n\t},\n\n\n\t// Forces navigation to a view for the given date.\n\t// `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\n\tzoomTo: function(newDate, viewType) {\n\t\tvar spec;\n\n\t\tviewType = viewType || 'day'; // day is default zoom\n\t\tspec = this.getViewSpec(viewType) || this.getUnitViewSpec(viewType);\n\n\t\tthis.currentDate = newDate.clone();\n\t\tthis.renderView(spec ? spec.type : null);\n\t},\n\n\n\t// Current Date\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\tinitCurrentDate: function() {\n\t\tvar defaultDateInput = this.opt('defaultDate');\n\n\t\t// compute the initial ambig-timezone date\n\t\tif (defaultDateInput != null) {\n\t\t\tthis.currentDate = this.moment(defaultDateInput).stripZone();\n\t\t}\n\t\telse {\n\t\t\tthis.currentDate = this.getNow(); // getNow already returns unzoned\n\t\t}\n\t},\n\n\n\tprev: function() {\n\t\tvar prevInfo = this.view.buildPrevDateProfile(this.currentDate);\n\n\t\tif (prevInfo.isValid) {\n\t\t\tthis.currentDate = prevInfo.date;\n\t\t\tthis.renderView();\n\t\t}\n\t},\n\n\n\tnext: function() {\n\t\tvar nextInfo = this.view.buildNextDateProfile(this.currentDate);\n\n\t\tif (nextInfo.isValid) {\n\t\t\tthis.currentDate = nextInfo.date;\n\t\t\tthis.renderView();\n\t\t}\n\t},\n\n\n\tprevYear: function() {\n\t\tthis.currentDate.add(-1, 'years');\n\t\tthis.renderView();\n\t},\n\n\n\tnextYear: function() {\n\t\tthis.currentDate.add(1, 'years');\n\t\tthis.renderView();\n\t},\n\n\n\ttoday: function() {\n\t\tthis.currentDate = this.getNow(); // should deny like prev/next?\n\t\tthis.renderView();\n\t},\n\n\n\tgotoDate: function(zonedDateInput) {\n\t\tthis.currentDate = this.moment(zonedDateInput).stripZone();\n\t\tthis.renderView();\n\t},\n\n\n\tincrementDate: function(delta) {\n\t\tthis.currentDate.add(moment.duration(delta));\n\t\tthis.renderView();\n\t},\n\n\n\t// for external API\n\tgetDate: function() {\n\t\treturn this.applyTimezone(this.currentDate); // infuse the calendar's timezone\n\t},\n\n\n\t// Loading Triggering\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Should be called when any type of async data fetching begins\n\tpushLoading: function() {\n\t\tif (!(this.loadingLevel++)) {\n\t\t\tthis.publiclyTrigger('loading', null, true, this.view);\n\t\t}\n\t},\n\n\n\t// Should be called when any type of async data fetching completes\n\tpopLoading: function() {\n\t\tif (!(--this.loadingLevel)) {\n\t\t\tthis.publiclyTrigger('loading', null, false, this.view);\n\t\t}\n\t},\n\n\n\t// Selection\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// this public method receives start/end dates in any format, with any timezone\n\tselect: function(zonedStartInput, zonedEndInput) {\n\t\tthis.view.select(\n\t\t\tthis.buildSelectSpan.apply(this, arguments)\n\t\t);\n\t},\n\n\n\tunselect: function() { // safe to be called before renderView\n\t\tif (this.view) {\n\t\t\tthis.view.unselect();\n\t\t}\n\t},\n\n\n\t// Given arguments to the select method in the API, returns a span (unzoned start/end and other info)\n\tbuildSelectSpan: function(zonedStartInput, zonedEndInput) {\n\t\tvar start = this.moment(zonedStartInput).stripZone();\n\t\tvar end;\n\n\t\tif (zonedEndInput) {\n\t\t\tend = this.moment(zonedEndInput).stripZone();\n\t\t}\n\t\telse if (start.hasTime()) {\n\t\t\tend = start.clone().add(this.defaultTimedEventDuration);\n\t\t}\n\t\telse {\n\t\t\tend = start.clone().add(this.defaultAllDayEventDuration);\n\t\t}\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\t// Misc\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// will return `null` if invalid range\n\tparseRange: function(rangeInput) {\n\t\tvar start = null;\n\t\tvar end = null;\n\n\t\tif (rangeInput.start) {\n\t\t\tstart = this.moment(rangeInput.start).stripZone();\n\t\t}\n\n\t\tif (rangeInput.end) {\n\t\t\tend = this.moment(rangeInput.end).stripZone();\n\t\t}\n\n\t\tif (!start && !end) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (start && end && end.isBefore(start)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn { start: start, end: end };\n\t},\n\n\n\trerenderEvents: function() { // API method. destroys old events if previously rendered.\n\t\tif (this.elementVisible()) {\n\t\t\tthis.reportEventChange(); // will re-trasmit events to the view, causing a rerender\n\t\t}\n\t}\n\n});\n\n;;\n/*\nOptions binding/triggering system.\n*/\nCalendar.mixin({\n\n\tdirDefaults: null, // option defaults related to LTR or RTL\n\tlocaleDefaults: null, // option defaults related to current locale\n\toverrides: null, // option overrides given to the fullCalendar constructor\n\tdynamicOverrides: null, // options set with dynamic setter method. higher precedence than view overrides.\n\toptionsModel: null, // all defaults combined with overrides\n\n\n\tinitOptionsInternals: function(overrides) {\n\t\tthis.overrides = $.extend({}, overrides); // make a copy\n\t\tthis.dynamicOverrides = {};\n\t\tthis.optionsModel = new Model();\n\n\t\tthis.populateOptionsHash();\n\t},\n\n\n\t// public getter/setter\n\toption: function(name, value) {\n\t\tvar newOptionHash;\n\n\t\tif (typeof name === 'string') {\n\t\t\tif (value === undefined) { // getter\n\t\t\t\treturn this.optionsModel.get(name);\n\t\t\t}\n\t\t\telse { // setter for individual option\n\t\t\t\tnewOptionHash = {};\n\t\t\t\tnewOptionHash[name] = value;\n\t\t\t\tthis.setOptions(newOptionHash);\n\t\t\t}\n\t\t}\n\t\telse if (typeof name === 'object') { // compound setter with object input\n\t\t\tthis.setOptions(name);\n\t\t}\n\t},\n\n\n\t// private getter\n\topt: function(name) {\n\t\treturn this.optionsModel.get(name);\n\t},\n\n\n\tsetOptions: function(newOptionHash) {\n\t\tvar optionCnt = 0;\n\t\tvar optionName;\n\n\t\tthis.recordOptionOverrides(newOptionHash);\n\n\t\tfor (optionName in newOptionHash) {\n\t\t\toptionCnt++;\n\t\t}\n\n\t\t// special-case handling of single option change.\n\t\t// if only one option change, `optionName` will be its name.\n\t\tif (optionCnt === 1) {\n\t\t\tif (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') {\n\t\t\t\tthis.updateSize(true); // true = allow recalculation of height\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (optionName === 'defaultDate') {\n\t\t\t\treturn; // can't change date this way. use gotoDate instead\n\t\t\t}\n\t\t\telse if (optionName === 'businessHours') {\n\t\t\t\tif (this.view) {\n\t\t\t\t\tthis.view.unrenderBusinessHours();\n\t\t\t\t\tthis.view.renderBusinessHours();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (optionName === 'timezone') {\n\t\t\t\tthis.rezoneArrayEventSources();\n\t\t\t\tthis.refetchEvents();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// catch-all. rerender the header and footer and rebuild/rerender the current view\n\t\tthis.renderHeader();\n\t\tthis.renderFooter();\n\n\t\t// even non-current views will be affected by this option change. do before rerender\n\t\t// TODO: detangle\n\t\tthis.viewsByType = {};\n\n\t\tthis.reinitView();\n\t},\n\n\n\t// Computes the flattened options hash for the calendar and assigns to `this.options`.\n\t// Assumes this.overrides and this.dynamicOverrides have already been initialized.\n\tpopulateOptionsHash: function() {\n\t\tvar locale, localeDefaults;\n\t\tvar isRTL, dirDefaults;\n\t\tvar rawOptions;\n\n\t\tlocale = firstDefined( // explicit locale option given?\n\t\t\tthis.dynamicOverrides.locale,\n\t\t\tthis.overrides.locale\n\t\t);\n\t\tlocaleDefaults = localeOptionHash[locale];\n\t\tif (!localeDefaults) { // explicit locale option not given or invalid?\n\t\t\tlocale = Calendar.defaults.locale;\n\t\t\tlocaleDefaults = localeOptionHash[locale] || {};\n\t\t}\n\n\t\tisRTL = firstDefined( // based on options computed so far, is direction RTL?\n\t\t\tthis.dynamicOverrides.isRTL,\n\t\t\tthis.overrides.isRTL,\n\t\t\tlocaleDefaults.isRTL,\n\t\t\tCalendar.defaults.isRTL\n\t\t);\n\t\tdirDefaults = isRTL ? Calendar.rtlDefaults : {};\n\n\t\tthis.dirDefaults = dirDefaults;\n\t\tthis.localeDefaults = localeDefaults;\n\n\t\trawOptions = mergeOptions([ // merge defaults and overrides. lowest to highest precedence\n\t\t\tCalendar.defaults, // global defaults\n\t\t\tdirDefaults,\n\t\t\tlocaleDefaults,\n\t\t\tthis.overrides,\n\t\t\tthis.dynamicOverrides\n\t\t]);\n\t\tpopulateInstanceComputableOptions(rawOptions); // fill in gaps with computed options\n\n\t\tthis.optionsModel.reset(rawOptions);\n\t},\n\n\n\t// stores the new options internally, but does not rerender anything.\n\trecordOptionOverrides: function(newOptionHash) {\n\t\tvar optionName;\n\n\t\tfor (optionName in newOptionHash) {\n\t\t\tthis.dynamicOverrides[optionName] = newOptionHash[optionName];\n\t\t}\n\n\t\tthis.viewSpecCache = {}; // the dynamic override invalidates the options in this cache, so just clear it\n\t\tthis.populateOptionsHash(); // this.options needs to be recomputed after the dynamic override\n\t}\n\n});\n\n;;\n\nCalendar.mixin({\n\n\tdefaultAllDayEventDuration: null,\n\tdefaultTimedEventDuration: null,\n\tlocaleData: null,\n\n\n\tinitMomentInternals: function() {\n\t\tvar _this = this;\n\n\t\tthis.defaultAllDayEventDuration = moment.duration(this.opt('defaultAllDayEventDuration'));\n\t\tthis.defaultTimedEventDuration = moment.duration(this.opt('defaultTimedEventDuration'));\n\n\t\t// Called immediately, and when any of the options change.\n\t\t// Happens before any internal objects rebuild or rerender, because this is very core.\n\t\tthis.optionsModel.watch('buildingMomentLocale', [\n\t\t\t'?locale', '?monthNames', '?monthNamesShort', '?dayNames', '?dayNamesShort',\n\t\t\t'?firstDay', '?weekNumberCalculation'\n\t\t], function(opts) {\n\t\t\tvar weekNumberCalculation = opts.weekNumberCalculation;\n\t\t\tvar firstDay = opts.firstDay;\n\t\t\tvar _week;\n\n\t\t\t// normalize\n\t\t\tif (weekNumberCalculation === 'iso') {\n\t\t\t\tweekNumberCalculation = 'ISO'; // normalize\n\t\t\t}\n\n\t\t\tvar localeData = createObject( // make a cheap copy\n\t\t\t\tgetMomentLocaleData(opts.locale) // will fall back to en\n\t\t\t);\n\n\t\t\tif (opts.monthNames) {\n\t\t\t\tlocaleData._months = opts.monthNames;\n\t\t\t}\n\t\t\tif (opts.monthNamesShort) {\n\t\t\t\tlocaleData._monthsShort = opts.monthNamesShort;\n\t\t\t}\n\t\t\tif (opts.dayNames) {\n\t\t\t\tlocaleData._weekdays = opts.dayNames;\n\t\t\t}\n\t\t\tif (opts.dayNamesShort) {\n\t\t\t\tlocaleData._weekdaysShort = opts.dayNamesShort;\n\t\t\t}\n\n\t\t\tif (firstDay == null && weekNumberCalculation === 'ISO') {\n\t\t\t\tfirstDay = 1;\n\t\t\t}\n\t\t\tif (firstDay != null) {\n\t\t\t\t_week = createObject(localeData._week); // _week: { dow: # }\n\t\t\t\t_week.dow = firstDay;\n\t\t\t\tlocaleData._week = _week;\n\t\t\t}\n\n\t\t\tif ( // whitelist certain kinds of input\n\t\t\t\tweekNumberCalculation === 'ISO' ||\n\t\t\t\tweekNumberCalculation === 'local' ||\n\t\t\t\ttypeof weekNumberCalculation === 'function'\n\t\t\t) {\n\t\t\t\tlocaleData._fullCalendar_weekCalc = weekNumberCalculation; // moment-ext will know what to do with it\n\t\t\t}\n\n\t\t\t_this.localeData = localeData;\n\n\t\t\t// If the internal current date object already exists, move to new locale.\n\t\t\t// We do NOT need to do this technique for event dates, because this happens when converting to \"segments\".\n\t\t\tif (_this.currentDate) {\n\t\t\t\t_this.localizeMoment(_this.currentDate); // sets to localeData\n\t\t\t}\n\t\t});\n\t},\n\n\n\t// Builds a moment using the settings of the current calendar: timezone and locale.\n\t// Accepts anything the vanilla moment() constructor accepts.\n\tmoment: function() {\n\t\tvar mom;\n\n\t\tif (this.opt('timezone') === 'local') {\n\t\t\tmom = FC.moment.apply(null, arguments);\n\n\t\t\t// Force the moment to be local, because FC.moment doesn't guarantee it.\n\t\t\tif (mom.hasTime()) { // don't give ambiguously-timed moments a local zone\n\t\t\t\tmom.local();\n\t\t\t}\n\t\t}\n\t\telse if (this.opt('timezone') === 'UTC') {\n\t\t\tmom = FC.moment.utc.apply(null, arguments); // process as UTC\n\t\t}\n\t\telse {\n\t\t\tmom = FC.moment.parseZone.apply(null, arguments); // let the input decide the zone\n\t\t}\n\n\t\tthis.localizeMoment(mom); // TODO\n\n\t\treturn mom;\n\t},\n\n\n\t// Updates the given moment's locale settings to the current calendar locale settings.\n\tlocalizeMoment: function(mom) {\n\t\tmom._locale = this.localeData;\n\t},\n\n\n\t// Returns a boolean about whether or not the calendar knows how to calculate\n\t// the timezone offset of arbitrary dates in the current timezone.\n\tgetIsAmbigTimezone: function() {\n\t\treturn this.opt('timezone') !== 'local' && this.opt('timezone') !== 'UTC';\n\t},\n\n\n\t// Returns a copy of the given date in the current timezone. Has no effect on dates without times.\n\tapplyTimezone: function(date) {\n\t\tif (!date.hasTime()) {\n\t\t\treturn date.clone();\n\t\t}\n\n\t\tvar zonedDate = this.moment(date.toArray());\n\t\tvar timeAdjust = date.time() - zonedDate.time();\n\t\tvar adjustedZonedDate;\n\n\t\t// Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396)\n\t\tif (timeAdjust) { // is the time result different than expected?\n\t\t\tadjustedZonedDate = zonedDate.clone().add(timeAdjust); // add milliseconds\n\t\t\tif (date.time() - adjustedZonedDate.time() === 0) { // does it match perfectly now?\n\t\t\t\tzonedDate = adjustedZonedDate;\n\t\t\t}\n\t\t}\n\n\t\treturn zonedDate;\n\t},\n\n\n\t// Returns a moment for the current date, as defined by the client's computer or from the `now` option.\n\t// Will return an moment with an ambiguous timezone.\n\tgetNow: function() {\n\t\tvar now = this.opt('now');\n\t\tif (typeof now === 'function') {\n\t\t\tnow = now();\n\t\t}\n\t\treturn this.moment(now).stripZone();\n\t},\n\n\n\t// Produces a human-readable string for the given duration.\n\t// Side-effect: changes the locale of the given duration.\n\thumanizeDuration: function(duration) {\n\t\treturn duration.locale(this.opt('locale')).humanize();\n\t},\n\n\n\n\t// Event-Specific Date Utilities. TODO: move\n\t// -----------------------------------------------------------------------------------------------------------------\n\n\n\t// Get an event's normalized end date. If not present, calculate it from the defaults.\n\tgetEventEnd: function(event) {\n\t\tif (event.end) {\n\t\t\treturn event.end.clone();\n\t\t}\n\t\telse {\n\t\t\treturn this.getDefaultEventEnd(event.allDay, event.start);\n\t\t}\n\t},\n\n\n\t// Given an event's allDay status and start date, return what its fallback end date should be.\n\t// TODO: rename to computeDefaultEventEnd\n\tgetDefaultEventEnd: function(allDay, zonedStart) {\n\t\tvar end = zonedStart.clone();\n\n\t\tif (allDay) {\n\t\t\tend.stripTime().add(this.defaultAllDayEventDuration);\n\t\t}\n\t\telse {\n\t\t\tend.add(this.defaultTimedEventDuration);\n\t\t}\n\n\t\tif (this.getIsAmbigTimezone()) {\n\t\t\tend.stripZone(); // we don't know what the tzo should be\n\t\t}\n\n\t\treturn end;\n\t}\n\n});\n\n;;\n\nCalendar.mixin({\n\n\tviewSpecCache: null, // cache of view definitions (initialized in Calendar.js)\n\n\n\t// Gets information about how to create a view. Will use a cache.\n\tgetViewSpec: function(viewType) {\n\t\tvar cache = this.viewSpecCache;\n\n\t\treturn cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));\n\t},\n\n\n\t// Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\n\t// Preference is given to views that have corresponding buttons.\n\tgetUnitViewSpec: function(unit) {\n\t\tvar viewTypes;\n\t\tvar i;\n\t\tvar spec;\n\n\t\tif ($.inArray(unit, unitsDesc) != -1) {\n\n\t\t\t// put views that have buttons first. there will be duplicates, but oh well\n\t\t\tviewTypes = this.header.getViewsWithButtons(); // TODO: include footer as well?\n\t\t\t$.each(FC.views, function(viewType) { // all views\n\t\t\t\tviewTypes.push(viewType);\n\t\t\t});\n\n\t\t\tfor (i = 0; i < viewTypes.length; i++) {\n\t\t\t\tspec = this.getViewSpec(viewTypes[i]);\n\t\t\t\tif (spec) {\n\t\t\t\t\tif (spec.singleUnit == unit) {\n\t\t\t\t\t\treturn spec;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// Builds an object with information on how to create a given view\n\tbuildViewSpec: function(requestedViewType) {\n\t\tvar viewOverrides = this.overrides.views || {};\n\t\tvar specChain = []; // for the view. lowest to highest priority\n\t\tvar defaultsChain = []; // for the view. lowest to highest priority\n\t\tvar overridesChain = []; // for the view. lowest to highest priority\n\t\tvar viewType = requestedViewType;\n\t\tvar spec; // for the view\n\t\tvar overrides; // for the view\n\t\tvar durationInput;\n\t\tvar duration;\n\t\tvar unit;\n\n\t\t// iterate from the specific view definition to a more general one until we hit an actual View class\n\t\twhile (viewType) {\n\t\t\tspec = fcViews[viewType];\n\t\t\toverrides = viewOverrides[viewType];\n\t\t\tviewType = null; // clear. might repopulate for another iteration\n\n\t\t\tif (typeof spec === 'function') { // TODO: deprecate\n\t\t\t\tspec = { 'class': spec };\n\t\t\t}\n\n\t\t\tif (spec) {\n\t\t\t\tspecChain.unshift(spec);\n\t\t\t\tdefaultsChain.unshift(spec.defaults || {});\n\t\t\t\tdurationInput = durationInput || spec.duration;\n\t\t\t\tviewType = viewType || spec.type;\n\t\t\t}\n\n\t\t\tif (overrides) {\n\t\t\t\toverridesChain.unshift(overrides); // view-specific option hashes have options at zero-level\n\t\t\t\tdurationInput = durationInput || overrides.duration;\n\t\t\t\tviewType = viewType || overrides.type;\n\t\t\t}\n\t\t}\n\n\t\tspec = mergeProps(specChain);\n\t\tspec.type = requestedViewType;\n\t\tif (!spec['class']) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// fall back to top-level `duration` option\n\t\tdurationInput = durationInput ||\n\t\t\tthis.dynamicOverrides.duration ||\n\t\t\tthis.overrides.duration;\n\n\t\tif (durationInput) {\n\t\t\tduration = moment.duration(durationInput);\n\n\t\t\tif (duration.valueOf()) { // valid?\n\n\t\t\t\tunit = computeDurationGreatestUnit(duration, durationInput);\n\n\t\t\t\tspec.duration = duration;\n\t\t\t\tspec.durationUnit = unit;\n\n\t\t\t\t// view is a single-unit duration, like \"week\" or \"day\"\n\t\t\t\t// incorporate options for this. lowest priority\n\t\t\t\tif (duration.as(unit) === 1) {\n\t\t\t\t\tspec.singleUnit = unit;\n\t\t\t\t\toverridesChain.unshift(viewOverrides[unit] || {});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tspec.defaults = mergeOptions(defaultsChain);\n\t\tspec.overrides = mergeOptions(overridesChain);\n\n\t\tthis.buildViewSpecOptions(spec);\n\t\tthis.buildViewSpecButtonText(spec, requestedViewType);\n\n\t\treturn spec;\n\t},\n\n\n\t// Builds and assigns a view spec's options object from its already-assigned defaults and overrides\n\tbuildViewSpecOptions: function(spec) {\n\t\tspec.options = mergeOptions([ // lowest to highest priority\n\t\t\tCalendar.defaults, // global defaults\n\t\t\tspec.defaults, // view's defaults (from ViewSubclass.defaults)\n\t\t\tthis.dirDefaults,\n\t\t\tthis.localeDefaults, // locale and dir take precedence over view's defaults!\n\t\t\tthis.overrides, // calendar's overrides (options given to constructor)\n\t\t\tspec.overrides, // view's overrides (view-specific options)\n\t\t\tthis.dynamicOverrides // dynamically set via setter. highest precedence\n\t\t]);\n\t\tpopulateInstanceComputableOptions(spec.options);\n\t},\n\n\n\t// Computes and assigns a view spec's buttonText-related options\n\tbuildViewSpecButtonText: function(spec, requestedViewType) {\n\n\t\t// given an options object with a possible `buttonText` hash, lookup the buttonText for the\n\t\t// requested view, falling back to a generic unit entry like \"week\" or \"day\"\n\t\tfunction queryButtonText(options) {\n\t\t\tvar buttonText = options.buttonText || {};\n\t\t\treturn buttonText[requestedViewType] ||\n\t\t\t\t// view can decide to look up a certain key\n\t\t\t\t(spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) ||\n\t\t\t\t// a key like \"month\"\n\t\t\t\t(spec.singleUnit ? buttonText[spec.singleUnit] : null);\n\t\t}\n\n\t\t// highest to lowest priority\n\t\tspec.buttonTextOverride =\n\t\t\tqueryButtonText(this.dynamicOverrides) ||\n\t\t\tqueryButtonText(this.overrides) || // constructor-specified buttonText lookup hash takes precedence\n\t\t\tspec.overrides.buttonText; // `buttonText` for view-specific options is a string\n\n\t\t// highest to lowest priority. mirrors buildViewSpecOptions\n\t\tspec.buttonTextDefault =\n\t\t\tqueryButtonText(this.localeDefaults) ||\n\t\t\tqueryButtonText(this.dirDefaults) ||\n\t\t\tspec.defaults.buttonText || // a single string. from ViewSubclass.defaults\n\t\t\tqueryButtonText(Calendar.defaults) ||\n\t\t\t(spec.duration ? this.humanizeDuration(spec.duration) : null) || // like \"3 days\"\n\t\t\trequestedViewType; // fall back to given view name\n\t}\n\n});\n\n;;\n\nCalendar.mixin({\n\n\tel: null,\n\tcontentEl: null,\n\tsuggestedViewHeight: null,\n\twindowResizeProxy: null,\n\tignoreWindowResize: 0,\n\n\n\trender: function() {\n\t\tif (!this.contentEl) {\n\t\t\tthis.initialRender();\n\t\t}\n\t\telse if (this.elementVisible()) {\n\t\t\t// mainly for the public API\n\t\t\tthis.calcSize();\n\t\t\tthis.renderView();\n\t\t}\n\t},\n\n\n\tinitialRender: function() {\n\t\tvar _this = this;\n\t\tvar el = this.el;\n\n\t\tel.addClass('fc');\n\n\t\t// event delegation for nav links\n\t\tel.on('click.fc', 'a[data-goto]', function(ev) {\n\t\t\tvar anchorEl = $(this);\n\t\t\tvar gotoOptions = anchorEl.data('goto'); // will automatically parse JSON\n\t\t\tvar date = _this.moment(gotoOptions.date);\n\t\t\tvar viewType = gotoOptions.type;\n\n\t\t\t// property like \"navLinkDayClick\". might be a string or a function\n\t\t\tvar customAction = _this.view.opt('navLink' + capitaliseFirstLetter(viewType) + 'Click');\n\n\t\t\tif (typeof customAction === 'function') {\n\t\t\t\tcustomAction(date, ev);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (typeof customAction === 'string') {\n\t\t\t\t\tviewType = customAction;\n\t\t\t\t}\n\t\t\t\t_this.zoomTo(date, viewType);\n\t\t\t}\n\t\t});\n\n\t\t// called immediately, and upon option change\n\t\tthis.optionsModel.watch('applyingThemeClasses', [ '?theme' ], function(opts) {\n\t\t\tel.toggleClass('ui-widget', opts.theme);\n\t\t\tel.toggleClass('fc-unthemed', !opts.theme);\n\t\t});\n\n\t\t// called immediately, and upon option change.\n\t\t// HACK: locale often affects isRTL, so we explicitly listen to that too.\n\t\tthis.optionsModel.watch('applyingDirClasses', [ '?isRTL', '?locale' ], function(opts) {\n\t\t\tel.toggleClass('fc-ltr', !opts.isRTL);\n\t\t\tel.toggleClass('fc-rtl', opts.isRTL);\n\t\t});\n\n\t\tthis.contentEl = $(\"
\").prependTo(el);\n\n\t\tthis.initToolbars();\n\t\tthis.renderHeader();\n\t\tthis.renderFooter();\n\t\tthis.renderView(this.opt('defaultView'));\n\n\t\tif (this.opt('handleWindowResize')) {\n\t\t\t$(window).resize(\n\t\t\t\tthis.windowResizeProxy = debounce( // prevents rapid calls\n\t\t\t\t\tthis.windowResize.bind(this),\n\t\t\t\t\tthis.opt('windowResizeDelay')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t},\n\n\n\tdestroy: function() {\n\n\t\tif (this.view) {\n\t\t\tthis.view.removeElement();\n\n\t\t\t// NOTE: don't null-out this.view in case API methods are called after destroy.\n\t\t\t// It is still the \"current\" view, just not rendered.\n\t\t}\n\n\t\tthis.toolbarsManager.proxyCall('removeElement');\n\t\tthis.contentEl.remove();\n\t\tthis.el.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget');\n\n\t\tthis.el.off('.fc'); // unbind nav link handlers\n\n\t\tif (this.windowResizeProxy) {\n\t\t\t$(window).unbind('resize', this.windowResizeProxy);\n\t\t\tthis.windowResizeProxy = null;\n\t\t}\n\n\t\tGlobalEmitter.unneeded();\n\t},\n\n\n\telementVisible: function() {\n\t\treturn this.el.is(':visible');\n\t},\n\n\n\n\t// View Rendering\n\t// -----------------------------------------------------------------------------------\n\n\n\t// Renders a view because of a date change, view-type change, or for the first time.\n\t// If not given a viewType, keep the current view but render different dates.\n\t// Accepts an optional scroll state to restore to.\n\trenderView: function(viewType, forcedScroll) {\n\n\t\tthis.ignoreWindowResize++;\n\n\t\tvar needsClearView = this.view && viewType && this.view.type !== viewType;\n\n\t\t// if viewType is changing, remove the old view's rendering\n\t\tif (needsClearView) {\n\t\t\tthis.freezeContentHeight(); // prevent a scroll jump when view element is removed\n\t\t\tthis.clearView();\n\t\t}\n\n\t\t// if viewType changed, or the view was never created, create a fresh view\n\t\tif (!this.view && viewType) {\n\t\t\tthis.view =\n\t\t\t\tthis.viewsByType[viewType] ||\n\t\t\t\t(this.viewsByType[viewType] = this.instantiateView(viewType));\n\n\t\t\tthis.view.setElement(\n\t\t\t\t$(\"
\").appendTo(this.contentEl)\n\t\t\t);\n\t\t\tthis.toolbarsManager.proxyCall('activateButton', viewType);\n\t\t}\n\n\t\tif (this.view) {\n\n\t\t\tif (forcedScroll) {\n\t\t\t\tthis.view.addForcedScroll(forcedScroll);\n\t\t\t}\n\n\t\t\tif (this.elementVisible()) {\n\t\t\t\tthis.currentDate = this.view.setDate(this.currentDate);\n\t\t\t}\n\t\t}\n\n\t\tif (needsClearView) {\n\t\t\tthis.thawContentHeight();\n\t\t}\n\n\t\tthis.ignoreWindowResize--;\n\t},\n\n\n\t// Unrenders the current view and reflects this change in the Header.\n\t// Unregsiters the `view`, but does not remove from viewByType hash.\n\tclearView: function() {\n\t\tthis.toolbarsManager.proxyCall('deactivateButton', this.view.type);\n\t\tthis.view.removeElement();\n\t\tthis.view = null;\n\t},\n\n\n\t// Destroys the view, including the view object. Then, re-instantiates it and renders it.\n\t// Maintains the same scroll state.\n\t// TODO: maintain any other user-manipulated state.\n\treinitView: function() {\n\t\tthis.ignoreWindowResize++;\n\t\tthis.freezeContentHeight();\n\n\t\tvar viewType = this.view.type;\n\t\tvar scrollState = this.view.queryScroll();\n\t\tthis.clearView();\n\t\tthis.calcSize();\n\t\tthis.renderView(viewType, scrollState);\n\n\t\tthis.thawContentHeight();\n\t\tthis.ignoreWindowResize--;\n\t},\n\n\n\t// Resizing\n\t// -----------------------------------------------------------------------------------\n\n\n\tgetSuggestedViewHeight: function() {\n\t\tif (this.suggestedViewHeight === null) {\n\t\t\tthis.calcSize();\n\t\t}\n\t\treturn this.suggestedViewHeight;\n\t},\n\n\n\tisHeightAuto: function() {\n\t\treturn this.opt('contentHeight') === 'auto' || this.opt('height') === 'auto';\n\t},\n\n\n\tupdateSize: function(shouldRecalc) {\n\t\tif (this.elementVisible()) {\n\n\t\t\tif (shouldRecalc) {\n\t\t\t\tthis._calcSize();\n\t\t\t}\n\n\t\t\tthis.ignoreWindowResize++;\n\t\t\tthis.view.updateSize(true); // isResize=true. will poll getSuggestedViewHeight() and isHeightAuto()\n\t\t\tthis.ignoreWindowResize--;\n\n\t\t\treturn true; // signal success\n\t\t}\n\t},\n\n\n\tcalcSize: function() {\n\t\tif (this.elementVisible()) {\n\t\t\tthis._calcSize();\n\t\t}\n\t},\n\n\n\t_calcSize: function() { // assumes elementVisible\n\t\tvar contentHeightInput = this.opt('contentHeight');\n\t\tvar heightInput = this.opt('height');\n\n\t\tif (typeof contentHeightInput === 'number') { // exists and not 'auto'\n\t\t\tthis.suggestedViewHeight = contentHeightInput;\n\t\t}\n\t\telse if (typeof contentHeightInput === 'function') { // exists and is a function\n\t\t\tthis.suggestedViewHeight = contentHeightInput();\n\t\t}\n\t\telse if (typeof heightInput === 'number') { // exists and not 'auto'\n\t\t\tthis.suggestedViewHeight = heightInput - this.queryToolbarsHeight();\n\t\t}\n\t\telse if (typeof heightInput === 'function') { // exists and is a function\n\t\t\tthis.suggestedViewHeight = heightInput() - this.queryToolbarsHeight();\n\t\t}\n\t\telse if (heightInput === 'parent') { // set to height of parent element\n\t\t\tthis.suggestedViewHeight = this.el.parent().height() - this.queryToolbarsHeight();\n\t\t}\n\t\telse {\n\t\t\tthis.suggestedViewHeight = Math.round(\n\t\t\t\tthis.contentEl.width() /\n\t\t\t\tMath.max(this.opt('aspectRatio'), .5)\n\t\t\t);\n\t\t}\n\t},\n\n\n\twindowResize: function(ev) {\n\t\tif (\n\t\t\t!this.ignoreWindowResize &&\n\t\t\tev.target === window && // so we don't process jqui \"resize\" events that have bubbled up\n\t\t\tthis.view.renderRange // view has already been rendered\n\t\t) {\n\t\t\tif (this.updateSize(true)) {\n\t\t\t\tthis.view.publiclyTrigger('windowResize', this.el[0]);\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/* Height \"Freezing\"\n\t-----------------------------------------------------------------------------*/\n\n\n\tfreezeContentHeight: function() {\n\t\tthis.contentEl.css({\n\t\t\twidth: '100%',\n\t\t\theight: this.contentEl.height(),\n\t\t\toverflow: 'hidden'\n\t\t});\n\t},\n\n\n\tthawContentHeight: function() {\n\t\tthis.contentEl.css({\n\t\t\twidth: '',\n\t\t\theight: '',\n\t\t\toverflow: ''\n\t\t});\n\t}\n\n});\n\n;;\n\nCalendar.mixin({\n\n\theader: null,\n\tfooter: null,\n\ttoolbarsManager: null,\n\n\n\tinitToolbars: function() {\n\t\tthis.header = new Toolbar(this, this.computeHeaderOptions());\n\t\tthis.footer = new Toolbar(this, this.computeFooterOptions());\n\t\tthis.toolbarsManager = new Iterator([ this.header, this.footer ]);\n\t},\n\n\n\tcomputeHeaderOptions: function() {\n\t\treturn {\n\t\t\textraClasses: 'fc-header-toolbar',\n\t\t\tlayout: this.opt('header')\n\t\t};\n\t},\n\n\n\tcomputeFooterOptions: function() {\n\t\treturn {\n\t\t\textraClasses: 'fc-footer-toolbar',\n\t\t\tlayout: this.opt('footer')\n\t\t};\n\t},\n\n\n\t// can be called repeatedly and Header will rerender\n\trenderHeader: function() {\n\t\tvar header = this.header;\n\n\t\theader.setToolbarOptions(this.computeHeaderOptions());\n\t\theader.render();\n\n\t\tif (header.el) {\n\t\t\tthis.el.prepend(header.el);\n\t\t}\n\t},\n\n\n\t// can be called repeatedly and Footer will rerender\n\trenderFooter: function() {\n\t\tvar footer = this.footer;\n\n\t\tfooter.setToolbarOptions(this.computeFooterOptions());\n\t\tfooter.render();\n\n\t\tif (footer.el) {\n\t\t\tthis.el.append(footer.el);\n\t\t}\n\t},\n\n\n\tsetToolbarsTitle: function(title) {\n\t\tthis.toolbarsManager.proxyCall('updateTitle', title);\n\t},\n\n\n\tupdateToolbarButtons: function() {\n\t\tvar now = this.getNow();\n\t\tvar view = this.view;\n\t\tvar todayInfo = view.buildDateProfile(now);\n\t\tvar prevInfo = view.buildPrevDateProfile(this.currentDate);\n\t\tvar nextInfo = view.buildNextDateProfile(this.currentDate);\n\n\t\tthis.toolbarsManager.proxyCall(\n\t\t\t(todayInfo.isValid && !isDateWithinRange(now, view.currentRange)) ?\n\t\t\t\t'enableButton' :\n\t\t\t\t'disableButton',\n\t\t\t'today'\n\t\t);\n\n\t\tthis.toolbarsManager.proxyCall(\n\t\t\tprevInfo.isValid ?\n\t\t\t\t'enableButton' :\n\t\t\t\t'disableButton',\n\t\t\t'prev'\n\t\t);\n\n\t\tthis.toolbarsManager.proxyCall(\n\t\t\tnextInfo.isValid ?\n\t\t\t\t'enableButton' :\n\t\t\t\t'disableButton',\n\t\t\t'next'\n\t\t);\n\t},\n\n\n\tqueryToolbarsHeight: function() {\n\t\treturn this.toolbarsManager.items.reduce(function(accumulator, toolbar) {\n\t\t\tvar toolbarHeight = toolbar.el ? toolbar.el.outerHeight(true) : 0; // includes margin\n\t\t\treturn accumulator + toolbarHeight;\n\t\t}, 0);\n\t}\n\n});\n\n;;\n\nCalendar.defaults = {\n\n\ttitleRangeSeparator: ' \\u2013 ', // en dash\n\tmonthYearFormat: 'MMMM YYYY', // required for en. other locales rely on datepicker computable option\n\n\tdefaultTimedEventDuration: '02:00:00',\n\tdefaultAllDayEventDuration: { days: 1 },\n\tforceEventDuration: false,\n\tnextDayThreshold: '09:00:00', // 9am\n\n\t// display\n\tdefaultView: 'month',\n\taspectRatio: 1.35,\n\theader: {\n\t\tleft: 'title',\n\t\tcenter: '',\n\t\tright: 'today prev,next'\n\t},\n\tweekends: true,\n\tweekNumbers: false,\n\n\tweekNumberTitle: 'W',\n\tweekNumberCalculation: 'local',\n\t\n\t//editable: false,\n\n\t//nowIndicator: false,\n\n\tscrollTime: '06:00:00',\n\tminTime: '00:00:00',\n\tmaxTime: '24:00:00',\n\tshowNonCurrentDates: true,\n\t\n\t// event ajax\n\tlazyFetching: true,\n\tstartParam: 'start',\n\tendParam: 'end',\n\ttimezoneParam: 'timezone',\n\n\ttimezone: false,\n\n\t//allDayDefault: undefined,\n\n\t// locale\n\tisRTL: false,\n\tbuttonText: {\n\t\tprev: \"prev\",\n\t\tnext: \"next\",\n\t\tprevYear: \"prev year\",\n\t\tnextYear: \"next year\",\n\t\tyear: 'year', // TODO: locale files need to specify this\n\t\ttoday: 'today',\n\t\tmonth: 'month',\n\t\tweek: 'week',\n\t\tday: 'day'\n\t},\n\n\tbuttonIcons: {\n\t\tprev: 'left-single-arrow',\n\t\tnext: 'right-single-arrow',\n\t\tprevYear: 'left-double-arrow',\n\t\tnextYear: 'right-double-arrow'\n\t},\n\n\tallDayText: 'all-day',\n\t\n\t// jquery-ui theming\n\ttheme: false,\n\tthemeButtonIcons: {\n\t\tprev: 'circle-triangle-w',\n\t\tnext: 'circle-triangle-e',\n\t\tprevYear: 'seek-prev',\n\t\tnextYear: 'seek-next'\n\t},\n\n\t//eventResizableFromStart: false,\n\tdragOpacity: .75,\n\tdragRevertDuration: 500,\n\tdragScroll: true,\n\t\n\t//selectable: false,\n\tunselectAuto: true,\n\t//selectMinDistance: 0,\n\t\n\tdropAccept: '*',\n\n\teventOrder: 'title',\n\t//eventRenderWait: null,\n\n\teventLimit: false,\n\teventLimitText: 'more',\n\teventLimitClick: 'popover',\n\tdayPopoverFormat: 'LL',\n\t\n\thandleWindowResize: true,\n\twindowResizeDelay: 100, // milliseconds before an updateSize happens\n\n\tlongPressDelay: 1000\n\t\n};\n\n\nCalendar.englishDefaults = { // used by locale.js\n\tdayPopoverFormat: 'dddd, MMMM D'\n};\n\n\nCalendar.rtlDefaults = { // right-to-left defaults\n\theader: { // TODO: smarter solution (first/center/last ?)\n\t\tleft: 'next,prev today',\n\t\tcenter: '',\n\t\tright: 'title'\n\t},\n\tbuttonIcons: {\n\t\tprev: 'right-single-arrow',\n\t\tnext: 'left-single-arrow',\n\t\tprevYear: 'right-double-arrow',\n\t\tnextYear: 'left-double-arrow'\n\t},\n\tthemeButtonIcons: {\n\t\tprev: 'circle-triangle-e',\n\t\tnext: 'circle-triangle-w',\n\t\tnextYear: 'seek-prev',\n\t\tprevYear: 'seek-next'\n\t}\n};\n\n;;\n\nvar localeOptionHash = FC.locales = {}; // initialize and expose\n\n\n// TODO: document the structure and ordering of a FullCalendar locale file\n\n\n// Initialize jQuery UI datepicker translations while using some of the translations\n// Will set this as the default locales for datepicker.\nFC.datepickerLocale = function(localeCode, dpLocaleCode, dpOptions) {\n\n\t// get the FullCalendar internal option hash for this locale. create if necessary\n\tvar fcOptions = localeOptionHash[localeCode] || (localeOptionHash[localeCode] = {});\n\n\t// transfer some simple options from datepicker to fc\n\tfcOptions.isRTL = dpOptions.isRTL;\n\tfcOptions.weekNumberTitle = dpOptions.weekHeader;\n\n\t// compute some more complex options from datepicker\n\t$.each(dpComputableOptions, function(name, func) {\n\t\tfcOptions[name] = func(dpOptions);\n\t});\n\n\t// is jQuery UI Datepicker is on the page?\n\tif ($.datepicker) {\n\n\t\t// Register the locale data.\n\t\t// FullCalendar and MomentJS use locale codes like \"pt-br\" but Datepicker\n\t\t// does it like \"pt-BR\" or if it doesn't have the locale, maybe just \"pt\".\n\t\t// Make an alias so the locale can be referenced either way.\n\t\t$.datepicker.regional[dpLocaleCode] =\n\t\t\t$.datepicker.regional[localeCode] = // alias\n\t\t\t\tdpOptions;\n\n\t\t// Alias 'en' to the default locale data. Do this every time.\n\t\t$.datepicker.regional.en = $.datepicker.regional[''];\n\n\t\t// Set as Datepicker's global defaults.\n\t\t$.datepicker.setDefaults(dpOptions);\n\t}\n};\n\n\n// Sets FullCalendar-specific translations. Will set the locales as the global default.\nFC.locale = function(localeCode, newFcOptions) {\n\tvar fcOptions;\n\tvar momOptions;\n\n\t// get the FullCalendar internal option hash for this locale. create if necessary\n\tfcOptions = localeOptionHash[localeCode] || (localeOptionHash[localeCode] = {});\n\n\t// provided new options for this locales? merge them in\n\tif (newFcOptions) {\n\t\tfcOptions = localeOptionHash[localeCode] = mergeOptions([ fcOptions, newFcOptions ]);\n\t}\n\n\t// compute locale options that weren't defined.\n\t// always do this. newFcOptions can be undefined when initializing from i18n file,\n\t// so no way to tell if this is an initialization or a default-setting.\n\tmomOptions = getMomentLocaleData(localeCode); // will fall back to en\n\t$.each(momComputableOptions, function(name, func) {\n\t\tif (fcOptions[name] == null) {\n\t\t\tfcOptions[name] = func(momOptions, fcOptions);\n\t\t}\n\t});\n\n\t// set it as the default locale for FullCalendar\n\tCalendar.defaults.locale = localeCode;\n};\n\n\n// NOTE: can't guarantee any of these computations will run because not every locale has datepicker\n// configs, so make sure there are English fallbacks for these in the defaults file.\nvar dpComputableOptions = {\n\n\tbuttonText: function(dpOptions) {\n\t\treturn {\n\t\t\t// the translations sometimes wrongly contain HTML entities\n\t\t\tprev: stripHtmlEntities(dpOptions.prevText),\n\t\t\tnext: stripHtmlEntities(dpOptions.nextText),\n\t\t\ttoday: stripHtmlEntities(dpOptions.currentText)\n\t\t};\n\t},\n\n\t// Produces format strings like \"MMMM YYYY\" -> \"September 2014\"\n\tmonthYearFormat: function(dpOptions) {\n\t\treturn dpOptions.showMonthAfterYear ?\n\t\t\t'YYYY[' + dpOptions.yearSuffix + '] MMMM' :\n\t\t\t'MMMM YYYY[' + dpOptions.yearSuffix + ']';\n\t}\n\n};\n\nvar momComputableOptions = {\n\n\t// Produces format strings like \"ddd M/D\" -> \"Fri 9/15\"\n\tdayOfMonthFormat: function(momOptions, fcOptions) {\n\t\tvar format = momOptions.longDateFormat('l'); // for the format like \"M/D/YYYY\"\n\n\t\t// strip the year off the edge, as well as other misc non-whitespace chars\n\t\tformat = format.replace(/^Y+[^\\w\\s]*|[^\\w\\s]*Y+$/g, '');\n\n\t\tif (fcOptions.isRTL) {\n\t\t\tformat += ' ddd'; // for RTL, add day-of-week to end\n\t\t}\n\t\telse {\n\t\t\tformat = 'ddd ' + format; // for LTR, add day-of-week to beginning\n\t\t}\n\t\treturn format;\n\t},\n\n\t// Produces format strings like \"h:mma\" -> \"6:00pm\"\n\tmediumTimeFormat: function(momOptions) { // can't be called `timeFormat` because collides with option\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"h(:mm)a\" -> \"6pm\" / \"6:30pm\"\n\tsmallTimeFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(':mm', '(:mm)')\n\t\t\t.replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\n\t\t\t.replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"h(:mm)t\" -> \"6p\" / \"6:30p\"\n\textraSmallTimeFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(':mm', '(:mm)')\n\t\t\t.replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\n\t\t\t.replace(/\\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"ha\" / \"H\" -> \"6pm\" / \"18\"\n\thourFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(':mm', '')\n\t\t\t.replace(/(\\Wmm)$/, '') // like above, but for foreign locales\n\t\t\t.replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\n\t},\n\n\t// Produces format strings like \"h:mm\" -> \"6:30\" (with no AM/PM)\n\tnoMeridiemTimeFormat: function(momOptions) {\n\t\treturn momOptions.longDateFormat('LT')\n\t\t\t.replace(/\\s*a$/i, ''); // remove trailing AM/PM\n\t}\n\n};\n\n\n// options that should be computed off live calendar options (considers override options)\n// TODO: best place for this? related to locale?\n// TODO: flipping text based on isRTL is a bad idea because the CSS `direction` might want to handle it\nvar instanceComputableOptions = {\n\n\t// Produces format strings for results like \"Mo 16\"\n\tsmallDayDateFormat: function(options) {\n\t\treturn options.isRTL ?\n\t\t\t'D dd' :\n\t\t\t'dd D';\n\t},\n\n\t// Produces format strings for results like \"Wk 5\"\n\tweekFormat: function(options) {\n\t\treturn options.isRTL ?\n\t\t\t'w[ ' + options.weekNumberTitle + ']' :\n\t\t\t'[' + options.weekNumberTitle + ' ]w';\n\t},\n\n\t// Produces format strings for results like \"Wk5\"\n\tsmallWeekFormat: function(options) {\n\t\treturn options.isRTL ?\n\t\t\t'w[' + options.weekNumberTitle + ']' :\n\t\t\t'[' + options.weekNumberTitle + ']w';\n\t}\n\n};\n\n// TODO: make these computable properties in optionsModel\nfunction populateInstanceComputableOptions(options) {\n\t$.each(instanceComputableOptions, function(name, func) {\n\t\tif (options[name] == null) {\n\t\t\toptions[name] = func(options);\n\t\t}\n\t});\n}\n\n\n// Returns moment's internal locale data. If doesn't exist, returns English.\nfunction getMomentLocaleData(localeCode) {\n\treturn moment.localeData(localeCode) || moment.localeData('en');\n}\n\n\n// Initialize English by forcing computation of moment-derived options.\n// Also, sets it as the default.\nFC.locale('en', Calendar.englishDefaults);\n\n;;\n\nFC.sourceNormalizers = [];\nFC.sourceFetchers = [];\n\nvar ajaxDefaults = {\n\tdataType: 'json',\n\tcache: false\n};\n\nvar eventGUID = 1;\n\n\nfunction EventManager() { // assumed to be a calendar\n\tvar t = this;\n\n\n\t// exports\n\tt.requestEvents = requestEvents;\n\tt.reportEventChange = reportEventChange;\n\tt.isFetchNeeded = isFetchNeeded;\n\tt.fetchEvents = fetchEvents;\n\tt.fetchEventSources = fetchEventSources;\n\tt.refetchEvents = refetchEvents;\n\tt.refetchEventSources = refetchEventSources;\n\tt.getEventSources = getEventSources;\n\tt.getEventSourceById = getEventSourceById;\n\tt.addEventSource = addEventSource;\n\tt.removeEventSource = removeEventSource;\n\tt.removeEventSources = removeEventSources;\n\tt.updateEvent = updateEvent;\n\tt.updateEvents = updateEvents;\n\tt.renderEvent = renderEvent;\n\tt.renderEvents = renderEvents;\n\tt.removeEvents = removeEvents;\n\tt.clientEvents = clientEvents;\n\tt.mutateEvent = mutateEvent;\n\tt.normalizeEventDates = normalizeEventDates;\n\tt.normalizeEventTimes = normalizeEventTimes;\n\n\n\t// locals\n\tvar stickySource = { events: [] };\n\tvar sources = [ stickySource ];\n\tvar rangeStart, rangeEnd;\n\tvar pendingSourceCnt = 0; // outstanding fetch requests, max one per source\n\tvar cache = []; // holds events that have already been expanded\n\tvar prunedCache; // like cache, but only events that intersect with rangeStart/rangeEnd\n\n\n\t$.each(\n\t\t(t.opt('events') ? [ t.opt('events') ] : []).concat(t.opt('eventSources') || []),\n\t\tfunction(i, sourceInput) {\n\t\t\tvar source = buildEventSource(sourceInput);\n\t\t\tif (source) {\n\t\t\t\tsources.push(source);\n\t\t\t}\n\t\t}\n\t);\n\n\n\n\tfunction requestEvents(start, end) {\n\t\tif (!t.opt('lazyFetching') || isFetchNeeded(start, end)) {\n\t\t\treturn fetchEvents(start, end);\n\t\t}\n\t\telse {\n\t\t\treturn Promise.resolve(prunedCache);\n\t\t}\n\t}\n\n\n\tfunction reportEventChange() {\n\t\tprunedCache = filterEventsWithinRange(cache);\n\t\tt.trigger('eventsReset', prunedCache);\n\t}\n\n\n\tfunction filterEventsWithinRange(events) {\n\t\tvar filteredEvents = [];\n\t\tvar i, event;\n\n\t\tfor (i = 0; i < events.length; i++) {\n\t\t\tevent = events[i];\n\n\t\t\tif (\n\t\t\t\tevent.start.clone().stripZone() < rangeEnd &&\n\t\t\t\tt.getEventEnd(event).stripZone() > rangeStart\n\t\t\t) {\n\t\t\t\tfilteredEvents.push(event);\n\t\t\t}\n\t\t}\n\n\t\treturn filteredEvents;\n\t}\n\n\n\tt.getEventCache = function() {\n\t\treturn cache;\n\t};\n\n\n\n\t/* Fetching\n\t-----------------------------------------------------------------------------*/\n\n\n\t// start and end are assumed to be unzoned\n\tfunction isFetchNeeded(start, end) {\n\t\treturn !rangeStart || // nothing has been fetched yet?\n\t\t\tstart < rangeStart || end > rangeEnd; // is part of the new range outside of the old range?\n\t}\n\n\n\tfunction fetchEvents(start, end) {\n\t\trangeStart = start;\n\t\trangeEnd = end;\n\t\treturn refetchEvents();\n\t}\n\n\n\t// poorly named. fetches all sources with current `rangeStart` and `rangeEnd`.\n\tfunction refetchEvents() {\n\t\treturn fetchEventSources(sources, 'reset');\n\t}\n\n\n\t// poorly named. fetches a subset of event sources.\n\tfunction refetchEventSources(matchInputs) {\n\t\treturn fetchEventSources(getEventSourcesByMatchArray(matchInputs));\n\t}\n\n\n\t// expects an array of event source objects (the originals, not copies)\n\t// `specialFetchType` is an optimization parameter that affects purging of the event cache.\n\tfunction fetchEventSources(specificSources, specialFetchType) {\n\t\tvar i, source;\n\n\t\tif (specialFetchType === 'reset') {\n\t\t\tcache = [];\n\t\t}\n\t\telse if (specialFetchType !== 'add') {\n\t\t\tcache = excludeEventsBySources(cache, specificSources);\n\t\t}\n\n\t\tfor (i = 0; i < specificSources.length; i++) {\n\t\t\tsource = specificSources[i];\n\n\t\t\t// already-pending sources have already been accounted for in pendingSourceCnt\n\t\t\tif (source._status !== 'pending') {\n\t\t\t\tpendingSourceCnt++;\n\t\t\t}\n\n\t\t\tsource._fetchId = (source._fetchId || 0) + 1;\n\t\t\tsource._status = 'pending';\n\t\t}\n\n\t\tfor (i = 0; i < specificSources.length; i++) {\n\t\t\tsource = specificSources[i];\n\t\t\ttryFetchEventSource(source, source._fetchId);\n\t\t}\n\n\t\tif (pendingSourceCnt) {\n\t\t\treturn Promise.construct(function(resolve) {\n\t\t\t\tt.one('eventsReceived', resolve); // will send prunedCache\n\t\t\t});\n\t\t}\n\t\telse { // executed all synchronously, or no sources at all\n\t\t\treturn Promise.resolve(prunedCache);\n\t\t}\n\t}\n\n\n\t// fetches an event source and processes its result ONLY if it is still the current fetch.\n\t// caller is responsible for incrementing pendingSourceCnt first.\n\tfunction tryFetchEventSource(source, fetchId) {\n\t\t_fetchEventSource(source, function(eventInputs) {\n\t\t\tvar isArraySource = $.isArray(source.events);\n\t\t\tvar i, eventInput;\n\t\t\tvar abstractEvent;\n\n\t\t\tif (\n\t\t\t\t// is this the source's most recent fetch?\n\t\t\t\t// if not, rely on an upcoming fetch of this source to decrement pendingSourceCnt\n\t\t\t\tfetchId === source._fetchId &&\n\t\t\t\t// event source no longer valid?\n\t\t\t\tsource._status !== 'rejected'\n\t\t\t) {\n\t\t\t\tsource._status = 'resolved';\n\n\t\t\t\tif (eventInputs) {\n\t\t\t\t\tfor (i = 0; i < eventInputs.length; i++) {\n\t\t\t\t\t\teventInput = eventInputs[i];\n\n\t\t\t\t\t\tif (isArraySource) { // array sources have already been convert to Event Objects\n\t\t\t\t\t\t\tabstractEvent = eventInput;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tabstractEvent = buildEventFromInput(eventInput, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (abstractEvent) { // not false (an invalid event)\n\t\t\t\t\t\t\tcache.push.apply( // append\n\t\t\t\t\t\t\t\tcache,\n\t\t\t\t\t\t\t\texpandEvent(abstractEvent) // add individual expanded events to the cache\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdecrementPendingSourceCnt();\n\t\t\t}\n\t\t});\n\t}\n\n\n\tfunction rejectEventSource(source) {\n\t\tvar wasPending = source._status === 'pending';\n\n\t\tsource._status = 'rejected';\n\n\t\tif (wasPending) {\n\t\t\tdecrementPendingSourceCnt();\n\t\t}\n\t}\n\n\n\tfunction decrementPendingSourceCnt() {\n\t\tpendingSourceCnt--;\n\t\tif (!pendingSourceCnt) {\n\t\t\treportEventChange(cache); // updates prunedCache\n\t\t\tt.trigger('eventsReceived', prunedCache);\n\t\t}\n\t}\n\n\n\tfunction _fetchEventSource(source, callback) {\n\t\tvar i;\n\t\tvar fetchers = FC.sourceFetchers;\n\t\tvar res;\n\n\t\tfor (i=0; i= eventStart && innerSpan.end <= eventEnd;\n};\n\n\n// Returns a list of events that the given event should be compared against when being considered for a move to\n// the specified span. Attached to the Calendar's prototype because EventManager is a mixin for a Calendar.\nCalendar.prototype.getPeerEvents = function(span, event) {\n\tvar cache = this.getEventCache();\n\tvar peerEvents = [];\n\tvar i, otherEvent;\n\n\tfor (i = 0; i < cache.length; i++) {\n\t\totherEvent = cache[i];\n\t\tif (\n\t\t\t!event ||\n\t\t\tevent._id !== otherEvent._id // don't compare the event to itself or other related [repeating] events\n\t\t) {\n\t\t\tpeerEvents.push(otherEvent);\n\t\t}\n\t}\n\n\treturn peerEvents;\n};\n\n\n// updates the \"backup\" properties, which are preserved in order to compute diffs later on.\nfunction backupEventDates(event) {\n\tevent._allDay = event.allDay;\n\tevent._start = event.start.clone();\n\tevent._end = event.end ? event.end.clone() : null;\n}\n\n\n/* Overlapping / Constraining\n-----------------------------------------------------------------------------------------*/\n\n\n// Determines if the given event can be relocated to the given span (unzoned start/end with other misc data)\nCalendar.prototype.isEventSpanAllowed = function(span, event) {\n\tvar source = event.source || {};\n\tvar eventAllowFunc = this.opt('eventAllow');\n\n\tvar constraint = firstDefined(\n\t\tevent.constraint,\n\t\tsource.constraint,\n\t\tthis.opt('eventConstraint')\n\t);\n\n\tvar overlap = firstDefined(\n\t\tevent.overlap,\n\t\tsource.overlap,\n\t\tthis.opt('eventOverlap')\n\t);\n\n\treturn this.isSpanAllowed(span, constraint, overlap, event) &&\n\t\t(!eventAllowFunc || eventAllowFunc(span, event) !== false);\n};\n\n\n// Determines if an external event can be relocated to the given span (unzoned start/end with other misc data)\nCalendar.prototype.isExternalSpanAllowed = function(eventSpan, eventLocation, eventProps) {\n\tvar eventInput;\n\tvar event;\n\n\t// note: very similar logic is in View's reportExternalDrop\n\tif (eventProps) {\n\t\teventInput = $.extend({}, eventProps, eventLocation);\n\t\tevent = this.expandEvent(\n\t\t\tthis.buildEventFromInput(eventInput)\n\t\t)[0];\n\t}\n\n\tif (event) {\n\t\treturn this.isEventSpanAllowed(eventSpan, event);\n\t}\n\telse { // treat it as a selection\n\n\t\treturn this.isSelectionSpanAllowed(eventSpan);\n\t}\n};\n\n\n// Determines the given span (unzoned start/end with other misc data) can be selected.\nCalendar.prototype.isSelectionSpanAllowed = function(span) {\n\tvar selectAllowFunc = this.opt('selectAllow');\n\n\treturn this.isSpanAllowed(span, this.opt('selectConstraint'), this.opt('selectOverlap')) &&\n\t\t(!selectAllowFunc || selectAllowFunc(span) !== false);\n};\n\n\n// Returns true if the given span (caused by an event drop/resize or a selection) is allowed to exist\n// according to the constraint/overlap settings.\n// `event` is not required if checking a selection.\nCalendar.prototype.isSpanAllowed = function(span, constraint, overlap, event) {\n\tvar constraintEvents;\n\tvar anyContainment;\n\tvar peerEvents;\n\tvar i, peerEvent;\n\tvar peerOverlap;\n\n\t// the range must be fully contained by at least one of produced constraint events\n\tif (constraint != null) {\n\n\t\t// not treated as an event! intermediate data structure\n\t\t// TODO: use ranges in the future\n\t\tconstraintEvents = this.constraintToEvents(constraint);\n\t\tif (constraintEvents) { // not invalid\n\n\t\t\tanyContainment = false;\n\t\t\tfor (i = 0; i < constraintEvents.length; i++) {\n\t\t\t\tif (this.spanContainsSpan(constraintEvents[i], span)) {\n\t\t\t\t\tanyContainment = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!anyContainment) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tpeerEvents = this.getPeerEvents(span, event);\n\n\tfor (i = 0; i < peerEvents.length; i++) {\n\t\tpeerEvent = peerEvents[i];\n\n\t\t// there needs to be an actual intersection before disallowing anything\n\t\tif (this.eventIntersectsRange(peerEvent, span)) {\n\n\t\t\t// evaluate overlap for the given range and short-circuit if necessary\n\t\t\tif (overlap === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// if the event's overlap is a test function, pass the peer event in question as the first param\n\t\t\telse if (typeof overlap === 'function' && !overlap(peerEvent, event)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// if we are computing if the given range is allowable for an event, consider the other event's\n\t\t\t// EventObject-specific or Source-specific `overlap` property\n\t\t\tif (event) {\n\t\t\t\tpeerOverlap = firstDefined(\n\t\t\t\t\tpeerEvent.overlap,\n\t\t\t\t\t(peerEvent.source || {}).overlap\n\t\t\t\t\t// we already considered the global `eventOverlap`\n\t\t\t\t);\n\t\t\t\tif (peerOverlap === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// if the peer event's overlap is a test function, pass the subject event as the first param\n\t\t\t\tif (typeof peerOverlap === 'function' && !peerOverlap(event, peerEvent)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n\n// Given an event input from the API, produces an array of event objects. Possible event inputs:\n// 'businessHours'\n// An event ID (number or string)\n// An object with specific start/end dates or a recurring event (like what businessHours accepts)\nCalendar.prototype.constraintToEvents = function(constraintInput) {\n\n\tif (constraintInput === 'businessHours') {\n\t\treturn this.getCurrentBusinessHourEvents();\n\t}\n\n\tif (typeof constraintInput === 'object') {\n\t\tif (constraintInput.start != null) { // needs to be event-like input\n\t\t\treturn this.expandEvent(this.buildEventFromInput(constraintInput));\n\t\t}\n\t\telse {\n\t\t\treturn null; // invalid\n\t\t}\n\t}\n\n\treturn this.clientEvents(constraintInput); // probably an ID\n};\n\n\n// Does the event's date range intersect with the given range?\n// start/end already assumed to have stripped zones :(\nCalendar.prototype.eventIntersectsRange = function(event, range) {\n\tvar eventStart = event.start.clone().stripZone();\n\tvar eventEnd = this.getEventEnd(event).stripZone();\n\n\treturn range.start < eventEnd && range.end > eventStart;\n};\n\n\n/* Business Hours\n-----------------------------------------------------------------------------------------*/\n\nvar BUSINESS_HOUR_EVENT_DEFAULTS = {\n\tid: '_fcBusinessHours', // will relate events from different calls to expandEvent\n\tstart: '09:00',\n\tend: '17:00',\n\tdow: [ 1, 2, 3, 4, 5 ], // monday - friday\n\trendering: 'inverse-background'\n\t// classNames are defined in businessHoursSegClasses\n};\n\n// Return events objects for business hours within the current view.\n// Abuse of our event system :(\nCalendar.prototype.getCurrentBusinessHourEvents = function(wholeDay) {\n\treturn this.computeBusinessHourEvents(wholeDay, this.opt('businessHours'));\n};\n\n// Given a raw input value from options, return events objects for business hours within the current view.\nCalendar.prototype.computeBusinessHourEvents = function(wholeDay, input) {\n\tif (input === true) {\n\t\treturn this.expandBusinessHourEvents(wholeDay, [ {} ]);\n\t}\n\telse if ($.isPlainObject(input)) {\n\t\treturn this.expandBusinessHourEvents(wholeDay, [ input ]);\n\t}\n\telse if ($.isArray(input)) {\n\t\treturn this.expandBusinessHourEvents(wholeDay, input, true);\n\t}\n\telse {\n\t\treturn [];\n\t}\n};\n\n// inputs expected to be an array of objects.\n// if ignoreNoDow is true, will ignore entries that don't specify a day-of-week (dow) key.\nCalendar.prototype.expandBusinessHourEvents = function(wholeDay, inputs, ignoreNoDow) {\n\tvar view = this.getView();\n\tvar events = [];\n\tvar i, input;\n\n\tfor (i = 0; i < inputs.length; i++) {\n\t\tinput = inputs[i];\n\n\t\tif (ignoreNoDow && !input.dow) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// give defaults. will make a copy\n\t\tinput = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, input);\n\n\t\t// if a whole-day series is requested, clear the start/end times\n\t\tif (wholeDay) {\n\t\t\tinput.start = null;\n\t\t\tinput.end = null;\n\t\t}\n\n\t\tevents.push.apply(events, // append\n\t\t\tthis.expandEvent(\n\t\t\t\tthis.buildEventFromInput(input),\n\t\t\t\tview.activeRange.start,\n\t\t\t\tview.activeRange.end\n\t\t\t)\n\t\t);\n\t}\n\n\treturn events;\n};\n\n;;\n\n/* An abstract class for the \"basic\" views, as well as month view. Renders one or more rows of day cells.\n----------------------------------------------------------------------------------------------------------------------*/\n// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\n// It is responsible for managing width/height.\n\nvar BasicView = FC.BasicView = View.extend({\n\n\tscroller: null,\n\n\tdayGridClass: DayGrid, // class the dayGrid will be instantiated from (overridable by subclasses)\n\tdayGrid: null, // the main subcomponent that does most of the heavy lifting\n\n\tdayNumbersVisible: false, // display day numbers on each day cell?\n\tcolWeekNumbersVisible: false, // display week numbers along the side?\n\tcellWeekNumbersVisible: false, // display week numbers in day cell?\n\n\tweekNumberWidth: null, // width of all the week-number cells running down the side\n\n\theadContainerEl: null, // div that hold's the dayGrid's rendered date header\n\theadRowEl: null, // the fake row element of the day-of-week header\n\n\n\tinitialize: function() {\n\t\tthis.dayGrid = this.instantiateDayGrid();\n\n\t\tthis.scroller = new Scroller({\n\t\t\toverflowX: 'hidden',\n\t\t\toverflowY: 'auto'\n\t\t});\n\t},\n\n\n\t// Generates the DayGrid object this view needs. Draws from this.dayGridClass\n\tinstantiateDayGrid: function() {\n\t\t// generate a subclass on the fly with BasicView-specific behavior\n\t\t// TODO: cache this subclass\n\t\tvar subclass = this.dayGridClass.extend(basicDayGridMethods);\n\n\t\treturn new subclass(this);\n\t},\n\n\n\t// Computes the date range that will be rendered.\n\tbuildRenderRange: function(currentRange, currentRangeUnit) {\n\t\tvar renderRange = View.prototype.buildRenderRange.apply(this, arguments);\n\n\t\t// year and month views should be aligned with weeks. this is already done for week\n\t\tif (/^(year|month)$/.test(currentRangeUnit)) {\n\t\t\trenderRange.start.startOf('week');\n\n\t\t\t// make end-of-week if not already\n\t\t\tif (renderRange.end.weekday()) {\n\t\t\t\trenderRange.end.add(1, 'week').startOf('week'); // exclusively move backwards\n\t\t\t}\n\t\t}\n\n\t\treturn this.trimHiddenDays(renderRange);\n\t},\n\n\n\t// Renders the view into `this.el`, which should already be assigned\n\trenderDates: function() {\n\n\t\tthis.dayGrid.breakOnWeeks = /year|month|week/.test(this.currentRangeUnit); // do before Grid::setRange\n\t\tthis.dayGrid.setRange(this.renderRange);\n\n\t\tthis.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible\n\t\tif (this.opt('weekNumbers')) {\n\t\t\tif (this.opt('weekNumbersWithinDays')) {\n\t\t\t\tthis.cellWeekNumbersVisible = true;\n\t\t\t\tthis.colWeekNumbersVisible = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.cellWeekNumbersVisible = false;\n\t\t\t\tthis.colWeekNumbersVisible = true;\n\t\t\t};\n\t\t}\n\t\tthis.dayGrid.numbersVisible = this.dayNumbersVisible ||\n\t\t\tthis.cellWeekNumbersVisible || this.colWeekNumbersVisible;\n\n\t\tthis.el.addClass('fc-basic-view').html(this.renderSkeletonHtml());\n\t\tthis.renderHead();\n\n\t\tthis.scroller.render();\n\t\tvar dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container');\n\t\tvar dayGridEl = $('
').appendTo(dayGridContainerEl);\n\t\tthis.el.find('.fc-body > tr > td').append(dayGridContainerEl);\n\n\t\tthis.dayGrid.setElement(dayGridEl);\n\t\tthis.dayGrid.renderDates(this.hasRigidRows());\n\t},\n\n\n\t// render the day-of-week headers\n\trenderHead: function() {\n\t\tthis.headContainerEl =\n\t\t\tthis.el.find('.fc-head-container')\n\t\t\t\t.html(this.dayGrid.renderHeadHtml());\n\t\tthis.headRowEl = this.headContainerEl.find('.fc-row');\n\t},\n\n\n\t// Unrenders the content of the view. Since we haven't separated skeleton rendering from date rendering,\n\t// always completely kill the dayGrid's rendering.\n\tunrenderDates: function() {\n\t\tthis.dayGrid.unrenderDates();\n\t\tthis.dayGrid.removeElement();\n\t\tthis.scroller.destroy();\n\t},\n\n\n\trenderBusinessHours: function() {\n\t\tthis.dayGrid.renderBusinessHours();\n\t},\n\n\n\tunrenderBusinessHours: function() {\n\t\tthis.dayGrid.unrenderBusinessHours();\n\t},\n\n\n\t// Builds the HTML skeleton for the view.\n\t// The day-grid component will render inside of a container defined by this HTML.\n\trenderSkeletonHtml: function() {\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t'
';\n\t},\n\n\n\t// Generates an HTML attribute string for setting the width of the week number column, if it is known\n\tweekNumberStyleAttr: function() {\n\t\tif (this.weekNumberWidth !== null) {\n\t\t\treturn 'style=\"width:' + this.weekNumberWidth + 'px\"';\n\t\t}\n\t\treturn '';\n\t},\n\n\n\t// Determines whether each row should have a constant height\n\thasRigidRows: function() {\n\t\tvar eventLimit = this.opt('eventLimit');\n\t\treturn eventLimit && typeof eventLimit !== 'number';\n\t},\n\n\n\t/* Dimensions\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Refreshes the horizontal dimensions of the view\n\tupdateWidth: function() {\n\t\tif (this.colWeekNumbersVisible) {\n\t\t\t// Make sure all week number cells running down the side have the same width.\n\t\t\t// Record the width for cells created later.\n\t\t\tthis.weekNumberWidth = matchCellWidths(\n\t\t\t\tthis.el.find('.fc-week-number')\n\t\t\t);\n\t\t}\n\t},\n\n\n\t// Adjusts the vertical dimensions of the view to the specified values\n\tsetHeight: function(totalHeight, isAuto) {\n\t\tvar eventLimit = this.opt('eventLimit');\n\t\tvar scrollerHeight;\n\t\tvar scrollbarWidths;\n\n\t\t// reset all heights to be natural\n\t\tthis.scroller.clear();\n\t\tuncompensateScroll(this.headRowEl);\n\n\t\tthis.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\n\n\t\t// is the event limit a constant level number?\n\t\tif (eventLimit && typeof eventLimit === 'number') {\n\t\t\tthis.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\n\t\t}\n\n\t\t// distribute the height to the rows\n\t\t// (totalHeight is a \"recommended\" value if isAuto)\n\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\tthis.setGridHeight(scrollerHeight, isAuto);\n\n\t\t// is the event limit dynamically calculated?\n\t\tif (eventLimit && typeof eventLimit !== 'number') {\n\t\t\tthis.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\n\t\t}\n\n\t\tif (!isAuto) { // should we force dimensions of the scroll container?\n\n\t\t\tthis.scroller.setHeight(scrollerHeight);\n\t\t\tscrollbarWidths = this.scroller.getScrollbarWidths();\n\n\t\t\tif (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?\n\n\t\t\t\tcompensateScroll(this.headRowEl, scrollbarWidths);\n\n\t\t\t\t// doing the scrollbar compensation might have created text overflow which created more height. redo\n\t\t\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\t\t\tthis.scroller.setHeight(scrollerHeight);\n\t\t\t}\n\n\t\t\t// guarantees the same scrollbar widths\n\t\t\tthis.scroller.lockOverflow(scrollbarWidths);\n\t\t}\n\t},\n\n\n\t// given a desired total height of the view, returns what the height of the scroller should be\n\tcomputeScrollerHeight: function(totalHeight) {\n\t\treturn totalHeight -\n\t\t\tsubtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\n\t},\n\n\n\t// Sets the height of just the DayGrid component in this view\n\tsetGridHeight: function(height, isAuto) {\n\t\tif (isAuto) {\n\t\t\tundistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\n\t\t}\n\t\telse {\n\t\t\tdistributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\n\t\t}\n\t},\n\n\n\t/* Scroll\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tcomputeInitialDateScroll: function() {\n\t\treturn { top: 0 };\n\t},\n\n\n\tqueryDateScroll: function() {\n\t\treturn { top: this.scroller.getScrollTop() };\n\t},\n\n\n\tapplyDateScroll: function(scroll) {\n\t\tif (scroll.top !== undefined) {\n\t\t\tthis.scroller.setScrollTop(scroll.top);\n\t\t}\n\t},\n\n\n\t/* Hit Areas\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// forward all hit-related method calls to dayGrid\n\n\n\thitsNeeded: function() {\n\t\tthis.dayGrid.hitsNeeded();\n\t},\n\n\n\thitsNotNeeded: function() {\n\t\tthis.dayGrid.hitsNotNeeded();\n\t},\n\n\n\tprepareHits: function() {\n\t\tthis.dayGrid.prepareHits();\n\t},\n\n\n\treleaseHits: function() {\n\t\tthis.dayGrid.releaseHits();\n\t},\n\n\n\tqueryHit: function(left, top) {\n\t\treturn this.dayGrid.queryHit(left, top);\n\t},\n\n\n\tgetHitSpan: function(hit) {\n\t\treturn this.dayGrid.getHitSpan(hit);\n\t},\n\n\n\tgetHitEl: function(hit) {\n\t\treturn this.dayGrid.getHitEl(hit);\n\t},\n\n\n\t/* Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders the given events onto the view and populates the segments array\n\trenderEvents: function(events) {\n\t\tthis.dayGrid.renderEvents(events);\n\n\t\tthis.updateHeight(); // must compensate for events that overflow the row\n\t},\n\n\n\t// Retrieves all segment objects that are rendered in the view\n\tgetEventSegs: function() {\n\t\treturn this.dayGrid.getEventSegs();\n\t},\n\n\n\t// Unrenders all event elements and clears internal segment data\n\tunrenderEvents: function() {\n\t\tthis.dayGrid.unrenderEvents();\n\n\t\t// we DON'T need to call updateHeight() because\n\t\t// a renderEvents() call always happens after this, which will eventually call updateHeight()\n\t},\n\n\n\t/* Dragging (for both events and external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// A returned value of `true` signals that a mock \"helper\" event has been rendered.\n\trenderDrag: function(dropLocation, seg) {\n\t\treturn this.dayGrid.renderDrag(dropLocation, seg);\n\t},\n\n\n\tunrenderDrag: function() {\n\t\tthis.dayGrid.unrenderDrag();\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection\n\trenderSelection: function(span) {\n\t\tthis.dayGrid.renderSelection(span);\n\t},\n\n\n\t// Unrenders a visual indications of a selection\n\tunrenderSelection: function() {\n\t\tthis.dayGrid.unrenderSelection();\n\t}\n\n});\n\n\n// Methods that will customize the rendering behavior of the BasicView's dayGrid\nvar basicDayGridMethods = {\n\n\n\t// Generates the HTML that will go before the day-of week header cells\n\trenderHeadIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\tif (view.colWeekNumbersVisible) {\n\t\t\treturn '' +\n\t\t\t\t'' +\n\t\t\t\t\t'' + // needed for matchCellWidths\n\t\t\t\t\t\thtmlEscape(view.opt('weekNumberTitle')) +\n\t\t\t\t\t'' +\n\t\t\t\t'';\n\t\t}\n\n\t\treturn '';\n\t},\n\n\n\t// Generates the HTML that will go before content-skeleton cells that display the day/week numbers\n\trenderNumberIntroHtml: function(row) {\n\t\tvar view = this.view;\n\t\tvar weekStart = this.getCellDate(row, 0);\n\n\t\tif (view.colWeekNumbersVisible) {\n\t\t\treturn '' +\n\t\t\t\t'' +\n\t\t\t\t\tview.buildGotoAnchorHtml( // aside from link, important for matchCellWidths\n\t\t\t\t\t\t{ date: weekStart, type: 'week', forceOff: this.colCnt === 1 },\n\t\t\t\t\t\tweekStart.format('w') // inner HTML\n\t\t\t\t\t) +\n\t\t\t\t'';\n\t\t}\n\n\t\treturn '';\n\t},\n\n\n\t// Generates the HTML that goes before the day bg cells for each day-row\n\trenderBgIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\tif (view.colWeekNumbersVisible) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn '';\n\t},\n\n\n\t// Generates the HTML that goes before every other type of row generated by DayGrid.\n\t// Affects helper-skeleton and highlight-skeleton rows.\n\trenderIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\tif (view.colWeekNumbersVisible) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn '';\n\t}\n\n};\n\n;;\n\n/* A month view with day cells running in rows (one-per-week) and columns\n----------------------------------------------------------------------------------------------------------------------*/\n\nvar MonthView = FC.MonthView = BasicView.extend({\n\n\n\t// Computes the date range that will be rendered.\n\tbuildRenderRange: function() {\n\t\tvar renderRange = BasicView.prototype.buildRenderRange.apply(this, arguments);\n\t\tvar rowCnt;\n\n\t\t// ensure 6 weeks\n\t\tif (this.isFixedWeeks()) {\n\t\t\trowCnt = Math.ceil( // could be partial weeks due to hiddenDays\n\t\t\t\trenderRange.end.diff(renderRange.start, 'weeks', true) // dontRound=true\n\t\t\t);\n\t\t\trenderRange.end.add(6 - rowCnt, 'weeks');\n\t\t}\n\n\t\treturn renderRange;\n\t},\n\n\n\t// Overrides the default BasicView behavior to have special multi-week auto-height logic\n\tsetGridHeight: function(height, isAuto) {\n\n\t\t// if auto, make the height of each row the height that it would be if there were 6 weeks\n\t\tif (isAuto) {\n\t\t\theight *= this.rowCnt / 6;\n\t\t}\n\n\t\tdistributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\n\t},\n\n\n\tisFixedWeeks: function() {\n\t\treturn this.opt('fixedWeekCount');\n\t}\n\n});\n\n;;\n\nfcViews.basic = {\n\t'class': BasicView\n};\n\nfcViews.basicDay = {\n\ttype: 'basic',\n\tduration: { days: 1 }\n};\n\nfcViews.basicWeek = {\n\ttype: 'basic',\n\tduration: { weeks: 1 }\n};\n\nfcViews.month = {\n\t'class': MonthView,\n\tduration: { months: 1 }, // important for prev/next\n\tdefaults: {\n\t\tfixedWeekCount: true\n\t}\n};\n;;\n\n/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.\n----------------------------------------------------------------------------------------------------------------------*/\n// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\n// Responsible for managing width/height.\n\nvar AgendaView = FC.AgendaView = View.extend({\n\n\tscroller: null,\n\n\ttimeGridClass: TimeGrid, // class used to instantiate the timeGrid. subclasses can override\n\ttimeGrid: null, // the main time-grid subcomponent of this view\n\n\tdayGridClass: DayGrid, // class used to instantiate the dayGrid. subclasses can override\n\tdayGrid: null, // the \"all-day\" subcomponent. if all-day is turned off, this will be null\n\n\taxisWidth: null, // the width of the time axis running down the side\n\n\theadContainerEl: null, // div that hold's the timeGrid's rendered date header\n\tnoScrollRowEls: null, // set of fake row elements that must compensate when scroller has scrollbars\n\n\t// when the time-grid isn't tall enough to occupy the given height, we render an
underneath\n\tbottomRuleEl: null,\n\n\t// indicates that minTime/maxTime affects rendering\n\tusesMinMaxTime: true,\n\n\n\tinitialize: function() {\n\t\tthis.timeGrid = this.instantiateTimeGrid();\n\n\t\tif (this.opt('allDaySlot')) { // should we display the \"all-day\" area?\n\t\t\tthis.dayGrid = this.instantiateDayGrid(); // the all-day subcomponent of this view\n\t\t}\n\n\t\tthis.scroller = new Scroller({\n\t\t\toverflowX: 'hidden',\n\t\t\toverflowY: 'auto'\n\t\t});\n\t},\n\n\n\t// Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass\n\tinstantiateTimeGrid: function() {\n\t\tvar subclass = this.timeGridClass.extend(agendaTimeGridMethods);\n\n\t\treturn new subclass(this);\n\t},\n\n\n\t// Instantiates the DayGrid object this view might need. Draws from this.dayGridClass\n\tinstantiateDayGrid: function() {\n\t\tvar subclass = this.dayGridClass.extend(agendaDayGridMethods);\n\n\t\treturn new subclass(this);\n\t},\n\n\n\t/* Rendering\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders the view into `this.el`, which has already been assigned\n\trenderDates: function() {\n\n\t\tthis.timeGrid.setRange(this.renderRange);\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.setRange(this.renderRange);\n\t\t}\n\n\t\tthis.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());\n\t\tthis.renderHead();\n\n\t\tthis.scroller.render();\n\t\tvar timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container');\n\t\tvar timeGridEl = $('
').appendTo(timeGridWrapEl);\n\t\tthis.el.find('.fc-body > tr > td').append(timeGridWrapEl);\n\n\t\tthis.timeGrid.setElement(timeGridEl);\n\t\tthis.timeGrid.renderDates();\n\n\t\t// the
that sometimes displays under the time-grid\n\t\tthis.bottomRuleEl = $('
')\n\t\t\t.appendTo(this.timeGrid.el); // inject it into the time-grid\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.setElement(this.el.find('.fc-day-grid'));\n\t\t\tthis.dayGrid.renderDates();\n\n\t\t\t// have the day-grid extend it's coordinate area over the
dividing the two grids\n\t\t\tthis.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();\n\t\t}\n\n\t\tthis.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller\n\t},\n\n\n\t// render the day-of-week headers\n\trenderHead: function() {\n\t\tthis.headContainerEl =\n\t\t\tthis.el.find('.fc-head-container')\n\t\t\t\t.html(this.timeGrid.renderHeadHtml());\n\t},\n\n\n\t// Unrenders the content of the view. Since we haven't separated skeleton rendering from date rendering,\n\t// always completely kill each grid's rendering.\n\tunrenderDates: function() {\n\t\tthis.timeGrid.unrenderDates();\n\t\tthis.timeGrid.removeElement();\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.unrenderDates();\n\t\t\tthis.dayGrid.removeElement();\n\t\t}\n\n\t\tthis.scroller.destroy();\n\t},\n\n\n\t// Builds the HTML skeleton for the view.\n\t// The day-grid and time-grid components will render inside containers defined by this HTML.\n\trenderSkeletonHtml: function() {\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t'
' +\n\t\t\t\t\t\t\t(this.dayGrid ?\n\t\t\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t\t'
' :\n\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t) +\n\t\t\t\t\t\t'
';\n\t},\n\n\n\t// Generates an HTML attribute string for setting the width of the axis, if it is known\n\taxisStyleAttr: function() {\n\t\tif (this.axisWidth !== null) {\n\t\t\t return 'style=\"width:' + this.axisWidth + 'px\"';\n\t\t}\n\t\treturn '';\n\t},\n\n\n\t/* Business Hours\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\trenderBusinessHours: function() {\n\t\tthis.timeGrid.renderBusinessHours();\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.renderBusinessHours();\n\t\t}\n\t},\n\n\n\tunrenderBusinessHours: function() {\n\t\tthis.timeGrid.unrenderBusinessHours();\n\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.unrenderBusinessHours();\n\t\t}\n\t},\n\n\n\t/* Now Indicator\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tgetNowIndicatorUnit: function() {\n\t\treturn this.timeGrid.getNowIndicatorUnit();\n\t},\n\n\n\trenderNowIndicator: function(date) {\n\t\tthis.timeGrid.renderNowIndicator(date);\n\t},\n\n\n\tunrenderNowIndicator: function() {\n\t\tthis.timeGrid.unrenderNowIndicator();\n\t},\n\n\n\t/* Dimensions\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\tupdateSize: function(isResize) {\n\t\tthis.timeGrid.updateSize(isResize);\n\n\t\tView.prototype.updateSize.call(this, isResize); // call the super-method\n\t},\n\n\n\t// Refreshes the horizontal dimensions of the view\n\tupdateWidth: function() {\n\t\t// make all axis cells line up, and record the width so newly created axis cells will have it\n\t\tthis.axisWidth = matchCellWidths(this.el.find('.fc-axis'));\n\t},\n\n\n\t// Adjusts the vertical dimensions of the view to the specified values\n\tsetHeight: function(totalHeight, isAuto) {\n\t\tvar eventLimit;\n\t\tvar scrollerHeight;\n\t\tvar scrollbarWidths;\n\n\t\t// reset all dimensions back to the original state\n\t\tthis.bottomRuleEl.hide(); // .show() will be called later if this
is necessary\n\t\tthis.scroller.clear(); // sets height to 'auto' and clears overflow\n\t\tuncompensateScroll(this.noScrollRowEls);\n\n\t\t// limit number of events in the all-day area\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\n\n\t\t\teventLimit = this.opt('eventLimit');\n\t\t\tif (eventLimit && typeof eventLimit !== 'number') {\n\t\t\t\teventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\n\t\t\t}\n\t\t\tif (eventLimit) {\n\t\t\t\tthis.dayGrid.limitRows(eventLimit);\n\t\t\t}\n\t\t}\n\n\t\tif (!isAuto) { // should we force dimensions of the scroll container?\n\n\t\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\t\tthis.scroller.setHeight(scrollerHeight);\n\t\t\tscrollbarWidths = this.scroller.getScrollbarWidths();\n\n\t\t\tif (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?\n\n\t\t\t\t// make the all-day and header rows lines up\n\t\t\t\tcompensateScroll(this.noScrollRowEls, scrollbarWidths);\n\n\t\t\t\t// the scrollbar compensation might have changed text flow, which might affect height, so recalculate\n\t\t\t\t// and reapply the desired height to the scroller.\n\t\t\t\tscrollerHeight = this.computeScrollerHeight(totalHeight);\n\t\t\t\tthis.scroller.setHeight(scrollerHeight);\n\t\t\t}\n\n\t\t\t// guarantees the same scrollbar widths\n\t\t\tthis.scroller.lockOverflow(scrollbarWidths);\n\n\t\t\t// if there's any space below the slats, show the horizontal rule.\n\t\t\t// this won't cause any new overflow, because lockOverflow already called.\n\t\t\tif (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {\n\t\t\t\tthis.bottomRuleEl.show();\n\t\t\t}\n\t\t}\n\t},\n\n\n\t// given a desired total height of the view, returns what the height of the scroller should be\n\tcomputeScrollerHeight: function(totalHeight) {\n\t\treturn totalHeight -\n\t\t\tsubtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\n\t},\n\n\n\t/* Scroll\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Computes the initial pre-configured scroll state prior to allowing the user to change it\n\tcomputeInitialDateScroll: function() {\n\t\tvar scrollTime = moment.duration(this.opt('scrollTime'));\n\t\tvar top = this.timeGrid.computeTimeTop(scrollTime);\n\n\t\t// zoom can give weird floating-point values. rather scroll a little bit further\n\t\ttop = Math.ceil(top);\n\n\t\tif (top) {\n\t\t\ttop++; // to overcome top border that slots beyond the first have. looks better\n\t\t}\n\n\t\treturn { top: top };\n\t},\n\n\n\tqueryDateScroll: function() {\n\t\treturn { top: this.scroller.getScrollTop() };\n\t},\n\n\n\tapplyDateScroll: function(scroll) {\n\t\tif (scroll.top !== undefined) {\n\t\t\tthis.scroller.setScrollTop(scroll.top);\n\t\t}\n\t},\n\n\n\t/* Hit Areas\n\t------------------------------------------------------------------------------------------------------------------*/\n\t// forward all hit-related method calls to the grids (dayGrid might not be defined)\n\n\n\thitsNeeded: function() {\n\t\tthis.timeGrid.hitsNeeded();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.hitsNeeded();\n\t\t}\n\t},\n\n\n\thitsNotNeeded: function() {\n\t\tthis.timeGrid.hitsNotNeeded();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.hitsNotNeeded();\n\t\t}\n\t},\n\n\n\tprepareHits: function() {\n\t\tthis.timeGrid.prepareHits();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.prepareHits();\n\t\t}\n\t},\n\n\n\treleaseHits: function() {\n\t\tthis.timeGrid.releaseHits();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.releaseHits();\n\t\t}\n\t},\n\n\n\tqueryHit: function(left, top) {\n\t\tvar hit = this.timeGrid.queryHit(left, top);\n\n\t\tif (!hit && this.dayGrid) {\n\t\t\thit = this.dayGrid.queryHit(left, top);\n\t\t}\n\n\t\treturn hit;\n\t},\n\n\n\tgetHitSpan: function(hit) {\n\t\t// TODO: hit.component is set as a hack to identify where the hit came from\n\t\treturn hit.component.getHitSpan(hit);\n\t},\n\n\n\tgetHitEl: function(hit) {\n\t\t// TODO: hit.component is set as a hack to identify where the hit came from\n\t\treturn hit.component.getHitEl(hit);\n\t},\n\n\n\t/* Events\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders events onto the view and populates the View's segment array\n\trenderEvents: function(events) {\n\t\tvar dayEvents = [];\n\t\tvar timedEvents = [];\n\t\tvar daySegs = [];\n\t\tvar timedSegs;\n\t\tvar i;\n\n\t\t// separate the events into all-day and timed\n\t\tfor (i = 0; i < events.length; i++) {\n\t\t\tif (events[i].allDay) {\n\t\t\t\tdayEvents.push(events[i]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttimedEvents.push(events[i]);\n\t\t\t}\n\t\t}\n\n\t\t// render the events in the subcomponents\n\t\ttimedSegs = this.timeGrid.renderEvents(timedEvents);\n\t\tif (this.dayGrid) {\n\t\t\tdaySegs = this.dayGrid.renderEvents(dayEvents);\n\t\t}\n\n\t\t// the all-day area is flexible and might have a lot of events, so shift the height\n\t\tthis.updateHeight();\n\t},\n\n\n\t// Retrieves all segment objects that are rendered in the view\n\tgetEventSegs: function() {\n\t\treturn this.timeGrid.getEventSegs().concat(\n\t\t\tthis.dayGrid ? this.dayGrid.getEventSegs() : []\n\t\t);\n\t},\n\n\n\t// Unrenders all event elements and clears internal segment data\n\tunrenderEvents: function() {\n\n\t\t// unrender the events in the subcomponents\n\t\tthis.timeGrid.unrenderEvents();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.unrenderEvents();\n\t\t}\n\n\t\t// we DON'T need to call updateHeight() because\n\t\t// a renderEvents() call always happens after this, which will eventually call updateHeight()\n\t},\n\n\n\t/* Dragging (for events and external elements)\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// A returned value of `true` signals that a mock \"helper\" event has been rendered.\n\trenderDrag: function(dropLocation, seg) {\n\t\tif (dropLocation.start.hasTime()) {\n\t\t\treturn this.timeGrid.renderDrag(dropLocation, seg);\n\t\t}\n\t\telse if (this.dayGrid) {\n\t\t\treturn this.dayGrid.renderDrag(dropLocation, seg);\n\t\t}\n\t},\n\n\n\tunrenderDrag: function() {\n\t\tthis.timeGrid.unrenderDrag();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.unrenderDrag();\n\t\t}\n\t},\n\n\n\t/* Selection\n\t------------------------------------------------------------------------------------------------------------------*/\n\n\n\t// Renders a visual indication of a selection\n\trenderSelection: function(span) {\n\t\tif (span.start.hasTime() || span.end.hasTime()) {\n\t\t\tthis.timeGrid.renderSelection(span);\n\t\t}\n\t\telse if (this.dayGrid) {\n\t\t\tthis.dayGrid.renderSelection(span);\n\t\t}\n\t},\n\n\n\t// Unrenders a visual indications of a selection\n\tunrenderSelection: function() {\n\t\tthis.timeGrid.unrenderSelection();\n\t\tif (this.dayGrid) {\n\t\t\tthis.dayGrid.unrenderSelection();\n\t\t}\n\t}\n\n});\n\n\n// Methods that will customize the rendering behavior of the AgendaView's timeGrid\n// TODO: move into TimeGrid\nvar agendaTimeGridMethods = {\n\n\n\t// Generates the HTML that will go before the day-of week header cells\n\trenderHeadIntroHtml: function() {\n\t\tvar view = this.view;\n\t\tvar weekText;\n\n\t\tif (view.opt('weekNumbers')) {\n\t\t\tweekText = this.start.format(view.opt('smallWeekFormat'));\n\n\t\t\treturn '' +\n\t\t\t\t'' +\n\t\t\t\t\tview.buildGotoAnchorHtml( // aside from link, important for matchCellWidths\n\t\t\t\t\t\t{ date: this.start, type: 'week', forceOff: this.colCnt > 1 },\n\t\t\t\t\t\thtmlEscape(weekText) // inner HTML\n\t\t\t\t\t) +\n\t\t\t\t'';\n\t\t}\n\t\telse {\n\t\t\treturn '';\n\t\t}\n\t},\n\n\n\t// Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\n\trenderBgIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\treturn '';\n\t},\n\n\n\t// Generates the HTML that goes before all other types of cells.\n\t// Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\n\trenderIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\treturn '';\n\t}\n\n};\n\n\n// Methods that will customize the rendering behavior of the AgendaView's dayGrid\nvar agendaDayGridMethods = {\n\n\n\t// Generates the HTML that goes before the all-day cells\n\trenderBgIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t'' + // needed for matchCellWidths\n\t\t\t\t\tview.getAllDayHtml() +\n\t\t\t\t'' +\n\t\t\t'';\n\t},\n\n\n\t// Generates the HTML that goes before all other types of cells.\n\t// Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\n\trenderIntroHtml: function() {\n\t\tvar view = this.view;\n\n\t\treturn '';\n\t}\n\n};\n\n;;\n\nvar AGENDA_ALL_DAY_EVENT_LIMIT = 5;\n\n// potential nice values for the slot-duration and interval-duration\n// from largest to smallest\nvar AGENDA_STOCK_SUB_DURATIONS = [\n\t{ hours: 1 },\n\t{ minutes: 30 },\n\t{ minutes: 15 },\n\t{ seconds: 30 },\n\t{ seconds: 15 }\n];\n\nfcViews.agenda = {\n\t'class': AgendaView,\n\tdefaults: {\n\t\tallDaySlot: true,\n\t\tslotDuration: '00:30:00',\n\t\tslotEventOverlap: true // a bad name. confused with overlap/constraint system\n\t}\n};\n\nfcViews.agendaDay = {\n\ttype: 'agenda',\n\tduration: { days: 1 }\n};\n\nfcViews.agendaWeek = {\n\ttype: 'agenda',\n\tduration: { weeks: 1 }\n};\n;;\n\n/*\nResponsible for the scroller, and forwarding event-related actions into the \"grid\"\n*/\nvar ListView = View.extend({\n\n\tgrid: null,\n\tscroller: null,\n\n\tinitialize: function() {\n\t\tthis.grid = new ListViewGrid(this);\n\t\tthis.scroller = new Scroller({\n\t\t\toverflowX: 'hidden',\n\t\t\toverflowY: 'auto'\n\t\t});\n\t},\n\n\trenderSkeleton: function() {\n\t\tthis.el.addClass(\n\t\t\t'fc-list-view ' +\n\t\t\tthis.widgetContentClass\n\t\t);\n\n\t\tthis.scroller.render();\n\t\tthis.scroller.el.appendTo(this.el);\n\n\t\tthis.grid.setElement(this.scroller.scrollEl);\n\t},\n\n\tunrenderSkeleton: function() {\n\t\tthis.scroller.destroy(); // will remove the Grid too\n\t},\n\n\tsetHeight: function(totalHeight, isAuto) {\n\t\tthis.scroller.setHeight(this.computeScrollerHeight(totalHeight));\n\t},\n\n\tcomputeScrollerHeight: function(totalHeight) {\n\t\treturn totalHeight -\n\t\t\tsubtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\n\t},\n\n\trenderDates: function() {\n\t\tthis.grid.setRange(this.renderRange); // needs to process range-related options\n\t},\n\n\trenderEvents: function(events) {\n\t\tthis.grid.renderEvents(events);\n\t},\n\n\tunrenderEvents: function() {\n\t\tthis.grid.unrenderEvents();\n\t},\n\n\tisEventResizable: function(event) {\n\t\treturn false;\n\t},\n\n\tisEventDraggable: function(event) {\n\t\treturn false;\n\t}\n\n});\n\n/*\nResponsible for event rendering and user-interaction.\nIts \"el\" is the inner-content of the above view's scroller.\n*/\nvar ListViewGrid = Grid.extend({\n\n\tsegSelector: '.fc-list-item', // which elements accept event actions\n\thasDayInteractions: false, // no day selection or day clicking\n\n\t// slices by day\n\tspanToSegs: function(span) {\n\t\tvar view = this.view;\n\t\tvar dayStart = view.renderRange.start.clone().time(0); // timed, so segs get times!\n\t\tvar dayIndex = 0;\n\t\tvar seg;\n\t\tvar segs = [];\n\n\t\twhile (dayStart < view.renderRange.end) {\n\n\t\t\tseg = intersectRanges(span, {\n\t\t\t\tstart: dayStart,\n\t\t\t\tend: dayStart.clone().add(1, 'day')\n\t\t\t});\n\n\t\t\tif (seg) {\n\t\t\t\tseg.dayIndex = dayIndex;\n\t\t\t\tsegs.push(seg);\n\t\t\t}\n\n\t\t\tdayStart.add(1, 'day');\n\t\t\tdayIndex++;\n\n\t\t\t// detect when span won't go fully into the next day,\n\t\t\t// and mutate the latest seg to the be the end.\n\t\t\tif (\n\t\t\t\tseg && !seg.isEnd && span.end.hasTime() &&\n\t\t\t\tspan.end < dayStart.clone().add(this.view.nextDayThreshold)\n\t\t\t) {\n\t\t\t\tseg.end = span.end.clone();\n\t\t\t\tseg.isEnd = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\t// like \"4:00am\"\n\tcomputeEventTimeFormat: function() {\n\t\treturn this.view.opt('mediumTimeFormat');\n\t},\n\n\t// for events with a url, the whole should be clickable,\n\t// but it's impossible to wrap with an tag. simulate this.\n\thandleSegClick: function(seg, ev) {\n\t\tvar url;\n\n\t\tGrid.prototype.handleSegClick.apply(this, arguments); // super. might prevent the default action\n\n\t\t// not clicking on or within an with an href\n\t\tif (!$(ev.target).closest('a[href]').length) {\n\t\t\turl = seg.event.url;\n\t\t\tif (url && !ev.isDefaultPrevented()) { // jsEvent not cancelled in handler\n\t\t\t\twindow.location.href = url; // simulate link click\n\t\t\t}\n\t\t}\n\t},\n\n\t// returns list of foreground segs that were actually rendered\n\trenderFgSegs: function(segs) {\n\t\tsegs = this.renderFgSegEls(segs); // might filter away hidden events\n\n\t\tif (!segs.length) {\n\t\t\tthis.renderEmptyMessage();\n\t\t}\n\t\telse {\n\t\t\tthis.renderSegList(segs);\n\t\t}\n\n\t\treturn segs;\n\t},\n\n\trenderEmptyMessage: function() {\n\t\tthis.el.html(\n\t\t\t'
' + // TODO: try less wraps\n\t\t\t'
' +\n\t\t\t'
' +\n\t\t\t\thtmlEscape(this.view.opt('noEventsMessage')) +\n\t\t\t'
' +\n\t\t\t'
' +\n\t\t\t'
'\n\t\t);\n\t},\n\n\t// render the event segments in the view\n\trenderSegList: function(allSegs) {\n\t\tvar segsByDay = this.groupSegsByDay(allSegs); // sparse array\n\t\tvar dayIndex;\n\t\tvar daySegs;\n\t\tvar i;\n\t\tvar tableEl = $('
');\n\t\tvar tbodyEl = tableEl.find('tbody');\n\n\t\tfor (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {\n\t\t\tdaySegs = segsByDay[dayIndex];\n\t\t\tif (daySegs) { // sparse array, so might be undefined\n\n\t\t\t\t// append a day header\n\t\t\t\ttbodyEl.append(this.dayHeaderHtml(\n\t\t\t\t\tthis.view.renderRange.start.clone().add(dayIndex, 'days')\n\t\t\t\t));\n\n\t\t\t\tthis.sortEventSegs(daySegs);\n\n\t\t\t\tfor (i = 0; i < daySegs.length; i++) {\n\t\t\t\t\ttbodyEl.append(daySegs[i].el); // append event row\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.el.empty().append(tableEl);\n\t},\n\n\t// Returns a sparse array of arrays, segs grouped by their dayIndex\n\tgroupSegsByDay: function(segs) {\n\t\tvar segsByDay = []; // sparse array\n\t\tvar i, seg;\n\n\t\tfor (i = 0; i < segs.length; i++) {\n\t\t\tseg = segs[i];\n\t\t\t(segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))\n\t\t\t\t.push(seg);\n\t\t}\n\n\t\treturn segsByDay;\n\t},\n\n\t// generates the HTML for the day headers that live amongst the event rows\n\tdayHeaderHtml: function(dayDate) {\n\t\tvar view = this.view;\n\t\tvar mainFormat = view.opt('listDayFormat');\n\t\tvar altFormat = view.opt('listDayAltFormat');\n\n\t\treturn '' +\n\t\t\t'' +\n\t\t\t\t(mainFormat ?\n\t\t\t\t\tview.buildGotoAnchorHtml(\n\t\t\t\t\t\tdayDate,\n\t\t\t\t\t\t{ 'class': 'fc-list-heading-main' },\n\t\t\t\t\t\thtmlEscape(dayDate.format(mainFormat)) // inner HTML\n\t\t\t\t\t) :\n\t\t\t\t\t'') +\n\t\t\t\t(altFormat ?\n\t\t\t\t\tview.buildGotoAnchorHtml(\n\t\t\t\t\t\tdayDate,\n\t\t\t\t\t\t{ 'class': 'fc-list-heading-alt' },\n\t\t\t\t\t\thtmlEscape(dayDate.format(altFormat)) // inner HTML\n\t\t\t\t\t) :\n\t\t\t\t\t'') +\n\t\t\t'' +\n\t\t'';\n\t},\n\n\t// generates the HTML for a single event row\n\tfgSegHtml: function(seg) {\n\t\tvar view = this.view;\n\t\tvar classes = [ 'fc-list-item' ].concat(this.getSegCustomClasses(seg));\n\t\tvar bgColor = this.getSegBackgroundColor(seg);\n\t\tvar event = seg.event;\n\t\tvar url = event.url;\n\t\tvar timeHtml;\n\n\t\tif (event.allDay) {\n\t\t\ttimeHtml = view.getAllDayHtml();\n\t\t}\n\t\telse if (view.isMultiDayEvent(event)) { // if the event appears to span more than one day\n\t\t\tif (seg.isStart || seg.isEnd) { // outer segment that probably lasts part of the day\n\t\t\t\ttimeHtml = htmlEscape(this.getEventTimeText(seg));\n\t\t\t}\n\t\t\telse { // inner segment that lasts the whole day\n\t\t\t\ttimeHtml = view.getAllDayHtml();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Display the normal time text for the *event's* times\n\t\t\ttimeHtml = htmlEscape(this.getEventTimeText(event));\n\t\t}\n\n\t\tif (url) {\n\t\t\tclasses.push('fc-has-url');\n\t\t}\n\n\t\treturn '' +\n\t\t\t(this.displayEventTime ?\n\t\t\t\t'' +\n\t\t\t\t\t(timeHtml || '') +\n\t\t\t\t'' :\n\t\t\t\t'') +\n\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t'' +\n\t\t\t'' +\n\t\t\t\t'' +\n\t\t\t\t\thtmlEscape(seg.event.title || '') +\n\t\t\t\t'
' +\n\t\t\t'' +\n\t\t'';\n\t}\n\n});\n\n;;\n\nfcViews.list = {\n\t'class': ListView,\n\tbuttonTextKey: 'list', // what to lookup in locale files\n\tdefaults: {\n\t\tbuttonText: 'list', // text to display for English\n\t\tlistDayFormat: 'LL', // like \"January 1, 2016\"\n\t\tnoEventsMessage: 'No events to display'\n\t}\n};\n\nfcViews.listDay = {\n\ttype: 'list',\n\tduration: { days: 1 },\n\tdefaults: {\n\t\tlistDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header\n\t}\n};\n\nfcViews.listWeek = {\n\ttype: 'list',\n\tduration: { weeks: 1 },\n\tdefaults: {\n\t\tlistDayFormat: 'dddd', // day-of-week is more important\n\t\tlistDayAltFormat: 'LL'\n\t}\n};\n\nfcViews.listMonth = {\n\ttype: 'list',\n\tduration: { month: 1 },\n\tdefaults: {\n\t\tlistDayAltFormat: 'dddd' // day-of-week is nice-to-have\n\t}\n};\n\nfcViews.listYear = {\n\ttype: 'list',\n\tduration: { year: 1 },\n\tdefaults: {\n\t\tlistDayAltFormat: 'dddd' // day-of-week is nice-to-have\n\t}\n};\n\n;;\n\r\nreturn FC; // export for Node/CommonJS\r\n});","!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\",\"moment\"],e):\"object\"==typeof exports?module.exports=e(require(\"jquery\"),require(\"moment\")):e(jQuery,moment)}(function(e,a){!function(){function e(e,a,t,i){var n=\"\";switch(t){case\"s\":return i?\"muutaman sekunnin\":\"muutama sekunti\";case\"m\":return i?\"minuutin\":\"minuutti\";case\"mm\":n=i?\"minuutin\":\"minuuttia\";break;case\"h\":return i?\"tunnin\":\"tunti\";case\"hh\":n=i?\"tunnin\":\"tuntia\";break;case\"d\":return i?\"päivän\":\"päivä\";case\"dd\":n=i?\"päivän\":\"päivää\";break;case\"M\":return i?\"kuukauden\":\"kuukausi\";case\"MM\":n=i?\"kuukauden\":\"kuukautta\";break;case\"y\":return i?\"vuoden\":\"vuosi\";case\"yy\":n=i?\"vuoden\":\"vuotta\"}return n=u(e,i)+\" \"+n}function u(e,a){return e<10?a?i[e]:t[e]:e}var t=\"nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän\".split(\" \"),i=[\"nolla\",\"yhden\",\"kahden\",\"kolmen\",\"neljän\",\"viiden\",\"kuuden\",t[7],t[8],t[9]];a.defineLocale(\"fi\",{months:\"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu\".split(\"_\"),monthsShort:\"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu\".split(\"_\"),weekdays:\"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai\".split(\"_\"),weekdaysShort:\"su_ma_ti_ke_to_pe_la\".split(\"_\"),weekdaysMin:\"su_ma_ti_ke_to_pe_la\".split(\"_\"),longDateFormat:{LT:\"HH.mm\",LTS:\"HH.mm.ss\",L:\"DD.MM.YYYY\",LL:\"Do MMMM[ta] YYYY\",LLL:\"Do MMMM[ta] YYYY, [klo] HH.mm\",LLLL:\"dddd, Do MMMM[ta] YYYY, [klo] HH.mm\",l:\"D.M.YYYY\",ll:\"Do MMM YYYY\",lll:\"Do MMM YYYY, [klo] HH.mm\",llll:\"ddd, Do MMM YYYY, [klo] HH.mm\"},calendar:{sameDay:\"[tänään] [klo] LT\",nextDay:\"[huomenna] [klo] LT\",nextWeek:\"dddd [klo] LT\",lastDay:\"[eilen] [klo] LT\",lastWeek:\"[viime] dddd[na] [klo] LT\",sameElse:\"L\"},relativeTime:{future:\"%s päästä\",past:\"%s sitten\",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\\d{1,2}\\./,ordinal:\"%d.\",week:{dow:1,doy:4}})}(),e.fullCalendar.datepickerLocale(\"fi\",\"fi\",{closeText:\"Sulje\",prevText:\"«Edellinen\",nextText:\"Seuraava»\",currentText:\"Tänään\",monthNames:[\"Tammikuu\",\"Helmikuu\",\"Maaliskuu\",\"Huhtikuu\",\"Toukokuu\",\"Kesäkuu\",\"Heinäkuu\",\"Elokuu\",\"Syyskuu\",\"Lokakuu\",\"Marraskuu\",\"Joulukuu\"],monthNamesShort:[\"Tammi\",\"Helmi\",\"Maalis\",\"Huhti\",\"Touko\",\"Kesä\",\"Heinä\",\"Elo\",\"Syys\",\"Loka\",\"Marras\",\"Joulu\"],dayNamesShort:[\"Su\",\"Ma\",\"Ti\",\"Ke\",\"To\",\"Pe\",\"La\"],dayNames:[\"Sunnuntai\",\"Maanantai\",\"Tiistai\",\"Keskiviikko\",\"Torstai\",\"Perjantai\",\"Lauantai\"],dayNamesMin:[\"Su\",\"Ma\",\"Ti\",\"Ke\",\"To\",\"Pe\",\"La\"],weekHeader:\"Vk\",dateFormat:\"d.m.yy\",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:\"\"}),e.fullCalendar.locale(\"fi\",{buttonText:{month:\"Kuukausi\",week:\"Viikko\",day:\"Päivä\",list:\"Tapahtumat\"},allDayText:\"Koko päivä\",eventLimitText:\"lisää\",noEventsMessage:\"Ei näytettäviä tapahtumia\"})});","/*!\n * jQuery JavaScript Library v3.2.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2017-03-20T18:59Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\n\n\n\tfunction DOMEval( code, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar script = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.2.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// As of jQuery 3.0, isNumeric is limited to\n\t\t// strings and numbers (primitives or objects)\n\t\t// that can be coerced to finite numbers (gh-2662)\n\t\tvar type = jQuery.type( obj );\n\t\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t\t// subtraction forces infinities to NaN\n\t\t\t!isNaN( obj - parseFloat( obj ) );\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android <=2.3 only (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE <=9 - 11, Edge 12 - 13\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Simple selector that can be filtered directly, removing non-Elements\n\tif ( risSimple.test( qualifier ) ) {\n\t\treturn jQuery.filter( qualifier, elements, not );\n\t}\n\n\t// Complex selector, compare the two sets, removing non-Elements\n\tqualifier = jQuery.filter( qualifier, elements );\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n if ( nodeName( elem, \"iframe\" ) ) {\n return elem.contentDocument;\n }\n\n // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n // Treat the template element as a regular one in browsers that\n // don't support it.\n if ( nodeName( elem, \"template\" ) ) {\n elem = elem.content || elem;\n }\n\n return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && jQuery.isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( jQuery.isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tjQuery.isFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tjQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ jQuery.camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ jQuery.camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( jQuery.camelCase );\n\t\t\t} else {\n\t\t\t\tkey = jQuery.camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
\" ],\n\tcol: [ 2, \"\", \"
\" ],\n\ttr: [ 2, \"\", \"
\" ],\n\ttd: [ 3, \"\", \"
\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: jQuery.isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( \">tbody\", elem )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdiv.style.cssText =\n\t\t\t\"box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocumentElement.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = divStyle.marginLeft === \"2px\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\t// Support: Android 4.0 - 4.3 only\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.marginRight = \"50%\";\n\t\tpixelMarginRightVal = divStyle.marginRight === \"4px\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tcontainer.appendChild( div );\n\n\tjQuery.extend( support, {\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelMarginRight: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i,\n\t\tval = 0;\n\n\t// If we already have the right measurement, avoid augmentation\n\tif ( extra === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\ti = 4;\n\n\t// Otherwise initialize for horizontal or vertical properties\n\t} else {\n\t\ti = name === \"width\" ? 1 : 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with computed style\n\tvar valueIsBorderBox,\n\t\tstyles = getStyles( elem ),\n\t\tval = curCSS( elem, name, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Computed unit is not pixels. Stop here and return.\n\tif ( rnumnonpx.test( val ) ) {\n\t\treturn val;\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = isBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t// Fall back to offsetWidth/Height when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\tif ( val === \"auto\" ) {\n\t\tval = elem[ \"offset\" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];\n\t}\n\n\t// Normalize \"\", auto, and prepare for extra\n\tval = parseFloat( val ) || 0;\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = extra && getStyles( elem ),\n\t\t\t\tsubtract = extra && augmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ name ] = value;\n\t\t\t\tvalue = jQuery.css( elem, name );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 13\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnothtmlwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnothtmlwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = jQuery.isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 13\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"