/*! CoverflowJS - v3.0.1 - 2014-03-06
* Copyright (c) 2014 Paul Baukus, Addy Osmani, Sebastian Sauer, Brandon Belvin, April Barrett; Licensed MIT */
/*! jQuery UI - v1.10.4 - 2014-01-17
* http://jqueryui.com
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.effect.js
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
!function(a,b){function c(b,c){var e,f,g,h=b.nodeName.toLowerCase();return"area"===h?(e=b.parentNode,f=e.name,b.href&&f&&"map"===e.nodeName.toLowerCase()?(g=a("img[usemap=#"+f+"]")[0],!!g&&d(g)):!1):(/input|select|textarea|button|object/.test(h)?!b.disabled:"a"===h?b.href||c:c)&&d(b)}function d(b){return a.expr.filters.visible(b)&&!a(b).parents().addBack().filter(function(){return"hidden"===a.css(this,"visibility")}).length}var e=0,f=/^ui-id-\d+$/;a.ui=a.ui||{},a.extend(a.ui,{version:"@VERSION",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),a.fn.extend({focus:function(b){return function(c,d){return"number"==typeof c?this.each(function(){var b=this;setTimeout(function(){a(b).focus(),d&&d.call(b)},c)}):b.apply(this,arguments)}}(a.fn.focus),scrollParent:function(){var b;return b=a.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.css(this,"position"))&&/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length)for(var d,e,f=a(this[0]);f.length&&f[0]!==document;){if(d=f.css("position"),("absolute"===d||"relative"===d||"fixed"===d)&&(e=parseInt(f.css("zIndex"),10),!isNaN(e)&&0!==e))return e;f=f.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})},removeUniqueId:function(){return this.each(function(){f.test(this.id)&&a(this).removeAttr("id")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a("<a>").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function e(b,c,d,e){return a.each(f,function(){c-=parseFloat(a.css(b,"padding"+this))||0,d&&(c-=parseFloat(a.css(b,"border"+this+"Width"))||0),e&&(c-=parseFloat(a.css(b,"margin"+this))||0)}),c}var f="Width"===d?["Left","Right"]:["Top","Bottom"],g=d.toLowerCase(),h={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?h["inner"+d].call(this):this.each(function(){a(this).css(g,e(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return"number"!=typeof b?h["outer"+d].call(this,b):this.each(function(){a(this).css(g,e(this,b,!0,c)+"px")})}}),a.fn.addBack||(a.fn.addBack=function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}),a("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(a.fn.removeData=function(b){return function(c){return arguments.length?b.call(this,a.camelCase(c)):b.call(this)}}(a.fn.removeData)),a.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),a.support.selectstart="onselectstart"in document.createElement("div"),a.fn.extend({disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e,f=a.ui[b].prototype;for(e in d)f.plugins[e]=f.plugins[e]||[],f.plugins[e].push([c,d[e]])},call:function(a,b,c){var d,e=a.plugins[b];if(e&&a.element[0].parentNode&&11!==a.element[0].parentNode.nodeType)for(d=0;d<e.length;d++)a.options[e[d][0]]&&e[d][1].apply(a.element,c)}},hasScroll:function(b,c){if("hidden"===a(b).css("overflow"))return!1;var d=c&&"left"===c?"scrollLeft":"scrollTop",e=!1;return b[d]>0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)}})}(jQuery),function(a,b){var c=0,d=Array.prototype.slice,e=a.cleanData;a.cleanData=function(b){for(var c,d=0;null!=(c=b[d]);d++)try{a(c).triggerHandler("remove")}catch(f){}e(b)},a.widget=function(b,c,d){var e,f,g,h,i={},j=b.split(".")[0];b=b.split(".")[1],e=j+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][e.toLowerCase()]=function(b){return!!a.data(b,e)},a[j]=a[j]||{},f=a[j][b],g=a[j][b]=function(a,b){return this._createWidget?void(arguments.length&&this._createWidget(a,b)):new g(a,b)},a.extend(g,f,{version:d.version,_proto:a.extend({},d),_childConstructors:[]}),h=new c,h.options=a.widget.extend({},h.options),a.each(d,function(b,d){return a.isFunction(d)?void(i[b]=function(){var a=function(){return c.prototype[b].apply(this,arguments)},e=function(a){return c.prototype[b].apply(this,a)};return function(){var b,c=this._super,f=this._superApply;return this._super=a,this._superApply=e,b=d.apply(this,arguments),this._super=c,this._superApply=f,b}}()):void(i[b]=d)}),g.prototype=a.widget.extend(h,{widgetEventPrefix:f?h.widgetEventPrefix||b:b},i,{constructor:g,namespace:j,widgetName:b,widgetFullName:e}),f?(a.each(f._childConstructors,function(b,c){var d=c.prototype;a.widget(d.namespace+"."+d.widgetName,g,c._proto)}),delete f._childConstructors):c._childConstructors.push(g),a.widget.bridge(b,g)},a.widget.extend=function(c){for(var e,f,g=d.call(arguments,1),h=0,i=g.length;i>h;h++)for(e in g[h])f=g[h][e],g[h].hasOwnProperty(e)&&f!==b&&(c[e]=a.isPlainObject(f)?a.isPlainObject(c[e])?a.widget.extend({},c[e],f):a.widget.extend({},f):f);return c},a.widget.bridge=function(c,e){var f=e.prototype.widgetFullName||c;a.fn[c]=function(g){var h="string"==typeof g,i=d.call(arguments,1),j=this;return g=!h&&i.length?a.widget.extend.apply(null,[g].concat(i)):g,this.each(h?function(){var d,e=a.data(this,f);return e?a.isFunction(e[g])&&"_"!==g.charAt(0)?(d=e[g].apply(e,i),d!==e&&d!==b?(j=d&&d.jquery?j.pushStack(d.get()):d,!1):void 0):a.error("no such method '"+g+"' for "+c+" widget instance"):a.error("cannot call methods on "+c+" prior to initialization; attempted to call method '"+g+"'")}:function(){var b=a.data(this,f);b?b.option(g||{})._init():a.data(this,f,new e(g,this))}),j}},a.Widget=function(){},a.Widget._childConstructors=[],a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(b,d){d=a(d||this.defaultElement||this)[0],this.element=a(d),this.uuid=c++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=a.widget.extend({},this.options,this._getCreateOptions(),b),this.bindings=a(),this.hoverable=a(),this.focusable=a(),d!==this&&(a.data(d,this.widgetFullName,this),this._on(!0,this.element,{remove:function(a){a.target===d&&this.destroy()}}),this.document=a(d.style?d.ownerDocument:d.document||d),this.window=a(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:a.noop,_getCreateEventData:a.noop,_create:a.noop,_init:a.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(a.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:a.noop,widget:function(){return this.element},option:function(c,d){var e,f,g,h=c;if(0===arguments.length)return a.widget.extend({},this.options);if("string"==typeof c)if(h={},e=c.split("."),c=e.shift(),e.length){for(f=h[c]=a.widget.extend({},this.options[c]),g=0;g<e.length-1;g++)f[e[g]]=f[e[g]]||{},f=f[e[g]];if(c=e.pop(),1===arguments.length)return f[c]===b?null:f[c];f[c]=d}else{if(1===arguments.length)return this.options[c]===b?null:this.options[c];h[c]=d}return this._setOptions(h),this},_setOptions:function(a){var b;for(b in a)this._setOption(b,a[b]);return this},_setOption:function(a,b){return this.options[a]=b,"disabled"===a&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!b).attr("aria-disabled",b),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(b,c,d){var e,f=this;"boolean"!=typeof b&&(d=c,c=b,b=!1),d?(c=e=a(c),this.bindings=this.bindings.add(c)):(d=c,c=this.element,e=this.widget()),a.each(d,function(d,g){function h(){return b||f.options.disabled!==!0&&!a(this).hasClass("ui-state-disabled")?("string"==typeof g?f[g]:g).apply(f,arguments):void 0}"string"!=typeof g&&(h.guid=g.guid=g.guid||h.guid||a.guid++);var i=d.match(/^(\w+)\s*(.*)$/),j=i[1]+f.eventNamespace,k=i[2];k?e.delegate(k,j,h):c.bind(j,h)})},_off:function(a,b){b=(b||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,a.unbind(b).undelegate(b)},_delay:function(a,b){function c(){return("string"==typeof a?d[a]:a).apply(d,arguments)}var d=this;return setTimeout(c,b||0)},_hoverable:function(b){this.hoverable=this.hoverable.add(b),this._on(b,{mouseenter:function(b){a(b.currentTarget).addClass("ui-state-hover")},mouseleave:function(b){a(b.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(b){this.focusable=this.focusable.add(b),this._on(b,{focusin:function(b){a(b.currentTarget).addClass("ui-state-focus")},focusout:function(b){a(b.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(b,c,d){var e,f,g=this.options[b];if(d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent)for(e in f)e in c||(c[e]=f[e]);return this.element.trigger(c,d),!(a.isFunction(g)&&g.apply(this.element[0],[c].concat(d))===!1||c.isDefaultPrevented())}},a.each({show:"fadeIn",hide:"fadeOut"},function(b,c){a.Widget.prototype["_"+b]=function(d,e,f){"string"==typeof e&&(e={effect:e});var g,h=e?e===!0||"number"==typeof e?c:e.effect||c:b;e=e||{},"number"==typeof e&&(e={duration:e}),g=!a.isEmptyObject(e),e.complete=f,e.delay&&d.delay(e.delay),g&&a.effects&&a.effects.effect[h]?d[b](e):h!==b&&d[h]?d[h](e.duration,e.easing,f):d.queue(function(c){a(this)[b](),f&&f.call(d[0]),c()})}})}(jQuery),function(a,b){var c="ui-effects-";a.effects={effect:{}},function(a,b){function c(a,b,c){var d=l[b.type]||{};return null==a?c||!b.def?null:b.def:(a=d.floor?~~a:parseFloat(a),isNaN(a)?b.def:d.mod?(a+d.mod)%d.mod:0>a?0:d.max<a?d.max:a)}function d(b){var c=j(),d=c._rgba=[];return b=b.toLowerCase(),o(i,function(a,e){var f,g=e.re.exec(b),h=g&&e.parse(g),i=e.space||"rgba";return h?(f=c[i](h),c[k[i].cache]=f[k[i].cache],d=c._rgba=f._rgba,!1):void 0}),d.length?("0,0,0,0"===d.join()&&a.extend(d,f.transparent),c):f[b]}function e(a,b,c){return c=(c+1)%1,1>6*c?a+(b-a)*c*6:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a}var f,g="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",h=/^([\-+])=\s*(\d+\.?\d*)/,i=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(a){return[a[1],a[2]/100,a[3]/100,a[4]]}}],j=a.Color=function(b,c,d,e){return new a.Color.fn.parse(b,c,d,e)},k={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},l={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},m=j.support={},n=a("<p>")[0],o=a.each;n.style.cssText="background-color:rgba(1,1,1,.5)",m.rgba=n.style.backgroundColor.indexOf("rgba")>-1,o(k,function(a,b){b.cache="_"+a,b.props.alpha={idx:3,type:"percent",def:1}}),j.fn=a.extend(j.prototype,{parse:function(e,g,h,i){if(e===b)return this._rgba=[null,null,null,null],this;(e.jquery||e.nodeType)&&(e=a(e).css(g),g=b);var l=this,m=a.type(e),n=this._rgba=[];return g!==b&&(e=[e,g,h,i],m="array"),"string"===m?this.parse(d(e)||f._default):"array"===m?(o(k.rgba.props,function(a,b){n[b.idx]=c(e[b.idx],b)}),this):"object"===m?(e instanceof j?o(k,function(a,b){e[b.cache]&&(l[b.cache]=e[b.cache].slice())}):o(k,function(b,d){var f=d.cache;o(d.props,function(a,b){if(!l[f]&&d.to){if("alpha"===a||null==e[a])return;l[f]=d.to(l._rgba)}l[f][b.idx]=c(e[a],b,!0)}),l[f]&&a.inArray(null,l[f].slice(0,3))<0&&(l[f][3]=1,d.from&&(l._rgba=d.from(l[f])))}),this):void 0},is:function(a){var b=j(a),c=!0,d=this;return o(k,function(a,e){var f,g=b[e.cache];return g&&(f=d[e.cache]||e.to&&e.to(d._rgba)||[],o(e.props,function(a,b){return null!=g[b.idx]?c=g[b.idx]===f[b.idx]:void 0})),c}),c},_space:function(){var a=[],b=this;return o(k,function(c,d){b[d.cache]&&a.push(c)}),a.pop()},transition:function(a,b){var d=j(a),e=d._space(),f=k[e],g=0===this.alpha()?j("transparent"):this,h=g[f.cache]||f.to(g._rgba),i=h.slice();return d=d[f.cache],o(f.props,function(a,e){var f=e.idx,g=h[f],j=d[f],k=l[e.type]||{};null!==j&&(null===g?i[f]=j:(k.mod&&(j-g>k.mod/2?g+=k.mod:g-j>k.mod/2&&(g-=k.mod)),i[f]=c((j-g)*b+g,e)))}),this[e](i)},blend:function(b){if(1===this._rgba[3])return this;var c=this._rgba.slice(),d=c.pop(),e=j(b)._rgba;return j(a.map(c,function(a,b){return(1-d)*e[b]+d*a}))},toRgbaString:function(){var b="rgba(",c=a.map(this._rgba,function(a,b){return null==a?b>2?1:0:a});return 1===c[3]&&(c.pop(),b="rgb("),b+c.join()+")"},toHslaString:function(){var b="hsla(",c=a.map(this.hsla(),function(a,b){return null==a&&(a=b>2?1:0),b&&3>b&&(a=Math.round(100*a)+"%"),a});return 1===c[3]&&(c.pop(),b="hsl("),b+c.join()+")"},toHexString:function(b){var c=this._rgba.slice(),d=c.pop();return b&&c.push(~~(255*d)),"#"+a.map(c,function(a){return a=(a||0).toString(16),1===a.length?"0"+a:a}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),j.fn.parse.prototype=j.fn,k.hsla.to=function(a){if(null==a[0]||null==a[1]||null==a[2])return[null,null,null,a[3]];var b,c,d=a[0]/255,e=a[1]/255,f=a[2]/255,g=a[3],h=Math.max(d,e,f),i=Math.min(d,e,f),j=h-i,k=h+i,l=.5*k;return b=i===h?0:d===h?60*(e-f)/j+360:e===h?60*(f-d)/j+120:60*(d-e)/j+240,c=0===j?0:.5>=l?j/k:j/(2-k),[Math.round(b)%360,c,l,null==g?1:g]},k.hsla.from=function(a){if(null==a[0]||null==a[1]||null==a[2])return[null,null,null,a[3]];var b=a[0]/360,c=a[1],d=a[2],f=a[3],g=.5>=d?d*(1+c):d+c-d*c,h=2*d-g;return[Math.round(255*e(h,g,b+1/3)),Math.round(255*e(h,g,b)),Math.round(255*e(h,g,b-1/3)),f]},o(k,function(d,e){var f=e.props,g=e.cache,i=e.to,k=e.from;j.fn[d]=function(d){if(i&&!this[g]&&(this[g]=i(this._rgba)),d===b)return this[g].slice();var e,h=a.type(d),l="array"===h||"object"===h?d:arguments,m=this[g].slice();return o(f,function(a,b){var d=l["object"===h?a:b.idx];null==d&&(d=m[b.idx]),m[b.idx]=c(d,b)}),k?(e=j(k(m)),e[g]=m,e):j(m)},o(f,function(b,c){j.fn[b]||(j.fn[b]=function(e){var f,g=a.type(e),i="alpha"===b?this._hsla?"hsla":"rgba":d,j=this[i](),k=j[c.idx];return"undefined"===g?k:("function"===g&&(e=e.call(this,k),g=a.type(e)),null==e&&c.empty?this:("string"===g&&(f=h.exec(e),f&&(e=k+parseFloat(f[2])*("+"===f[1]?1:-1))),j[c.idx]=e,this[i](j)))})})}),j.hook=function(b){var c=b.split(" ");o(c,function(b,c){a.cssHooks[c]={set:function(b,e){var f,g,h="";if("transparent"!==e&&("string"!==a.type(e)||(f=d(e)))){if(e=j(f||e),!m.rgba&&1!==e._rgba[3]){for(g="backgroundColor"===c?b.parentNode:b;(""===h||"transparent"===h)&&g&&g.style;)try{h=a.css(g,"backgroundColor"),g=g.parentNode}catch(i){}e=e.blend(h&&"transparent"!==h?h:"_default")}e=e.toRgbaString()}try{b.style[c]=e}catch(i){}}},a.fx.step[c]=function(b){b.colorInit||(b.start=j(b.elem,c),b.end=j(b.end),b.colorInit=!0),a.cssHooks[c].set(b.elem,b.start.transition(b.end,b.pos))}})},j.hook(g),a.cssHooks.borderColor={expand:function(a){var b={};return o(["Top","Right","Bottom","Left"],function(c,d){b["border"+d+"Color"]=a}),b}},f=a.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function c(b){var c,d,e=b.ownerDocument.defaultView?b.ownerDocument.defaultView.getComputedStyle(b,null):b.currentStyle,f={};if(e&&e.length&&e[0]&&e[e[0]])for(d=e.length;d--;)c=e[d],"string"==typeof e[c]&&(f[a.camelCase(c)]=e[c]);else for(c in e)"string"==typeof e[c]&&(f[c]=e[c]);return f}function d(b,c){var d,e,g={};for(d in c)e=c[d],b[d]!==e&&(f[d]||(a.fx.step[d]||!isNaN(parseFloat(e)))&&(g[d]=e));return g}var e=["add","remove","toggle"],f={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(b,c){a.fx.step[c]=function(a){("none"!==a.end&&!a.setAttr||1===a.pos&&!a.setAttr)&&(jQuery.style(a.elem,c,a.end),a.setAttr=!0)}}),a.fn.addBack||(a.fn.addBack=function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}),a.effects.animateClass=function(b,f,g,h){var i=a.speed(f,g,h);return this.queue(function(){var f,g=a(this),h=g.attr("class")||"",j=i.children?g.find("*").addBack():g;j=j.map(function(){var b=a(this);return{el:b,start:c(this)}}),f=function(){a.each(e,function(a,c){b[c]&&g[c+"Class"](b[c])})},f(),j=j.map(function(){return this.end=c(this.el[0]),this.diff=d(this.start,this.end),this}),g.attr("class",h),j=j.map(function(){var b=this,c=a.Deferred(),d=a.extend({},i,{queue:!1,complete:function(){c.resolve(b)}});return this.el.animate(this.diff,d),c.promise()}),a.when.apply(a,j.get()).done(function(){f(),a.each(arguments,function(){var b=this.el;a.each(this.diff,function(a){b.css(a,"")})}),i.complete.call(g[0])})})},a.fn.extend({addClass:function(b){return function(c,d,e,f){return d?a.effects.animateClass.call(this,{add:c},d,e,f):b.apply(this,arguments)}}(a.fn.addClass),removeClass:function(b){return function(c,d,e,f){return arguments.length>1?a.effects.animateClass.call(this,{remove:c},d,e,f):b.apply(this,arguments)}}(a.fn.removeClass),toggleClass:function(c){return function(d,e,f,g,h){return"boolean"==typeof e||e===b?f?a.effects.animateClass.call(this,e?{add:d}:{remove:d},f,g,h):c.apply(this,arguments):a.effects.animateClass.call(this,{toggle:d},e,f,g)}}(a.fn.toggleClass),switchClass:function(b,c,d,e,f){return a.effects.animateClass.call(this,{add:c,remove:b},d,e,f)}})}(),function(){function d(b,c,d,e){return a.isPlainObject(b)&&(c=b,b=b.effect),b={effect:b},null==c&&(c={}),a.isFunction(c)&&(e=c,d=null,c={}),("number"==typeof c||a.fx.speeds[c])&&(e=d,d=c,c={}),a.isFunction(d)&&(e=d,d=null),c&&a.extend(b,c),d=d||c.duration,b.duration=a.fx.off?0:"number"==typeof d?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,b.complete=e||c.complete,b}function e(b){return!b||"number"==typeof b||a.fx.speeds[b]?!0:"string"!=typeof b||a.effects.effect[b]?a.isFunction(b)?!0:"object"!=typeof b||b.effect?!1:!0:!0}a.extend(a.effects,{version:"@VERSION",save:function(a,b){for(var d=0;d<b.length;d++)null!==b[d]&&a.data(c+b[d],a[0].style[b[d]])},restore:function(a,d){var e,f;for(f=0;f<d.length;f++)null!==d[f]&&(e=a.data(c+d[f]),e===b&&(e=""),a.css(d[f],e))},setMode:function(a,b){return"toggle"===b&&(b=a.is(":hidden")?"show":"hide"),b},getBaseline:function(a,b){var c,d;switch(a[0]){case"top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e={width:b.width(),height:b.height()},f=document.activeElement;try{f.id}catch(g){f=document.body}return b.wrap(d),(b[0]===f||a.contains(b[0],f))&&a(f).focus(),d=b.parent(),"static"===b.css("position")?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),b.css(e),d.css(c).show()},removeWrapper:function(b){var c=document.activeElement;return b.parent().is(".ui-effects-wrapper")&&(b.parent().replaceWith(b),(b[0]===c||a.contains(b[0],c))&&a(c).focus()),b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(){function b(b){function d(){a.isFunction(f)&&f.call(e[0]),a.isFunction(b)&&b()}var e=a(this),f=c.complete,h=c.mode;(e.is(":hidden")?"hide"===h:"show"===h)?(e[h](),d()):g.call(e[0],c,d)}var c=d.apply(this,arguments),e=c.mode,f=c.queue,g=a.effects.effect[c.effect];return a.fx.off||!g?e?this[e](c.duration,c.complete):this.each(function(){c.complete&&c.complete.call(this)}):f===!1?this.each(b):this.queue(f||"fx",b)},show:function(a){return function(b){if(e(b))return a.apply(this,arguments);var c=d.apply(this,arguments);return c.mode="show",this.effect.call(this,c)}}(a.fn.show),hide:function(a){return function(b){if(e(b))return a.apply(this,arguments);var c=d.apply(this,arguments);return c.mode="hide",this.effect.call(this,c)}}(a.fn.hide),toggle:function(a){return function(b){if(e(b)||"boolean"==typeof b)return a.apply(this,arguments);var c=d.apply(this,arguments);return c.mode="toggle",this.effect.call(this,c)}}(a.fn.toggle),cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}})}(),function(){var b={};a.each(["Quad","Cubic","Quart","Quint","Expo"],function(a,c){b[c]=function(b){return Math.pow(b,a+2)}}),a.extend(b,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return 0===a||1===a?a:-Math.pow(2,8*(a-1))*Math.sin((80*(a-1)-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){for(var b,c=4;a<((b=Math.pow(2,--c))-1)/11;);return 1/Math.pow(4,3-c)-7.5625*Math.pow((3*b-2)/22-a,2)}}),a.each(b,function(b,c){a.easing["easeIn"+b]=c,a.easing["easeOut"+b]=function(a){return 1-c(1-a)},a.easing["easeInOut"+b]=function(a){return.5>a?c(2*a)/2:1-c(-2*a+2)/2}})}()}(jQuery),function(a,b,c,d){function e(a,b,c,d){var e=this;e.widget=a,e.element=b,e.items=c,e.options=d}function f(a){return parseFloat((.017453*a).toFixed(6))}function g(){a.coverflow.renderer.Classic.apply(this,arguments)}function h(a,b){return typeof a===b}function i(a,b){return!!~(""+a).indexOf(b)}function j(a,b){var c,e;for(c in a)if(e=a[c],!i(e,"-")&&A[e]!==d)return"pfx"===b?e:!0;return!1}function k(b,c,e){var f,g;for(f in b)if(g=c[b[f]],g!==d)return e===!1?b[f]:h(g,"function")?a.proxy(g,e||c):g;return!1}function l(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+C.join(d+" ")+d).split(" ");return h(b,"string")||h(b,"undefined")?j(e,b):(e=(a+" "+D.join(d+" ")+d).split(" "),k(e,b,c))}function m(a,b){var c;return function(){var d=this,e=arguments;c&&clearTimeout(c),c=setTimeout(function(){a.apply(d,e),c=null},b)}}a.coverflow={renderer:{},support:{}},e.prototype={cssClass:"classic",itemMargin:0,initialize:function(){var b=this,c=b.options,d={},e=b.items.eq(b.widget.currentIndex);b.itemSize=e.width(),b.outerWidth=b.element.parent().outerWidth(!1),b.itemMargin=-Math.floor(c.overlap/2*e.innerWidth()),b.items.css({marginLeft:b.itemMargin,marginRight:b.itemMargin}),d.width=b.items.width()*b.items.length,a.extend(d,b._getCenterPosition()),b.element.css(d)},_getCenterPosition:function(){var a,b=this,c=b.itemSize,d=b.widget.currentIndex;return a=(b.outerWidth-c)/2,a-=d*b.itemSize/2,a+=parseInt(b.element.css("paddingLeft"),10)||0,a-=d*b.itemMargin*2,a-=b.itemMargin,a=Math.round(a),{left:a}},select:function(){return this._getCenterPosition()},getElementTransitionStyles:function(b){var c=a.coverflow.transition[b.easing]||a.coverflow.transition.easeOutQuint;return a.extend(this._getCenterPosition(),{transition:"left "+b.duration+"ms "+c})},refresh:function(b,c,d){var e=this,f=e.options,g=e.items.length,h=e.itemSize,i=e.itemMargin;this.items.each(function(j){var k=j===d&&0>c-d||j-d>0?"left":"right",l=j===d?1-b:j===c?b:1,m={zIndex:g+("left"===k?d-j:j-d)+10},n=1-l*(1-f.scale),o=[n,l*("right"===k?-.15:.15),0,n,0,0];m.left=-j*(h/2)+("right"===k?-h/2+h/2*f.overlap:h/2-h/2*f.overlap)*l,a.coverflow.isOldie&&(j===d?(m.left+=i,m.top=0):m.top=Math.ceil(-i/2)),e._transform(this,m,o),a(this).css(m)})},_transform:function(){var b=this;return a.coverflow.support.transform?void b._matrixTransform.apply(b,arguments):void(a.coverflow.isOldie&&b._fallbackTransform.apply(b,arguments))},_matrixTransform:function(a,b,c){b.transform="matrix("+c.join(",")+")"},_fallbackTransform:function(a,b,c){a.filters["DXImageTransform.Microsoft.Matrix"]||(a.style.filter=(a.style.filter?"":" ")+'progid:DXImageTransform.Microsoft.Matrix(sizingMethod="auto expand")');var d=a.filters["DXImageTransform.Microsoft.Matrix"];d.M11=c[0],d.M12=c[2],d.M21=c[1],d.M22=c[3]}},a.extend(a.coverflow.renderer,{Classic:e}),g.prototype={cssClass:"3d",initialize:function(){var b=this,c={};b.itemSize=b.items.eq(b.widget.currentIndex).outerWidth(!0),b.outerWidth=b.element.parent().outerWidth(!1),c.width=b.itemSize*b.items.length,a.extend(c,b._getCenterPosition(),b._getPerspectiveOrigin()),b.element.css(c)},getItemRenderedWidth:function(){var a=this.options;return Math.cos(f(a.angle))*this.itemSize*a.scale},_getPerspectiveOrigin:function(){var a=this,b=a.options;return{perspectiveOrigin:Math.round(a.itemSize/2+a.widget.currentIndex*a.getItemRenderedWidth()*(1-b.overlap))+"px "+b.perspectiveY+"%"}},_getCenterPosition:function(){var a,b=this,c=b.getItemRenderedWidth(),d=b.widget.currentIndex;return a=(b.outerWidth-b.itemSize)/2,a-=d*c,a+=d*c*b.options.overlap,a-=parseInt(b.element.css("paddingLeft"),10)||0,a=Math.round(a),{left:a}},select:function(){return a.extend({},this._getCenterPosition(),this._getPerspectiveOrigin())},getElementTransitionStyles:function(b){var c=this,d=a.coverflow.transition[b.easing]||a.coverflow.transition.easeOutQuint,e={transitionProperty:"left",transitionDuration:b.duration+"ms",transitionTimingFunction:d,transitionDelay:"initial"};return a.extend(e,c._getCenterPosition(),c._getPerspectiveOrigin())},refresh:function(b,c,d){var e=this,g=e.options,h=e.items.length,i=e.itemSize,j=e.getItemRenderedWidth();this.items.each(function(e){var k,l=e===d&&0>c-d||e-d>0?"left":"right",m=e===d?1-b:e===c?b:1,n={zIndex:h+("left"===l?d-e:e-d)+10},o=1-m*(1-g.scale),p="right"===l?g.angle:-g.angle;p=f(m*p),n.left=Math.round(-e*i+m*e*j*(1-g.overlap)+(1-m)*e*j*(1-g.overlap)),k=[(o*Math.cos(p)).toFixed(6),0,Math.sin(-p).toFixed(6),0,0,o,0,0,Math.sin(p).toFixed(6),0,(o*Math.cos(p)).toFixed(6),0,0,0,0,1],n.transform="matrix3d("+k.join(", ")+")",n.transformOrigin="right"===l?"left center":"right center",a(this).css(n)})}},a.extend(a.coverflow.renderer,{ThreeD:g});for(var n=c.createElement("div"),o=n.style,p=0,q=["ms","moz","webkit","o"],r=q.length,s="",t=0,u=a.coverflow.support,v=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};r>t&&!b.requestAnimationFrame;t++)b.requestAnimationFrame=b[q[t]+"RequestAnimationFrame"],b.cancelAnimationFrame=b[q[t]+"CancelAnimationFrame"]||b[q[t]+"CancelRequestAnimationFrame"];if(b.requestAnimationFrame||(b.requestAnimationFrame=function(a){var c=(new Date).getTime(),d=Math.max(0,16-(c-p)),e=b.setTimeout(function(){a(c+d)},d);return p=c+d,e}),b.cancelAnimationFrame||(b.cancelAnimationFrame=function(a){clearTimeout(a)}),a.each(q,function(a,b){return"ms"!==b&&(b=v(b)),!u.transform&&b+"Transform"in o&&(u.transform=b+"Transform"),!u.transition&&b+"Transition"in o&&(u.transition=b+"Transition"),u.transform&&u.transition?(s=b,!1):!0}),u.transform&&u.transition||(u.transform="transform"in o?"transform":!1,u.transition="transition"in o?"transition":!1),null==a.support.transform&&(a.support.transform=u.transform),null==a.support.transition&&(a.support.transition=u.transition),null==a.cssProps)throw new Error("Your jQuery version is too old. Please upgrade.");s&&a.each(["transitionProperty","transitionDuration","transitionTimingFunction","transitionDelay","perspectiveOrigin"],function(b,c){null==a.cssProps[c]&&(a.cssProps[c]=s+v(c))}),n=null;var w,x=c.documentElement,y="coverflowjsfeaturedetection",z=c.createElement(y),A=z.style,B="Webkit Moz O ms",C=B.split(" "),D=B.toLowerCase().split(" "),E=function(a,b,d,e){var f,g,h,i,j=c.createElement("div"),k=c.body,l=k||c.createElement("body");if(parseInt(d,10))for(;d--;)h=c.createElement("div"),h.id=e?e[d]:y+(d+1),j.appendChild(h);return f=["&#173;","<style id='s",y,"'>",a,"</style>"].join(""),j.id=y,(k?j:l).innerHTML+=f,l.appendChild(j),k||(l.style.background="",l.style.overflow="hidden",i=x.style.overflow,x.style.overflow="hidden",x.appendChild(l)),g=b(j,a),k?j.parentNode.removeChild(j):(l.parentNode.removeChild(l),x.style.overflow=i),!!g},F={}.hasOwnProperty;w=h(F,"undefined")||h(F.call,"undefined")?function(a,b){return b in a&&h(a.constructor.prototype[b],"undefined")}:function(a,b){return F.call(a,b)},a.coverflow.support.transform3d=function(){var a=!!l("perspective");return a&&"webkitPerspective"in x.style&&E("@media (transform-3d),(-webkit-transform-3d){#coverflowjsfeaturedetection{left:9px;position:absolute;height:3px;}}",function(b){a=9===b.offsetLeft&&3===b.offsetHeight}),a}(),null==a.support.transform3d&&(a.support.transform3d=a.coverflow.support.transform3d);var G={transition:"transitionend",MozTransition:"transitionend",OTransition:"oTransitionEnd",WebkitTransition:"webkitTransitionEnd",msTransition:"transitionend"},H=navigator.userAgent.toLowerCase(),I=function(){var a=/(msie) ([\w.]+)/.exec(H);return null!==a&&a[1]&&~~a[2]<10}();a.coverflow=a.extend(!0,{},a.coverflow,{isAndroid:/android/.test(H),isOldie:I,transition:{easeInQuad:"cubic-bezier( .55,.085,.68,.53 )",easeInCubic:"cubic-bezier( .550, .055, .675, .190 )",easeInQuart:"cubic-bezier( .895, .03, .685, .22 )",easeInQuint:"cubic-bezier( .755, .05, .855, .06 )",easeInSine:"cubic-bezier( .47, 0, .745, .715 )",easeInExpo:"cubic-bezier( .95, .05, .795, .035 )",easeInCirc:"cubic-bezier( .6, .04, .98, .335 )",easeInBack:"cubic-bezier( .6, -.28, .735, .045 )",easeOutQuad:"cubic-bezier( .25,.46,.45,.94 )",easeOutCubic:"cubic-bezier( .215,.61,.355,1 )",easeOutQuart:"cubic-bezier( .165, .84, .44, 1 )",easeOutQuint:"cubic-bezier( .23, 1, .32, 1 )",easeOutSine:"cubic-bezier( .39, .575, .565, 1 )",easeOutExpo:"cubic-bezier( .19,1,.22,1 )",easeOutCirc:"cubic-bezier( .075, .82, .165, 1 )",easeOutBack:"cubic-bezier( .175, .885, .32, 1.275 )",easeInOutQuad:"cubic-bezier( .455, .03, .515, .955 )",easeInOutCubic:"cubic-bezier( .645, .045, .355, 1 )",easeInOutQuart:"cubic-bezier( .77, 0, .175, 1 )",easeInOutQuint:"cubic-bezier( .86, 0, .07, 1 )",easeInOutSine:"cubic-bezier( .445, .05, .55, .95 )",easeInOutExpo:"cubic-bezier( 1, 0, 0, 1 )",easeInOutCirc:"cubic-bezier( .785, .135, .15, .86 )",easeInOutBack:"cubic-bezier( .68, -.55, .265, 1.55 )"},renderer:{}}),a.widget("ui.coverflow",{options:{items:"> *",active:0,duration:400,easing:"easeOutQuint",angle:45,perspectiveY:45,scale:.7,overlap:.3,trigger:{itemfocus:!1,itemclick:!0,mousewheel:!0,swipe:!0}},isTicking:!1,_create:function(){var c,d,e=this,f=this.options,g=a.coverflow.support||{};
e.elementOrigStyle=e.element.attr("style"),e.items=e.element.find(f.items).each(function(){var b=a(this);b.data({coverflowOrigElemAttr:{style:b.attr("style"),"class":b.attr("class"),tabIndex:b.attr("tabIndex")}})}).addClass("ui-coverflow-item"),e._setDimensions(),e.support=g,c=g.transform&&!I&&null==b.opera&&g.transform3d?a.coverflow.renderer.ThreeD:a.coverflow.renderer.Classic,d={angle:f.angle,perspectiveY:f.perspectiveY,scale:f.scale,overlap:f.overlap,itemSize:e.itemSize,outerWidth:e.outerWidth},e.renderer=new c(e,e.element,e.items,d),e.element.addClass("ui-coverflow ui-coverflow-"+e.renderer.cssClass+"-render").parent().addClass("ui-coverflow-wrapper ui-clearfix"),f.trigger.itemfocus&&this._bindFocus(),f.trigger.itemclick&&e._on(e.items,{click:e._select}),f.trigger.mousewheel&&e._on({mousewheel:e._onMouseWheel,DOMMouseScroll:e._onMouseWheel}),f.trigger.swipe&&e._bindSwipe(),e.useJqueryAnimate=!(g.transition&&a.isFunction(b.requestAnimationFrame)),e.coverflowrafid=0},_bindFocus:function(){var a=this;a.items.prop("tabIndex",0),a._on(a.items,{focus:a._select})},_bindSwipe:function(){var c=this,d=c.element,e=!1,f=!1;a.event.special&&a.event.special.swipe&&(e=!0,a.coverflow.isAndroid&&(a.event.special.swipe.scrollSupressionThreshold=0),a.event.special.swipe.handleSwipe=function(b,c){var d=b.coords,e=c.coords,f=a.event.special.swipe;c.time-b.time<f.durationThreshold&&Math.abs(d[0]-e[0])>f.horizontalDistanceThreshold&&Math.abs(d[1]-e[1])<f.verticalDistanceThreshold&&b.origin.trigger("swipe",{swipestart:b,swipestop:c}).trigger(b.coords[0]>c.coords[0]?"swipeleft":"swiperight",{swipestart:b,swipestop:c})},c._on({swipe:m(c._handleJQmSwipe,150)})),d.hammer&&null!=b.Hammer&&(f=!0,d.hammer().on("drag swipe",function(a){Hammer.utils.isVertical(a.gesture.direction)||a.gesture.preventDefault()}),c._on({swipe:c._handleHammerSwipe})),e||f||c._on({swipeleft:c.next,swiperight:c.prev})},_init:function(){var a=this,b=a.options;b.duration=~~b.duration,b.duration<1&&(b.duration=1),a.currentIndex=a._isValidIndex(b.active,!0)?b.active:0,a.activeItem=a.items.removeClass("ui-state-active").eq(a.currentIndex).addClass("ui-state-active"),a._setDimensions(),a.renderer.initialize(),a._refresh(1,a._getFrom(),a.currentIndex),a._trigger("beforeselect",null,a._ui()),a._trigger("select",null,a._ui())},_setDimensions:function(){var a=this;a.itemWidth=a.items.width(),a.itemHeight=a.items.height(),a.itemSize=a.items.outerWidth(!0),a.outerWidth=a.element.parent().outerWidth(!1)},_isValidIndex:function(a,b){return b=!!b,a=~~a,(this.currentIndex!==a||b)&&a>-1&&!!this.items.get(a)},_select:function(a){this.select(a.currentTarget)},next:function(){return this.select(this.currentIndex+1)},prev:function(){return this.select(this.currentIndex-1)},_handleJQmSwipe:function(a,b){var c=b.swipestart,d=b.swipestop,e=d.time-c.time,f=d.coords[0]-c.coords[0],g=f/e,h=0>f?"left":"right";this._handleSwipe(h,g)},_handleHammerSwipe:function(a){var b=a.gesture;this._handleSwipe(b.direction,b.distance/b.deltaTime)},_handleSwipe:function(a,b){var c,d,e=this;return c=e.outerWidth*Math.pow(b,2)*.25,c/=e.itemWidth,c=Math.floor(c)*("left"===a?1:-1),d=e.currentIndex+c,c?0>d?void e.select(0):e._isValidIndex(d)?void e.select(d):void e.select(e.items.length-1):void("left"===a?e.next():e.prev())},_getFrom:function(){var a=this;return Math.abs(a.previous-a.currentIndex)<=1?a.previousIndex:a.currentIndex+(a.previousIndex<a.currentIndex?-1:1)},select:function(c){var d,e=this,f=e.options,g=isNaN(parseInt(c,10))?e.items.index(c):parseInt(c,10);return e._isValidIndex(g)?!1===e._trigger("beforeselect",null,this._ui(e.items.eq(g),g))?!1:(e.isTicking&&(e.useJqueryAnimate?e.element.stop(!0,!1):(e.coverflowrafid&&b.cancelAnimationFrame(e.coverflowrafid),e.element.unbind(G[e.support.transition]))),e.isTicking=!0,e.previousIndex=e.currentIndex,f.active=e.currentIndex=g,d=a.extend({},e.renderer.select(),{coverflow:1}),e.useJqueryAnimate?e._animation(f,d):(f=a.extend({duration:f.duration,easing:f.easing},d),e._transition(f)),!0):!1},_animation:function(b,c){var d=this,e=this._getFrom();a.fx.step.coverflow=function(a){d._refresh(a.now,e,d.currentIndex)},d.element.animate(c,{duration:b.duration,easing:b.easing}).promise().done(function(){d._onAnimationEnd()})},_transition:function(c){var d=this,e=new Date,f=d._getFrom(),g=d.currentIndex,h={},i=function(){var a=((new Date).getTime()-e.getTime())/c.duration;a>1?d.isTicking=!1:d._refresh(a,f,g),d.isTicking&&(d.coverflowrafid=b.requestAnimationFrame(i))};a.isFunction(d.renderer.getElementTransitionStyles)&&(h=a.extend(h,d.renderer.getElementTransitionStyles(c))),d.element.one(G[d.support.transition],function(){d._refresh(1,f,g),d._onAnimationEnd()}).css(h),d.coverflowrafid=b.requestAnimationFrame(i)},_onAnimationEnd:function(){var a=this;a.coverflowrafid&&cancelAnimationFrame(a.coverflowrafid),a.isTicking=!1,a.activeItem=a.items.removeClass("ui-state-active").eq(a.currentIndex).addClass("ui-state-active"),a._trigger("select",null,a._ui())},_refresh:function(a,b,c){this.element.parent().scrollTop(0),this.renderer.refresh(a,b,c)},_ui:function(a,b){return{active:a||this.activeItem,index:null!=b?b:this.currentIndex}},_onMouseWheel:function(a){var b=a.originalEvent;return a.preventDefault(),b.wheelDelta>0||b.detail<0?void this.prev():void this.next()},_destroy:function(){var b=this;b.elementOrigStyle!==d?b.element.attr("style",this.elementOrigStyle):b.element.removeAttr("style"),b.element.removeClass("ui-coverflow ui-helper-clearfix ui-coverflow-"+(b.renderer.cssClass||"classic")+"-render").parent().removeClass("ui-coverflow-wrapper ui-clearfix"),b.items.removeClass("ui-coverflow-item ui-state-active").each(function(){var b=a(this),c=b.data("coverflowOrigElemAttr");a.each(c,function(a,c){c!==d?b.attr(a,c):b.removeAttr(a)}),b.data("coverflowOrigElemAttr",null)}),b._super()}})}(jQuery,this,this.document);