├── joyride ├── __init__.py ├── templatetags │ ├── __init__.py │ └── joyride_tags.py ├── templates │ └── joyride │ │ ├── include_all.html │ │ ├── include_css.html │ │ ├── include_js.html │ │ ├── joyride.html │ │ ├── joyrides.html │ │ └── joyride_script.html ├── admin.py ├── utils.py ├── settings.py ├── static │ └── joyride │ │ ├── js │ │ ├── jquery.cookie.min.js │ │ ├── modernizr.mq.min.js │ │ ├── jquery.cookie.js │ │ ├── modernizr.mq.js │ │ ├── jquery.joyride-2.1.min.js │ │ ├── jquery.joyride-2.1.js │ │ └── jquery-1.10.1.min.js │ │ └── css │ │ ├── joyride-2.1.min.css │ │ └── joyride-2.1.css └── models.py ├── TODO.rst ├── .gitignore ├── AUTHORS.rst ├── MANIFEST.in ├── CHANGES.rst ├── LICENSE.txt ├── setup.py ├── README.md └── README.rst /joyride/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /joyride/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /TODO.rst: -------------------------------------------------------------------------------- 1 | TODO 2 | ===== 3 | 4 | * Testing accross various django and python version -------------------------------------------------------------------------------- /joyride/templates/joyride/include_all.html: -------------------------------------------------------------------------------- 1 | {% include "joyride/include_css.html" %} 2 | {% include "joyride/include_js.html" %} -------------------------------------------------------------------------------- /joyride/templates/joyride/include_css.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | dist 3 | *.egg-info 4 | .svn 5 | .svnignore 6 | .svnexternals 7 | build 8 | .venv_* 9 | django_joyride.egg-info 10 | .idea -------------------------------------------------------------------------------- /AUTHORS.rst: -------------------------------------------------------------------------------- 1 | django-joyride Authors 2 | ====================== 3 | 4 | * Created by Aamir Adnan (s33k.n.d3str0y@gmail.com) 5 | 6 | Contributors 7 | ------------ 8 | 9 | * Scott Adams -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS.rst 2 | include CHANGES.rst 3 | include LICENSE.txt 4 | include MANIFEST.in 5 | include README.md 6 | include README.rst 7 | include TODO.rst 8 | recursive-include joyride/templates *.html 9 | recursive-include joyride/static *.html *.css *.js *.txt *.png -------------------------------------------------------------------------------- /joyride/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from joyride.models import * 4 | 5 | class JoyRideStepsInline(admin.StackedInline): 6 | model = JoyRideSteps 7 | 8 | class JoyRideAdmin(admin.ModelAdmin): 9 | inlines = (JoyRideStepsInline, ) 10 | 11 | admin.site.register(JoyRide, JoyRideAdmin) 12 | admin.site.register(JoyRideHistory) -------------------------------------------------------------------------------- /CHANGES.rst: -------------------------------------------------------------------------------- 1 | Changelog Summary 2 | ================= 3 | 4 | ### v0.1.2 5 | 6 | * Lots of Bug Fixes 7 | * postRideCallback now accepts third parameter the `parent_id` on which the joyride was initialized e.g. id of
    tag 8 | 9 | ### v0.1.1 10 | 11 | * Had some pypi issue. So removed it. 12 | 13 | ### v0.1.0 14 | 15 | * django-joyride released 16 | -------------------------------------------------------------------------------- /joyride/utils.py: -------------------------------------------------------------------------------- 1 | import posixpath 2 | from django.conf import settings 3 | 4 | 5 | def absolute_url(path, prefix=None): 6 | if prefix is None: 7 | prefix = settings.STATIC_URL 8 | if path.startswith(u'http://') or path.startswith(u'https://') or path.startswith(u'/'): 9 | return path 10 | return posixpath.join(prefix, path) 11 | -------------------------------------------------------------------------------- /joyride/templates/joyride/include_js.html: -------------------------------------------------------------------------------- 1 | {% if include_jquery %} 2 | 3 | {% endif %} 4 | {% if include_jquery_cookie %} 5 | 6 | {% endif %} 7 | {% if include_jquery_modernizr %} 8 | 9 | {% endif %} 10 | -------------------------------------------------------------------------------- /joyride/settings.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | JOYRIDE_LIB = 'joyride/js/jquery.joyride-2.1.min.js' 4 | 5 | JOYRIDE_JQUERY_URL = getattr( 6 | settings, 'JOYRIDE_JQUERY_URL', 7 | 'joyride/js/jquery-1.10.1.min.js') 8 | 9 | JOYRIDE_JQUERY_MODERNIZR_URL = getattr( 10 | settings, 'JOYRIDE_JQUERY_MODERNIZR_URL', 11 | 'joyride/js/modernizr.mq.min.js') 12 | 13 | JOYRIDE_JQUERY_COOKIE_URL = getattr( 14 | settings, 'JOYRIDE_JQUERY_COOKIE_URL', 15 | 'joyride/js/jquery.cookie.min.js') 16 | 17 | JOYRIDE_LIB_URL = getattr( 18 | settings, 'JOYRIDE_LIB_URL', 19 | JOYRIDE_LIB) 20 | 21 | USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') 22 | -------------------------------------------------------------------------------- /joyride/templates/joyride/joyride.html: -------------------------------------------------------------------------------- 1 | {% comment %}To render single joyride{% endcomment %} 2 | 3 | 15 | 16 | {% include "joyride/joyride_script.html" %} -------------------------------------------------------------------------------- /joyride/static/joyride/js/jquery.cookie.min.js: -------------------------------------------------------------------------------- 1 | (function(d,g,h){function k(c){return c}function l(c){return decodeURIComponent(c.replace(m," "))}var m=/\+/g;d.cookie=function(c,b,a){if(b!==h&&!/Object/.test(Object.prototype.toString.call(b))){a=d.extend({},d.cookie.defaults,a);null===b&&(a.expires=-1);if("number"===typeof a.expires){var e=a.expires,f=a.expires=new Date;f.setDate(f.getDate()+e)}b=String(b);return g.cookie=[encodeURIComponent(c),"=",a.raw?b:encodeURIComponent(b),a.expires?"; expires="+a.expires.toUTCString():"",a.path?"; path="+ a.path:"",a.domain?"; domain="+a.domain:"",a.secure?"; secure":""].join("")}a=b||d.cookie.defaults||{};b=a.raw?k:l;a=g.cookie.split("; ");for(e=0;f=a[e]&&a[e].split("=");e++)if(b(f.shift())===c)return b(f.join("="));return null};d.cookie.defaults={};d.removeCookie=function(c,b){return null!==d.cookie(c,b)?(d.cookie(c,null,b),!0):!1}})(jQuery,document); -------------------------------------------------------------------------------- /joyride/templates/joyride/joyrides.html: -------------------------------------------------------------------------------- 1 | {% comment %}To render multiple joyrides at once{% endcomment %} 2 | 3 | {% for joyride in joyrides %} 4 | 16 | {% include "joyride/joyride_script.html" %} 17 | {% endfor %} -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 intellisense (Aamir Adnan) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | long_description = (open('README.rst').read() + '\n\n' + 4 | open('CHANGES.rst').read() + '\n\n' + 5 | open('TODO.rst').read()) 6 | 7 | 8 | def _static_files(prefix): 9 | return [prefix+'/'+pattern for pattern in [ 10 | 'joyride/*.*', 11 | 'joyride/*/*.*', 12 | ]] 13 | 14 | setup( 15 | name='django-joyride', 16 | version='0.1.2', 17 | description='A Django application that eases the guided tour', 18 | author='Aamir Adnan', 19 | author_email='s33k.n.d3str0y@gmail.com', 20 | url='https://github.com/intellisense/django-joyride', 21 | license='MIT', 22 | packages=['joyride', 'joyride.templatetags'], 23 | long_description=long_description, 24 | classifiers=[ 25 | 'Development Status :: 4 - Beta', 26 | 'Environment :: Web Environment', 27 | 'Intended Audience :: Developers', 28 | 'License :: OSI Approved :: MIT License', 29 | 'Operating System :: OS Independent', 30 | 'Programming Language :: Python', 31 | 'Framework :: Django', 32 | 'Programming Language :: Python :: 2.7', 33 | ], 34 | include_package_data=True, 35 | zip_safe=False, 36 | install_requires=[ 37 | 'django-positions>=0.5.0', 38 | 'Django>=1.4.3' 39 | ], 40 | package_data={'joyride': ['templates/joyride/*.html'] + 41 | _static_files('static')} 42 | ) 43 | -------------------------------------------------------------------------------- /joyride/templates/joyride/joyride_script.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /joyride/static/joyride/js/modernizr.mq.min.js: -------------------------------------------------------------------------------- 1 | window.Modernizr=function(n,h,y){var b={},p=h.documentElement,l=h.createElement("modernizr"),l=l.style,q={},w=[],r=w.slice,m,x=function(a,c,d,b){var f,e=h.createElement("div"),k=h.body,g=k?k:h.createElement("body");if(parseInt(d,10))for(;d--;)f=h.createElement("div"),f.id=b?b[d]:"modernizr"+(d+1),e.appendChild(f);d=['­"].join("");e.id="modernizr";(k?e:g).innerHTML+=d;g.appendChild(e);k||(g.style.background="",p.appendChild(g));a=c(e,a);k?e.parentNode.removeChild(e): g.parentNode.removeChild(g);return!!a},t={}.hasOwnProperty,u;u="undefined"!==typeof t&&"undefined"!==typeof t.call?function(a,c){return t.call(a,c)}:function(a,c){return c in a&&"undefined"===typeof a.constructor.prototype[c]};Function.prototype.bind||(Function.prototype.bind=function(a){var c=this;if("function"!=typeof c)throw new TypeError;var d=r.call(arguments,1),b=function(){if(this instanceof b){var f=function(){};f.prototype=c.prototype;var f=new f,e=c.apply(f,d.concat(r.call(arguments))); return Object(e)===e?e:f}return c.apply(a,d.concat(r.call(arguments)))};return b});for(var v in q)u(q,v)&&(m=v.toLowerCase(),b[m]=q[v](),w.push((b[m]?"":"no-")+m));b.addTest=function(a,c){if("object"==typeof a)for(var d in a)u(a,d)&&b.addTest(d,a[d]);else{a=a.toLowerCase();if(b[a]!==y)return b;c="function"==typeof c?c():c;enableClasses&&(p.className+=" "+(c?"":"no-")+a);b[a]=c}return b};l.cssText="";l=null;b._version="2.6.1";b.mq=function(a){var c=n.matchMedia||n.msMatchMedia;if(c)return c(a).matches; var b;x("@media "+a+" { #modernizr { position: absolute; } }",function(a){b="absolute"==(n.getComputedStyle?getComputedStyle(a,null):a.currentStyle).position});return b};b.testStyles=x;return b}(this,this.document); -------------------------------------------------------------------------------- /joyride/static/joyride/js/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*jshint eqnull:true */ 2 | /*! 3 | * jQuery Cookie Plugin v1.2 4 | * https://github.com/carhartl/jquery-cookie 5 | * 6 | * Copyright 2011, Klaus Hartl 7 | * Dual licensed under the MIT or GPL Version 2 licenses. 8 | * http://www.opensource.org/licenses/mit-license.php 9 | * http://www.opensource.org/licenses/GPL-2.0 10 | */ 11 | (function ($, document, undefined) { 12 | 13 | var pluses = /\+/g; 14 | 15 | function raw(s) { 16 | return s; 17 | } 18 | 19 | function decoded(s) { 20 | return decodeURIComponent(s.replace(pluses, ' ')); 21 | } 22 | 23 | $.cookie = function (key, value, options) { 24 | 25 | // key and at least value given, set cookie... 26 | if (value !== undefined && !/Object/.test(Object.prototype.toString.call(value))) { 27 | options = $.extend({}, $.cookie.defaults, options); 28 | 29 | if (value === null) { 30 | options.expires = -1; 31 | } 32 | 33 | if (typeof options.expires === 'number') { 34 | var days = options.expires, t = options.expires = new Date(); 35 | t.setDate(t.getDate() + days); 36 | } 37 | 38 | value = String(value); 39 | 40 | return (document.cookie = [ 41 | encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), 42 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 43 | options.path ? '; path=' + options.path : '', 44 | options.domain ? '; domain=' + options.domain : '', 45 | options.secure ? '; secure' : '' 46 | ].join('')); 47 | } 48 | 49 | // key and possibly options given, get cookie... 50 | options = value || $.cookie.defaults || {}; 51 | var decode = options.raw ? raw : decoded; 52 | var cookies = document.cookie.split('; '); 53 | for (var i = 0, parts; (parts = cookies[i] && cookies[i].split('=')); i++) { 54 | if (decode(parts.shift()) === key) { 55 | return decode(parts.join('=')); 56 | } 57 | } 58 | 59 | return null; 60 | }; 61 | 62 | $.cookie.defaults = {}; 63 | 64 | $.removeCookie = function (key, options) { 65 | if ($.cookie(key, options) !== null) { 66 | $.cookie(key, null, options); 67 | return true; 68 | } 69 | return false; 70 | }; 71 | 72 | })(jQuery, document); -------------------------------------------------------------------------------- /joyride/templatetags/joyride_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | from joyride import settings 4 | from joyride.utils import absolute_url 5 | from joyride.models import JoyRide 6 | 7 | register = template.Library() 8 | 9 | 10 | def get_joyride_context(): 11 | context = { 12 | 'JOYRIDE_CSS_URL': absolute_url('joyride/css/joyride-2.1.min.css'), 13 | } 14 | if settings.JOYRIDE_JQUERY_URL is not None: 15 | context['JOYRIDE_JQUERY_URL'] = absolute_url(settings.JOYRIDE_JQUERY_URL) 16 | if settings.JOYRIDE_JQUERY_MODERNIZR_URL: 17 | context['JOYRIDE_JQUERY_MODERNIZR_URL'] = absolute_url(settings.JOYRIDE_JQUERY_MODERNIZR_URL) 18 | if settings.JOYRIDE_JQUERY_COOKIE_URL: 19 | context['JOYRIDE_JQUERY_COOKIE_URL'] = absolute_url(settings.JOYRIDE_JQUERY_COOKIE_URL) 20 | joyride_lib_url = settings.JOYRIDE_LIB_URL 21 | if not joyride_lib_url: 22 | joyride_lib_url = settings.JOYRIDE_LIB 23 | context['JOYRIDE_LIB_URL'] = absolute_url(joyride_lib_url) 24 | return context 25 | register.joyride_context = get_joyride_context() 26 | 27 | 28 | @register.inclusion_tag('joyride/include_all.html') 29 | def joyride_media(no_jquery=False, no_jquery_modernizr=False, no_jquery_cookie=False): 30 | include_jquery = not bool(no_jquery) and settings.JOYRIDE_JQUERY_URL is not None 31 | include_jquery_modernizr = not bool(no_jquery_modernizr) and settings.JOYRIDE_JQUERY_MODERNIZR_URL is not None 32 | include_jquery_cookie = not bool(no_jquery_cookie) and settings.JOYRIDE_JQUERY_COOKIE_URL is not None 33 | return dict( 34 | register.joyride_context, 35 | include_jquery=include_jquery, 36 | include_jquery_modernizr=include_jquery_modernizr, 37 | include_jquery_cookie=include_jquery_cookie 38 | ) 39 | 40 | 41 | @register.inclusion_tag('joyride/include_js.html') 42 | def joyride_js(no_jquery=False, no_jquery_modernizr=False, no_jquery_cookie=False): 43 | include_jquery = not bool(no_jquery) and settings.JOYRIDE_JQUERY_URL is not None 44 | include_jquery_modernizr = not bool(no_jquery_modernizr) and settings.JOYRIDE_JQUERY_MODERNIZR_URL is not None 45 | include_jquery_cookie = not bool(no_jquery_cookie) and settings.JOYRIDE_JQUERY_COOKIE_URL is not None 46 | return dict( 47 | register.joyride_context, 48 | include_jquery=include_jquery, 49 | include_jquery_modernizr=include_jquery_modernizr, 50 | include_jquery_cookie=include_jquery_cookie 51 | ) 52 | 53 | 54 | @register.inclusion_tag('joyride/include_css.html') 55 | def joyride_css(): 56 | return register.joyride_context 57 | 58 | 59 | @register.inclusion_tag('joyride/joyrides.html', takes_context=True) 60 | def include_joyrides(context, joyrides): 61 | context.update({'joyrides': joyrides}) 62 | return context 63 | 64 | 65 | @register.inclusion_tag('joyride/joyride.html', takes_context=True) 66 | def include_joyride(context, joyride): 67 | context.update({'joyride': joyride}) 68 | return context 69 | 70 | 71 | @register.assignment_tag 72 | def get_joyrides(url_path=None, for_user=None, exclude_viewed=True): 73 | qs = JoyRide.objects.get_joyrides( 74 | url_path=url_path, for_user=for_user, exclude_viewed=exclude_viewed) 75 | return qs 76 | 77 | 78 | @register.assignment_tag 79 | def get_joyride(slug, url_path=None, for_user=None, viewed=False): 80 | return JoyRide.objects.get_joyride( 81 | slug, url_path=url_path, for_user=for_user, viewed=viewed) 82 | -------------------------------------------------------------------------------- /joyride/static/joyride/css/joyride-2.1.min.css: -------------------------------------------------------------------------------- 1 | body{position:relative}#joyRideTipContent,.joyRideTipContent{display:none}.joyride-tip-guide{position:absolute;background:#000;background:rgba(0,0,0,.8);display:none;color:#fff;width:300px;z-index:13001;top:0;left:0;font-family:HelveticaNeue,"Helvetica Neue",Helvetica,Helvetica,Arial,Lucida,sans-serif;font-weight:400;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.joyride-content-wrapper{padding:10px 10px 15px 15px}@media only screen and (max-width:767px){.joyride-tip-guide{width:95%!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;left:2.5%!important}.joyride-tip-guide-wrapper{width:100%}}.joyride-tip-guide span.joyride-nub{display:block;position:absolute;left:22px;width:0;height:0;border:14px solid}.joyride-tip-guide span.joyride-nub.top{border-color:#000;border-color:rgba(0,0,0,.8);border-top-color:transparent!important;border-left-color:transparent!important;border-right-color:transparent!important;border-top-width:0;top:-14px;bottom:none}.joyride-tip-guide span.joyride-nub.bottom{border-color:#000;border-color:rgba(0,0,0,.8) 0 transparent!important;border-color:rgba(0,0,0,.8) transparent transparent!important;border-bottom-width:0;bottom:-14px;bottom:none}.joyride-tip-guide span.joyride-nub.right{border-color:#000;border-color:transparent transparent transparent rgba(0,0,0,.8)!important;border-right-width:0;top:22px;bottom:none;left:auto;right:-14px}.joyride-tip-guide span.joyride-nub.left{border-color:#000;border-color:transparent rgba(0,0,0,.8) transparent transparent!important;border-left-width:0;top:22px;left:-14px;right:auto;bottom:none}.joyride-tip-guide span.joyride-nub.top-right{border-color:#000;border-color:rgba(0,0,0,.8);border-top-color:transparent!important;border-left-color:transparent!important;border-right-color:transparent!important;border-top-width:0;top:-14px;bottom:none;left:auto;right:28px}.joyride-tip-guide h1,.joyride-tip-guide h2,.joyride-tip-guide h3,.joyride-tip-guide h4,.joyride-tip-guide h5,.joyride-tip-guide h6{line-height:1.25;margin:0;font-weight:700;color:#fff}.joyride-tip-guide h1{font-size:30px}.joyride-tip-guide h2{font-size:26px}.joyride-tip-guide h3{font-size:22px}.joyride-tip-guide h4{font-size:18px}.joyride-tip-guide h5{font-size:16px}.joyride-tip-guide h6{font-size:14px}.joyride-tip-guide p{margin:0 0 18px;font-size:14px;line-height:18px}.joyride-tip-guide a{color:#fff;text-decoration:none;border-bottom:dotted 1px rgba(255,255,255,.6)}.joyride-tip-guide a:hover{color:rgba(255,255,255,.8);border-bottom:none}.joyride-tip-guide .joyride-next-tip{width:auto;padding:6px 18px 4px;font-size:13px;text-decoration:none;color:#fff;border:1px solid #003cb4;background:#0063ff;background:-moz-linear-gradient(top,#0063ff 0,#0055d6 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#0063ff),color-stop(100%,#0055d6));background:-webkit-linear-gradient(top,#0063ff 0,#0055d6 100%);background:-o-linear-gradient(top,#0063ff 0,#0055d6 100%);background:-ms-linear-gradient(top,#0063ff 0,#0055d6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0063ff', endColorstr='#0055d6', GradientType=0);background:linear-gradient(top,#0063ff 0,#0055d6 100%);text-shadow:0 -1px 0 rgba(0,0,0,.5);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3) inset;box-shadow:0 1px 0 rgba(255,255,255,.3) inset}.joyride-next-tip:hover{color:#fff!important;border:1px solid #003cb4!important;background:#2b80ff;background:-moz-linear-gradient(top,#2b80ff 0,#1d66d3 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#2b80ff),color-stop(100%,#1d66d3));background:-webkit-linear-gradient(top,#2b80ff 0,#1d66d3 100%);background:-o-linear-gradient(top,#2b80ff 0,#1d66d3 100%);background:-ms-linear-gradient(top,#2b80ff 0,#1d66d3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b80ff', endColorstr='#1d66d3', GradientType=0);background:linear-gradient(top,#2b80ff 0,#1d66d3 100%)}.joyride-timer-indicator-wrap{width:50px;height:3px;border:1px solid rgba(255,255,255,.1);position:absolute;right:17px;bottom:16px}.joyride-timer-indicator{display:block;width:0;height:inherit;background:rgba(255,255,255,.25)}.joyride-close-tip{position:absolute;right:10px;top:10px;color:rgba(255,255,255,.4)!important;text-decoration:none;font-family:Verdana,sans-serif;font-size:10px;font-weight:700;border-bottom:none!important}.joyride-close-tip:hover{color:rgba(255,255,255,.9)!important}.joyride-modal-bg{position:fixed;height:100%;width:100%;background:0 0;background:rgba(0,0,0,.5);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);opacity:.5;z-index:13000;display:none;top:0;left:0;cursor:pointer}.joyride-expose-wrapper{background-color:#fff;position:absolute;z-index:13002;-moz-box-shadow:0 0 30px #fff;-webkit-box-shadow:0 0 30px #fff;box-shadow:0 0 30px #fff}.joyride-expose-cover{background:0 0;position:absolute;z-index:20000;top:0;left:0} -------------------------------------------------------------------------------- /joyride/static/joyride/js/modernizr.mq.js: -------------------------------------------------------------------------------- 1 | /* Modernizr 2.6.1 (Custom Build) | MIT & BSD 2 | * Build: http://modernizr.com/download/#-mq-teststyles 3 | */ 4 | ; 5 | 6 | 7 | 8 | window.Modernizr = (function( window, document, undefined ) { 9 | 10 | var version = '2.6.1', 11 | 12 | Modernizr = {}, 13 | 14 | 15 | docElement = document.documentElement, 16 | 17 | mod = 'modernizr', 18 | modElem = document.createElement(mod), 19 | mStyle = modElem.style, 20 | 21 | inputElem , 22 | 23 | 24 | toString = {}.toString, tests = {}, 25 | inputs = {}, 26 | attrs = {}, 27 | 28 | classes = [], 29 | 30 | slice = classes.slice, 31 | 32 | featureName, 33 | 34 | 35 | injectElementWithStyles = function( rule, callback, nodes, testnames ) { 36 | 37 | var style, ret, node, 38 | div = document.createElement('div'), 39 | body = document.body, 40 | fakeBody = body ? body : document.createElement('body'); 41 | 42 | if ( parseInt(nodes, 10) ) { 43 | while ( nodes-- ) { 44 | node = document.createElement('div'); 45 | node.id = testnames ? testnames[nodes] : mod + (nodes + 1); 46 | div.appendChild(node); 47 | } 48 | } 49 | 50 | style = ['­',''].join(''); 51 | div.id = mod; 52 | (body ? div : fakeBody).innerHTML += style; 53 | fakeBody.appendChild(div); 54 | if ( !body ) { 55 | fakeBody.style.background = ""; 56 | docElement.appendChild(fakeBody); 57 | } 58 | 59 | ret = callback(div, rule); 60 | !body ? fakeBody.parentNode.removeChild(fakeBody) : div.parentNode.removeChild(div); 61 | 62 | return !!ret; 63 | 64 | }, 65 | 66 | testMediaQuery = function( mq ) { 67 | 68 | var matchMedia = window.matchMedia || window.msMatchMedia; 69 | if ( matchMedia ) { 70 | return matchMedia(mq).matches; 71 | } 72 | 73 | var bool; 74 | 75 | injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { 76 | bool = (window.getComputedStyle ? 77 | getComputedStyle(node, null) : 78 | node.currentStyle)['position'] == 'absolute'; 79 | }); 80 | 81 | return bool; 82 | 83 | }, 84 | _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; 85 | 86 | if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { 87 | hasOwnProp = function (object, property) { 88 | return _hasOwnProperty.call(object, property); 89 | }; 90 | } 91 | else { 92 | hasOwnProp = function (object, property) { 93 | return ((property in object) && is(object.constructor.prototype[property], 'undefined')); 94 | }; 95 | } 96 | 97 | 98 | if (!Function.prototype.bind) { 99 | Function.prototype.bind = function bind(that) { 100 | 101 | var target = this; 102 | 103 | if (typeof target != "function") { 104 | throw new TypeError(); 105 | } 106 | 107 | var args = slice.call(arguments, 1), 108 | bound = function () { 109 | 110 | if (this instanceof bound) { 111 | 112 | var F = function(){}; 113 | F.prototype = target.prototype; 114 | var self = new F(); 115 | 116 | var result = target.apply( 117 | self, 118 | args.concat(slice.call(arguments)) 119 | ); 120 | if (Object(result) === result) { 121 | return result; 122 | } 123 | return self; 124 | 125 | } else { 126 | 127 | return target.apply( 128 | that, 129 | args.concat(slice.call(arguments)) 130 | ); 131 | 132 | } 133 | 134 | }; 135 | 136 | return bound; 137 | }; 138 | } 139 | 140 | function setCss( str ) { 141 | mStyle.cssText = str; 142 | } 143 | 144 | function setCssAll( str1, str2 ) { 145 | return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); 146 | } 147 | 148 | function is( obj, type ) { 149 | return typeof obj === type; 150 | } 151 | 152 | function contains( str, substr ) { 153 | return !!~('' + str).indexOf(substr); 154 | } 155 | 156 | 157 | function testDOMProps( props, obj, elem ) { 158 | for ( var i in props ) { 159 | var item = obj[props[i]]; 160 | if ( item !== undefined) { 161 | 162 | if (elem === false) return props[i]; 163 | 164 | if (is(item, 'function')){ 165 | return item.bind(elem || obj); 166 | } 167 | 168 | return item; 169 | } 170 | } 171 | return false; 172 | } 173 | for ( var feature in tests ) { 174 | if ( hasOwnProp(tests, feature) ) { 175 | featureName = feature.toLowerCase(); 176 | Modernizr[featureName] = tests[feature](); 177 | 178 | classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); 179 | } 180 | } 181 | 182 | 183 | 184 | Modernizr.addTest = function ( feature, test ) { 185 | if ( typeof feature == 'object' ) { 186 | for ( var key in feature ) { 187 | if ( hasOwnProp( feature, key ) ) { 188 | Modernizr.addTest( key, feature[ key ] ); 189 | } 190 | } 191 | } else { 192 | 193 | feature = feature.toLowerCase(); 194 | 195 | if ( Modernizr[feature] !== undefined ) { 196 | return Modernizr; 197 | } 198 | 199 | test = typeof test == 'function' ? test() : test; 200 | 201 | if (enableClasses) { 202 | docElement.className += ' ' + (test ? '' : 'no-') + feature; 203 | } 204 | Modernizr[feature] = test; 205 | 206 | } 207 | 208 | return Modernizr; 209 | }; 210 | 211 | 212 | setCss(''); 213 | modElem = inputElem = null; 214 | 215 | 216 | Modernizr._version = version; 217 | 218 | 219 | Modernizr.mq = testMediaQuery; 220 | Modernizr.testStyles = injectElementWithStyles; 221 | return Modernizr; 222 | 223 | })(this, this.document); 224 | ; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | django-joyride 2 | ============== 3 | 4 | A django application which gives flexibility to configure Guided Tours on your site through admin panel. 5 | 6 | * This application is built on top of jQuery plugin [zurb-joyride](https://github.com/zurb/joyride). 7 | 8 | Installation 9 | ============ 10 | 11 | Install from PyPI with ``easy_install`` or ``pip``: 12 | 13 | pip install django-joyride 14 | 15 | To use ``django-joyride`` in your Django project: 16 | 17 | 1. Add ``joyride`` to your ``INSTALLED_APPS`` setting. 18 | 2. Run ``syncdb`` command to initialise the ``joyride`` database tables 19 | 3. Run ``collectstatic`` command to collect the static files of joyride into ``STATIC_ROOT`` 20 | 21 | Configuration 22 | ============= 23 | 24 | Available settings: 25 | 26 | * ``JOYRIDE_JQUERY_URL`` 27 | * Set this to different version of jquery in your static folder, If you wish to use a different version of jQuery, or host it yourself 28 | * e.g. ``JOYRIDE_JQUERY_URL = 'joyride/js/jquery.min.js'`` This will use the jQuery available at ``STATIC_URL/joyride/js/jquery.min.js``. A relative ``JOYRIDE_JQUERY_URL`` is relative to ``STATIC_URL``. 29 | * Set this to ``None`` if you have already included jQuery in your template so that ``joyride_media`` and ``joyride_js`` template tag should not include jQuery to avoid conflict. 30 | * e.g. ``JOYRIDE_JQUERY_URL = None`` 31 | 32 | * ``JOYRIDE_JQUERY_COOKIE_URL`` 33 | * Same settings as ``JOYRIDE_JQUERY_URL``, it decide whether to include or not to include the ``jquery.cookie.js``. This should be included if you are going to use the ``zurb-joyride`` option ``cookieMonster`` 34 | 35 | * ``JOYRIDE_JQUERY_MODERNIZR_URL`` 36 | * Same settings as ``JOYRIDE_JQUERY_URL``, it decide whether to include or not to include the jquery modernizr. 37 | 38 | * ``JOYRIDE_LIB_URL`` 39 | * Set this to use latest version of ``zurb-joyride`` js library instead. This package already contains this library with some bug fixes. It is strongly suggested that you should not change this setting until ``zurb-joyride`` apply some fixes which I have posted there, check status of [Issue 161](https://github.com/zurb/joyride/issues/161) and [Issue 167](https://github.com/zurb/joyride/issues/167) 40 | 41 | 42 | Add joyride tours from admin 43 | ============================ 44 | 45 | * The model and model fields are self explanatory. All model fields have help text for better understanding. Still if you want more documentation on it then check the comprehensive [documentation](http://zurb.com/playground/jquery-joyride-feature-tour-plugin) on ``zurb-joyride`` 46 | * Following model fields are extra and comes in handy: 47 | * ``url_path`` 48 | * The url e.g. ``/about/`` or url regex ``/abc/\d+/`` of the page for which you are creating the joyride tour. Later on you can use this as a parameter in template tags to filter joyrides based on ``request.path`` 49 | 50 | * The **BOTTLENECK** of ``zurb-joyride`` 51 | * ``showJoyRideElement`` and ``showJoyRideElementOn`` fields 52 | * Arrggh! it is not possible to use multiple joyrides on single page unless previous joyrides are destroyed. So in order to overcome that situation sometime you might want to activate the second joyride tour on some event. Lets say we want our second joyride to be activated when user ``click`` on some element whose id or class is ``abc`` then you need to set ``showJoyRideElement=#abc`` and ``showJoyRideElementOn=click``. 53 | * ``destroy`` field 54 | * IDs(slug) of joyrides which should be destroyed before invoking this joyride e.g. ``destroy=#abc, #cde`` 55 | 56 | Template Tags 57 | ============= 58 | 59 | 1. **Include The Media** 60 | * Load the django-joyride template tags ``{% load joyride_tags %}`` 61 | * Include the media (css and js files) ``{% joyride_media %}`` 62 | * By default the ``joyride_media`` tag also includes ``jQuery``, ``jQuery Modernizer`` and ``jQuery Cookie`` based on the value of your ``JOYRIDE_JQUERY_URL``, ``JOYRIDE_JQUERY_MODERNIZR_URL`` and ``JOYRIDE_JQUERY_COOKIE_URL`` settings. To suppress the inclusion of these libraries (if you are already including it yourself), set these settings to ``None``. 63 | 64 | If you prefer to link CSS and Javascript from different locations, the ``joyride_media`` tag can be replaced with two separate tags, ``joyride_css`` and ``joyride_js``. ``joyride_js`` accepts parameters to suppress jQuery, jQuery Modernizr and jQuery Cookie inclusion at template level also, just like ``joyride_media`` 65 | * e.g. ``{% joyride_js no_jquery="true" no_jquery_modernizr="true" %}`` 66 | 67 | 1. **Include the joyride tour(s)** 68 | * You need to use ``get_joyrides``, ``include_joyrides`` and ``get_joyride``, ``include_joyride`` to include multiple joyride tours or single joyride tour respectively in template. 69 | * ``get_joyrides`` and ``get_joyride`` both tags accept parameters to filter the joyrides. Following filters are common in both: 70 | * ``url_path`` filter joyrides by url path. 71 | * e.g. ``{% get_joyrides url_path=request.path as joyrides %}`` 72 | * If you have left ``url_path`` empty while configuring joyride in admin then in order to get those joyride whose ``url_path`` is empty you would do ``{% get_joyrides url_path="" as joyrides %}`` 73 | * ``for_user`` filter joyrides by user if you are using ``JoyRideHistory`` model to keep track of joyrides with respect to user. 74 | * e.g. ``{% get_joyrides for_user=request.user as joyrides %}`` # this will get all joyrides for user which are not viewed or cancelled by user. 75 | * ``exclude_viewed`` (default=True) if you want to include all joyrides for user irrespective of seen/cancelled or not 76 | * e.g. ``{% get_joyrides for_user=request.user exclude_viewed=False %}`` 77 | * ``slug`` only used with ``get_joyride`` to get single joyride. 78 | * e.g. ``{% get_joyride "my-tour-slug" %}`` 79 | 80 | * Include Multiple joyrides 81 | ``` 82 | {% get_joyrides as joyrides %} 83 | {% include_joyrides joyrides %} 84 | ``` 85 | 86 | * Include Single joyride 87 | ``` 88 | {% get_joyride "my-tour-slug" as joyride %} 89 | {% include_joyride joyride %} 90 | ``` 91 | 92 | JoyRideHistory Model 93 | ==================== 94 | 95 | * This model is only used if you have registered users on your site and you want to keep track of joyrides which are already viewed by user so that those joyrides should never be shown to user again. It is up to you how you are going to make use of this table. Below is an example: 96 | 97 | Set ``postRideCallback=mark_viewed_joyride`` (A method to call once the tour closes (cancelled or complete)) in admin. 98 | Write the javascript callback ``mark_viewed_joyride`` some where in your template: 99 | 100 | ``` 101 | function mark_joyride(index, tip, id){ 102 | $.ajax({ 103 | url: '{% url mark_joyride %}', 104 | data: {"slug": id}, 105 | dataType: 'text', 106 | success: function(){ 107 | $("#"+id).remove(); // remove the element also from dom 108 | } 109 | }); 110 | } 111 | ``` 112 | 113 | The view for ``{% url mark_joyride %}`` would be: 114 | 115 | ``` 116 | @login_required 117 | def mark_joyride(request): 118 | from joyride.models import JoyRide, JoyRideHistory 119 | slug = request.GET.get('slug') 120 | joyride = get_object_or_404(JoyRide, slug=slug) 121 | user = request.user 122 | obj, created = JoyRideHistory.objects.get_or_create(user=user, joyride=joyride) 123 | if not created: 124 | obj.viewed = True 125 | obj.save() 126 | return HttpResponse(json.dumps({}), content_type='application/json') 127 | ``` 128 | 129 | 130 | Thanks To 131 | ========== 132 | - [zurb-joyride](https://github.com/zurb/joyride) This package is built on top of it. 133 | - [django-markitup](https://bitbucket.org/carljm/django-markitup/) for some help in template tags. 134 | -------------------------------------------------------------------------------- /joyride/static/joyride/css/joyride-2.1.css: -------------------------------------------------------------------------------- 1 | /* Artfully masterminded by ZURB */ 2 | body { 3 | position: relative; 4 | } 5 | 6 | #joyRideTipContent { display: none; } 7 | 8 | .joyRideTipContent { display: none; } 9 | 10 | /* Default styles for the container */ 11 | .joyride-tip-guide { 12 | position: absolute; 13 | background: #000; 14 | background: rgba(0,0,0,0.8); 15 | display: none; 16 | color: #fff; 17 | width: 300px; 18 | z-index: 13001; 19 | top: 0; /* keeps the page from scrolling when calculating position */ 20 | left: 0; 21 | font-family: "HelveticaNeue", "Helvetica Neue", "Helvetica", Helvetica, Arial, Lucida, sans-serif; 22 | font-weight: normal; 23 | -moz-border-radius: 4px; 24 | -webkit-border-radius: 4px; 25 | border-radius: 4px; 26 | } 27 | 28 | .joyride-content-wrapper { 29 | padding: 10px 10px 15px 15px; 30 | } 31 | 32 | /* Mobile */ 33 | @media only screen and (max-width: 767px) { 34 | .joyride-tip-guide { 35 | width: 95% !important; 36 | -moz-border-radius: 0; 37 | -webkit-border-radius: 0; 38 | border-radius: 0; 39 | left: 2.5% !important; 40 | } 41 | .joyride-tip-guide-wrapper { 42 | width: 100%; 43 | } 44 | } 45 | 46 | 47 | /* Add a little css triangle pip, older browser just miss out on the fanciness of it */ 48 | .joyride-tip-guide span.joyride-nub { 49 | display: block; 50 | position: absolute; 51 | left: 22px; 52 | width: 0; 53 | height: 0; 54 | border: solid 14px; 55 | border: solid 14px; 56 | } 57 | 58 | .joyride-tip-guide span.joyride-nub.top { 59 | /* 60 | IE7/IE8 Don't support rgba so we set the fallback 61 | border color here. However, IE7/IE8 are also buggy 62 | in that the fallback color doesn't work for 63 | border-bottom-color so here we set the border-color 64 | and override the top,left,right colors below. 65 | */ 66 | border-color: #000; 67 | border-color: rgba(0,0,0,0.8); 68 | border-top-color: transparent !important; 69 | border-left-color: transparent !important; 70 | border-right-color: transparent !important; 71 | border-top-width: 0; 72 | top: -14px; 73 | bottom: none; 74 | } 75 | 76 | .joyride-tip-guide span.joyride-nub.bottom { 77 | /* 78 | IE7/IE8 Don't support rgba so we set the fallback 79 | border color here. However, IE7/IE8 are also buggy 80 | in that the fallback color doesn't work for 81 | border-top-color so here we set the border-color 82 | and override the bottom,left,right colors below. 83 | */ 84 | border-color: #000; 85 | border-color: rgba(0,0,0,0.8) !important; 86 | border-bottom-color: transparent !important; 87 | border-left-color: transparent !important; 88 | border-right-color: transparent !important; 89 | border-bottom-width: 0; 90 | bottom: -14px; 91 | bottom: none; 92 | } 93 | 94 | .joyride-tip-guide span.joyride-nub.right { 95 | border-color: #000; 96 | border-color: rgba(0,0,0,0.8) !important; 97 | border-top-color: transparent !important; 98 | border-right-color: transparent !important; 99 | border-bottom-color: transparent !important; 100 | border-right-width: 0; 101 | top: 22px; 102 | bottom: none; 103 | left: auto; 104 | right: -14px; 105 | } 106 | 107 | .joyride-tip-guide span.joyride-nub.left { 108 | border-color: #000; 109 | border-color: rgba(0,0,0,0.8) !important; 110 | border-top-color: transparent !important; 111 | border-left-color: transparent !important; 112 | border-bottom-color: transparent !important; 113 | border-left-width: 0; 114 | top: 22px; 115 | left: -14px; 116 | right: auto; 117 | bottom: none; 118 | } 119 | 120 | .joyride-tip-guide span.joyride-nub.top-right { 121 | border-color: #000; 122 | border-color: rgba(0,0,0,0.8); 123 | border-top-color: transparent !important; 124 | border-left-color: transparent !important; 125 | border-right-color: transparent !important; 126 | border-top-width: 0; 127 | top: -14px; 128 | bottom: none; 129 | left: auto; 130 | right: 28px; 131 | } 132 | 133 | /* Typography */ 134 | .joyride-tip-guide h1,.joyride-tip-guide h2,.joyride-tip-guide h3,.joyride-tip-guide h4,.joyride-tip-guide h5,.joyride-tip-guide h6 { 135 | line-height: 1.25; 136 | margin: 0; 137 | font-weight: bold; 138 | color: #fff; 139 | } 140 | .joyride-tip-guide h1 { font-size: 30px; } 141 | .joyride-tip-guide h2 { font-size: 26px; } 142 | .joyride-tip-guide h3 { font-size: 22px; } 143 | .joyride-tip-guide h4 { font-size: 18px; } 144 | .joyride-tip-guide h5 { font-size: 16px; } 145 | .joyride-tip-guide h6 { font-size: 14px; } 146 | .joyride-tip-guide p { 147 | margin: 0 0 18px 0; 148 | font-size: 14px; 149 | line-height: 18px; 150 | } 151 | .joyride-tip-guide a { 152 | color: rgb(255,255,255); 153 | text-decoration: none; 154 | border-bottom: dotted 1px rgba(255,255,255,0.6); 155 | } 156 | .joyride-tip-guide a:hover { 157 | color: rgba(255,255,255,0.8); 158 | border-bottom: none; 159 | } 160 | 161 | /* Button Style */ 162 | .joyride-tip-guide .joyride-next-tip { 163 | width: auto; 164 | padding: 6px 18px 4px; 165 | font-size: 13px; 166 | text-decoration: none; 167 | color: rgb(255,255,255); 168 | border: solid 1px rgb(0,60,180); 169 | background: rgb(0,99,255); 170 | background: -moz-linear-gradient(top, rgb(0,99,255) 0%, rgb(0,85,214) 100%); 171 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(0,99,255)), color-stop(100%,rgb(0,85,214))); 172 | background: -webkit-linear-gradient(top, rgb(0,99,255) 0%,rgb(0,85,214) 100%); 173 | background: -o-linear-gradient(top, rgb(0,99,255) 0%,rgb(0,85,214) 100%); 174 | background: -ms-linear-gradient(top, rgb(0,99,255) 0%,rgb(0,85,214) 100%); 175 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0063ff', endColorstr='#0055d6',GradientType=0 ); 176 | background: linear-gradient(top, rgb(0,99,255) 0%,rgb(0,85,214) 100%); 177 | text-shadow: 0 -1px 0 rgba(0,0,0,0.5); 178 | -webkit-border-radius: 2px; 179 | -moz-border-radius: 2px; 180 | border-radius: 2px; 181 | -webkit-box-shadow: 0px 1px 0px rgba(255,255,255,0.3) inset; 182 | -moz-box-shadow: 0px 1px 0px rgba(255,255,255,0.3) inset; 183 | box-shadow: 0px 1px 0px rgba(255,255,255,0.3) inset; 184 | } 185 | 186 | .joyride-next-tip:hover { 187 | color: rgb(255,255,255) !important; 188 | border: solid 1px rgb(0,60,180) !important; 189 | background: rgb(43,128,255); 190 | background: -moz-linear-gradient(top, rgb(43,128,255) 0%, rgb(29,102,211) 100%); 191 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(43,128,255)), color-stop(100%,rgb(29,102,211))); 192 | background: -webkit-linear-gradient(top, rgb(43,128,255) 0%,rgb(29,102,211) 100%); 193 | background: -o-linear-gradient(top, rgb(43,128,255) 0%,rgb(29,102,211) 100%); 194 | background: -ms-linear-gradient(top, rgb(43,128,255) 0%,rgb(29,102,211) 100%); 195 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2b80ff', endColorstr='#1d66d3',GradientType=0 ); 196 | background: linear-gradient(top, rgb(43,128,255) 0%,rgb(29,102,211) 100%); 197 | } 198 | 199 | .joyride-timer-indicator-wrap { 200 | width: 50px; 201 | height: 3px; 202 | border: solid 1px rgba(255,255,255,0.1); 203 | position: absolute; 204 | right: 17px; 205 | bottom: 16px; 206 | } 207 | .joyride-timer-indicator { 208 | display: block; 209 | width: 0; 210 | height: inherit; 211 | background: rgba(255,255,255,0.25); 212 | } 213 | 214 | .joyride-close-tip { 215 | position: absolute; 216 | right: 10px; 217 | top: 10px; 218 | color: rgba(255,255,255,0.4) !important; 219 | text-decoration: none; 220 | font-family: Verdana, sans-serif; 221 | font-size: 10px; 222 | font-weight: bold; 223 | border-bottom: none !important; 224 | } 225 | 226 | .joyride-close-tip:hover { 227 | color: rgba(255,255,255,0.9) !important; 228 | } 229 | 230 | .joyride-modal-bg { 231 | position: fixed; 232 | height: 100%; 233 | width: 100%; 234 | background: rgb(0,0,0); 235 | background: transparent; 236 | background: rgba(0,0,0, 0.5); 237 | -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; 238 | filter: alpha(opacity=50); 239 | opacity: 0.5; 240 | z-index: 13000; 241 | display: none; 242 | top: 0; 243 | left: 0; 244 | cursor: pointer; 245 | } 246 | 247 | .joyride-expose-wrapper { 248 | background-color: #ffffff; 249 | position: absolute; 250 | z-index: 13002; 251 | -moz-box-shadow: 0px 0px 30px #ffffff; 252 | -webkit-box-shadow: 0px 0px 30px #ffffff; 253 | box-shadow: 0px 0px 30px #ffffff; 254 | } 255 | 256 | .joyride-expose-cover { 257 | background: transparent; 258 | position: absolute; 259 | z-index: 20000; 260 | top: 0px; 261 | left: 0px; 262 | } 263 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | django-joyride 2 | ============== 3 | 4 | A django application which gives flexibility to configure Guided Tours 5 | on your site through admin panel. 6 | 7 | - This application is built on top of jQuery plugin `zurb-joyride `__. 8 | 9 | Installation 10 | ============ 11 | 12 | - Install from PyPI with ``easy_install`` or ``pip``: 13 | 14 | :: 15 | 16 | pip install django-joyride 17 | 18 | - To use ``django-joyride`` in your Django project: 19 | 20 | 1. Add ``joyride`` to your ``INSTALLED_APPS`` setting. 21 | 2. Run ``syncdb`` command to initialise the ``joyride`` database tables 22 | 3. Run ``collectstatic`` command to collect the static files of joyride 23 | into ``STATIC_ROOT`` 24 | 25 | Configuration 26 | ============= 27 | 28 | Available settings: 29 | 30 | - ``JOYRIDE_JQUERY_URL`` 31 | - Set this to different version of jquery in your static folder, If you 32 | wish to use a different version of jQuery, or host it yourself 33 | 34 | - e.g. ``JOYRIDE_JQUERY_URL = 'joyride/js/jquery.min.js'`` This will 35 | use the jQuery available at ``STATIC_URL/joyride/js/jquery.min.js``. A relative ``JOYRIDE_JQUERY_URL`` is relative to ``STATIC_URL``. 36 | 37 | - Set this to ``None`` if you have already included jQuery in your 38 | template so that ``joyride_media`` and ``joyride_js`` template tag 39 | should not include jQuery to avoid conflict. 40 | 41 | - e.g. ``JOYRIDE_JQUERY_URL = None`` 42 | 43 | - ``JOYRIDE_JQUERY_COOKIE_URL`` 44 | - Same settings as ``JOYRIDE_JQUERY_URL``, it decide whether to include 45 | or not to include the ``jquery.cookie.js``. This should be included 46 | if you are going to use the ``zurb-joyride`` option ``cookieMonster`` 47 | 48 | - ``JOYRIDE_JQUERY_MODERNIZR_URL`` 49 | - Same settings as ``JOYRIDE_JQUERY_URL``, it decide whether to include 50 | or not to include the jquery modernizr. 51 | 52 | - ``JOYRIDE_LIB_URL`` 53 | - Set this to use latest version of ``zurb-joyride`` js library 54 | instead. This package already contains this library with some bug 55 | fixes. It is strongly suggested that you should not change this 56 | setting until ``zurb-joyride`` apply some fixes which I have posted 57 | there, check status of `Issue 161 `__ and `Issue 167 `__ 58 | 59 | Add joyride tours from admin 60 | ============================ 61 | 62 | - The model and model fields are self explanatory. All model fields 63 | have help text for better understanding. Still if you want more 64 | documentation on it then check the comprehensive `documentation `__ on ``zurb-joyride`` 65 | - Following model fields are extra and comes in handy: 66 | - ``url_path`` 67 | 68 | - The url e.g. ``/about/`` or url regex ``/abc/\d+/`` of the page 69 | for which you are creating the joyride tour. Later on you can use 70 | this as a parameter in template tags to filter joyrides based on 71 | ``request.path`` 72 | 73 | - The **BOTTLENECK** of ``zurb-joyride`` 74 | 75 | - ``showJoyRideElement`` and ``showJoyRideElementOn`` fields 76 | - Arrggh! it is not possible to use multiple joyrides on single page 77 | unless previous joyrides are destroyed. So in order to overcome 78 | that situation sometime you might want to activate the second 79 | joyride tour on some event. Lets say we want our second joyride to 80 | be activated when user ``click`` on some element whose id or class 81 | is ``abc`` then you need to set ``showJoyRideElement=#abc`` and 82 | ``showJoyRideElementOn=click``. 83 | - ``destroy`` field 84 | - IDs(slug) of joyrides which should be destroyed before invoking 85 | this joyride e.g. ``destroy=#abc, #cde`` 86 | 87 | Template Tags 88 | ============= 89 | 90 | 1. **Include The Media** 91 | 92 | - Load the django-joyride template tags ``{% load joyride_tags %}`` 93 | - Include the media (css and js files) ``{% joyride_media %}`` 94 | 95 | - By default the ``joyride_media`` tag also includes ``jQuery``, 96 | ``jQuery Modernizer`` and ``jQuery Cookie`` based on the value of 97 | your ``JOYRIDE_JQUERY_URL``, ``JOYRIDE_JQUERY_MODERNIZR_URL`` and 98 | ``JOYRIDE_JQUERY_COOKIE_URL`` settings. To suppress the inclusion 99 | of these libraries (if you are already including it yourself), set 100 | these settings to ``None``. 101 | | 102 | If you prefer to link CSS and Javascript from different locations, 103 | the ``joyride_media`` tag can be replaced with two separate tags, 104 | ``joyride_css`` and ``joyride_js``. ``joyride_js`` accepts parameters 105 | to suppress jQuery, jQuery Modernizr and jQuery Cookie inclusion at 106 | template level also, just like ``joyride_media`` 107 | 108 | - e.g. 109 | ``{% joyride_js no_jquery="true" no_jquery_modernizr="true" %}`` 110 | 111 | 1. **Include the joyride tour(s)** 112 | 113 | - You need to use ``get_joyrides``, ``include_joyrides`` and 114 | ``get_joyride``, ``include_joyride`` to include multiple joyride 115 | tours or single joyride tour respectively in template. 116 | - ``get_joyrides`` and ``get_joyride`` both tags accept parameters to 117 | filter the joyrides. Following filters are common in both: 118 | 119 | - ``url_path`` filter joyrides by url path. 120 | - e.g. ``{% get_joyrides url_path=request.path as joyrides %}`` 121 | - If you have left ``url_path`` empty while configuring joyride in 122 | admin then in order to get those joyride whose ``url_path`` is 123 | empty you would do ``{% get_joyrides url_path="" as joyrides %}`` 124 | - ``for_user`` filter joyrides by user if you are using 125 | ``JoyRideHistory`` model to keep track of joyrides with respect to 126 | user. 127 | - e.g. ``{% get_joyrides for_user=request.user as joyrides %}`` # 128 | this will get all joyrides for user which are not viewed or 129 | cancelled by user. 130 | - ``exclude_viewed`` (default=True) if you want to include all 131 | joyrides for user irrespective of seen/cancelled or not 132 | - e.g. 133 | ``{% get_joyrides for_user=request.user exclude_viewed=False %}`` 134 | - ``slug`` only used with ``get_joyride`` to get single joyride. 135 | - e.g. ``{% get_joyride "my-tour-slug" %}`` 136 | 137 | - Include Multiple joyrides 138 | 139 | :: 140 | 141 | {% get_joyrides as joyrides %} 142 | {% include_joyrides joyrides %} 143 | 144 | - Include Single joyride 145 | 146 | :: 147 | 148 | {% get_joyride "my-tour-slug" as joyride %} 149 | {% include_joyride joyride %} 150 | 151 | JoyRideHistory Model 152 | ==================== 153 | 154 | - This model is only used if you have registered users on your site and 155 | you want to keep track of joyrides which are already viewed by user 156 | so that those joyrides should never be shown to user again. It is up 157 | to you how you are going to make use of this table. Below is an 158 | example: 159 | | 160 | Set ``postRideCallback=mark_viewed_joyride`` (A method to call once the 161 | tour closes (cancelled or complete)) in admin. Write the javascript 162 | callback ``mark_viewed_joyride`` some where in your template: 163 | :: 164 | function mark_joyride(index, tip, id){ $.ajax({ url: '{% url mark_joyride %}', data: {"slug": id}, dataType: 'text', success: function(){ $("#"+id).remove(); // remove the element also from dom } }); } 165 | 166 | The view for ``{% url mark_joyride %}`` would be: 167 | :: 168 | @login_required def mark_joyride(request): from joyride.models import JoyRide, JoyRideHistory slug = request.GET.get('slug') joyride = get_object_or_404(JoyRide, slug=slug) user = request.user obj, created = JoyRideHistory.objects.get_or_create(user=user, joyride=joyride) if not created: obj.viewed = True obj.save() return HttpResponse(json.dumps({}), content_type='application/json') 169 | Thanks To 170 | ========= 171 | 172 | - `zurb-joyride `__ This package is 173 | built on top of it. 174 | - `django-markitup `__ 175 | for some help in template tags. 176 | -------------------------------------------------------------------------------- /joyride/static/joyride/js/jquery.joyride-2.1.min.js: -------------------------------------------------------------------------------- 1 | var joyride_parent_id; (function(d,h,n){var p={version:"2.1",tipLocation:"bottom",nubPosition:"auto",scroll:!0,scrollSpeed:300,timer:0,autoStart:!1,startTimerOnClick:!0,startOffset:0,nextButton:!0,tipAnimation:"fade",pauseAfter:[],tipAnimationFadeSpeed:300,cookieMonster:!1,cookieName:"joyride",cookieDomain:!1,cookiePath:!1,localStorage:!1,localStorageKey:"joyride",tipContainer:"body",modal:!1,expose:!1,postExposeCallback:d.noop,preRideCallback:d.noop,postRideCallback:d.noop,preStepCallback:d.noop,postStepCallback:d.noop, template:{link:'X',timer:'
    ',tip:'
    ',wrapper:'',button:'',modal:'
    ',expose:'
    ',exposeCover:'
    '}}, k=k||!1,a={},c={init:function(b){return this.each(function(){d.isEmptyObject(a)?(a=d.extend(!0,p,b),a.document=h.document,a.$document=d(a.document),a.$window=d(h),a.$content_el=d(this),a.$body=d(a.tipContainer),a.body_offset=d(a.tipContainer).position(),a.$tip_content=d("> li",a.$content_el),a.paused=!1,a.attempts=0,"function"!==typeof a.postExposeCallback&&(a.postExposeCallback=h[a.postExposeCallback]),"function"!==typeof a.preRideCallback&&(a.preRideCallback=h[a.preRideCallback]),"function"!==typeof a.postRideCallback&& (a.postRideCallback=h[a.postRideCallback]),"function"!==typeof a.preStepCallback&&(a.preStepCallback=h[a.preStepCallback]),"function"!==typeof a.postStepCallback&&(a.postStepCallback=h[a.postStepCallback]),a.tipLocationPatterns={top:["bottom"],bottom:[],left:["right","top","bottom"],right:["left","top","bottom"]},c.jquery_check(),d.isFunction(d.cookie)||(a.cookieMonster=!1),a.cookieMonster&&d.cookie(a.cookieName)||a.localStorage&&c.support_localstorage()&&localStorage.getItem(a.localStorageKey)|| (a.$tip_content.each(function(a){c.create({$li:d(this),index:a})}),a.autoStart&&(!a.startTimerOnClick&&0a.$li.next().length?c.end():0a.$li.next().length?c.end():0a.$target.length?c.show():c.end();else a.paused=!0},is_phone:function(){return k?k.mq("only screen and (max-width: 767px)"):767>a.$window.width()?!0:!1},support_localstorage:function(){return k?k.localstorage:!!h.localStorage},hide:function(){a.modal&&a.expose&&c.un_expose();a.modal||d(".joyride-modal-bg").hide();a.$current_tip.hide();a.postStepCallback(a.$li.index(),a.$current_tip)},set_li:function(b){b?(a.$li= a.$tip_content.eq(a.startOffset),c.set_next_tip(),a.$current_tip=a.$next_tip):(a.$li=a.$li.next(),c.set_next_tip());c.set_target()},set_next_tip:function(){a.$next_tip=d(".joyride-tip-guide[data-index="+a.$li.index()+"]")},set_target:function(){var b=a.$li.attr("data-class"),e=a.$li.attr("data-id");a.$target=e?d(a.document.getElementById(e)):b?d("."+b).filter(":visible").first():d("body")},scroll_to:function(){var b;b=a.$window.height()/2;b=Math.ceil(a.$target.offset().top-b+a.$next_tip.outerHeight()); d("html, body").stop().animate({scrollTop:b},a.scrollSpeed)},paused:function(){return-1===d.inArray(a.$li.index()+1,a.pauseAfter)?!0:!1},destroy:function(){d.isEmptyObject(a)||a.$document.off(".joyride");d(h).off(".joyride");d(".joyride-close-tip, .joyride-next-tip, .joyride-modal-bg").off(".joyride");d(".joyride-tip-guide, .joyride-modal-bg").remove();clearTimeout(a.automate);a={}},restart:function(){a.autoStart?(c.hide(),a.$li=n,c.show("init")):(!a.startTimerOnClick&&0d(".joyride-modal-bg").length&&d("body").append(a.template.modal).show();/pop/i.test(a.tipAnimation)?d(".joyride-modal-bg").show():d(".joyride-modal-bg").fadeIn(a.tipAnimationFadeSpeed)},expose:function(){var b,e,f,g,l="expose-"+Math.floor(1E4*Math.random()); if(0f.length)return h.console&&console.error("element not valid",f),!1;b=d(a.template.expose);a.$body.append(b);b.css({top:f.offset().top,left:f.offset().left,width:f.outerWidth(!0),height:f.outerHeight(!0)});e=d(a.template.exposeCover);g={zIndex:f.css("z-index"),position:f.css("position")};f.css("z-index",1*b.css("z-index")+1);"static"==g.position&&f.css("position", "relative");f.data("expose-css",g);e.css({top:f.offset().top,left:f.offset().left,width:f.outerWidth(!0),height:f.outerHeight(!0)});a.$body.append(e);b.addClass(l);e.addClass(l);a.tipSettings.exposeClass&&(b.addClass(a.tipSettings.exposeClass),e.addClass(a.tipSettings.exposeClass));f.data("expose",l);a.postExposeCallback(a.$li.index(),a.$next_tip,f);c.add_exposed(f)},un_expose:function(){var b,e,f;f=!1;if(0e.length)return h.console&&console.error("element not valid",e),!1;b=e.data("expose");b=d("."+b);1c?0:c);h>k&&(k=h);return[b.offset().topb.offset().left]},visible:function(a){for(var c=a.length;c--;)if(a[c])return!1;return!0},nub_position:function(a,c,d){"auto"===c?a.addClass(d):a.addClass(c)},startTimer:function(){a.$li.length?a.automate=setTimeout(function(){c.hide();c.show();c.startTimer()},a.timer):clearTimeout(a.automate)},end:function(){a.cookieMonster&&d.cookie(a.cookieName,"ridden",{expires:365,domain:a.cookieDomain,path:a.cookiePath});a.localStorage&&localStorage.setItem(a.localStorageKey,!0);0X', 44 | 'timer' : '
    ', 45 | 'tip' : '
    ', 46 | 'wrapper' : '', 47 | 'button' : '', 48 | 'modal' : '
    ', 49 | 'expose' : '
    ', 50 | 'exposeCover': '
    ' 51 | } 52 | }, 53 | 54 | Modernizr = Modernizr || false, 55 | 56 | settings = {}, 57 | 58 | methods = { 59 | 60 | init : function (opts) { 61 | return this.each(function () { 62 | 63 | if ($.isEmptyObject(settings)) { 64 | settings = $.extend(true, defaults, opts); 65 | 66 | // non configurable settings 67 | settings.document = window.document; 68 | settings.$document = $(settings.document); 69 | settings.$window = $(window); 70 | settings.$content_el = $(this); 71 | settings.$body = $(settings.tipContainer); 72 | settings.body_offset = $(settings.tipContainer).position(); 73 | settings.$tip_content = $('> li', settings.$content_el); 74 | settings.paused = false; 75 | settings.attempts = 0; 76 | // check if callbacks are passed as string 77 | if (typeof settings.postExposeCallback !== "function"){ 78 | settings.postExposeCallback = window[settings.postExposeCallback]; 79 | } 80 | if (typeof settings.preRideCallback !== "function"){ 81 | settings.preRideCallback = window[settings.preRideCallback]; 82 | } 83 | if (typeof settings.postRideCallback !== "function"){ 84 | settings.postRideCallback = window[settings.postRideCallback]; 85 | } 86 | if (typeof settings.preStepCallback !== "function"){ 87 | settings.preStepCallback = window[settings.preStepCallback]; 88 | } 89 | if (typeof settings.postStepCallback !== "function"){ 90 | settings.postStepCallback = window[settings.postStepCallback]; 91 | } 92 | 93 | settings.tipLocationPatterns = { 94 | top: ['bottom'], 95 | bottom: [], // bottom should not need to be repositioned 96 | left: ['right', 'top', 'bottom'], 97 | right: ['left', 'top', 'bottom'] 98 | }; 99 | 100 | // are we using jQuery 1.7+ 101 | methods.jquery_check(); 102 | 103 | // can we create cookies? 104 | if (!$.isFunction($.cookie)) { 105 | settings.cookieMonster = false; 106 | } 107 | 108 | // generate the tips and insert into dom. 109 | if ( (!settings.cookieMonster || !$.cookie(settings.cookieName) ) && 110 | (!settings.localStorage || !methods.support_localstorage() || !localStorage.getItem(settings.localStorageKey) ) ) { 111 | 112 | settings.$tip_content.each(function (index) { 113 | methods.create({$li : $(this), index : index}); 114 | }); 115 | 116 | // show first tip 117 | if(settings.autoStart) 118 | { 119 | if (!settings.startTimerOnClick && settings.timer > 0) { 120 | methods.show('init'); 121 | methods.startTimer(); 122 | } else { 123 | methods.show('init'); 124 | } 125 | } 126 | 127 | } 128 | 129 | settings.$document.on('click.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) { 130 | e.preventDefault(); 131 | 132 | if (settings.$li.next().length < 1) { 133 | methods.end(); 134 | } else if (settings.timer > 0) { 135 | clearTimeout(settings.automate); 136 | methods.hide(); 137 | methods.show(); 138 | methods.startTimer(); 139 | } else { 140 | methods.hide(); 141 | methods.show(); 142 | } 143 | 144 | }); 145 | 146 | settings.$document.on('click.joyride', '.joyride-close-tip', function (e) { 147 | e.preventDefault(); 148 | methods.end(); 149 | }); 150 | 151 | settings.$window.bind('resize.joyride', function (e) { 152 | if(settings.$li){ 153 | if(settings.exposed && settings.exposed.length>0){ 154 | var $els = $(settings.exposed); 155 | $els.each(function(){ 156 | var $this = $(this); 157 | methods.un_expose($this); 158 | methods.expose($this); 159 | }); 160 | } 161 | if (methods.is_phone()) { 162 | methods.pos_phone(); 163 | } else { 164 | methods.pos_default(); 165 | } 166 | } 167 | }); 168 | } else { 169 | methods.restart(); 170 | } 171 | 172 | }); 173 | }, 174 | 175 | // call this method when you want to resume the tour 176 | resume : function () { 177 | methods.set_li(); 178 | methods.show(); 179 | }, 180 | 181 | nextTip: function(){ 182 | if (settings.$li.next().length < 1) { 183 | methods.end(); 184 | } else if (settings.timer > 0) { 185 | clearTimeout(settings.automate); 186 | methods.hide(); 187 | methods.show(); 188 | methods.startTimer(); 189 | } else { 190 | methods.hide(); 191 | methods.show(); 192 | } 193 | }, 194 | 195 | tip_template : function (opts) { 196 | var $blank, content, $wrapper; 197 | 198 | opts.tip_class = opts.tip_class || ''; 199 | 200 | $blank = $(settings.template.tip).addClass(opts.tip_class); 201 | content = $.trim($(opts.li).html()) + 202 | methods.button_text(opts.button_text) + 203 | settings.template.link + 204 | methods.timer_instance(opts.index); 205 | 206 | $wrapper = $(settings.template.wrapper); 207 | if (opts.li.attr('data-aria-labelledby')) { 208 | $wrapper.attr('aria-labelledby', opts.li.attr('data-aria-labelledby')) 209 | } 210 | if (opts.li.attr('data-aria-describedby')) { 211 | $wrapper.attr('aria-describedby', opts.li.attr('data-aria-describedby')) 212 | } 213 | $blank.append($wrapper); 214 | $blank.first().attr('data-index', opts.index); 215 | joyride_parent_id = $(opts.li).parent().attr('id'); 216 | $('.joyride-content-wrapper', $blank).append(content); 217 | 218 | return $blank[0]; 219 | }, 220 | 221 | timer_instance : function (index) { 222 | var txt; 223 | 224 | if ((index === 0 && settings.startTimerOnClick && settings.timer > 0) || settings.timer === 0) { 225 | txt = ''; 226 | } else { 227 | txt = methods.outerHTML($(settings.template.timer)[0]); 228 | } 229 | return txt; 230 | }, 231 | 232 | button_text : function (txt) { 233 | if (settings.nextButton) { 234 | txt = $.trim(txt) || 'Next'; 235 | txt = methods.outerHTML($(settings.template.button).append(txt)[0]); 236 | } else { 237 | txt = ''; 238 | } 239 | return txt; 240 | }, 241 | 242 | create : function (opts) { 243 | // backwards compatibility with data-text attribute 244 | var buttonText = opts.$li.attr('data-button') || opts.$li.attr('data-text'), 245 | tipClass = opts.$li.attr('class'), 246 | $tip_content = $(methods.tip_template({ 247 | tip_class : tipClass, 248 | index : opts.index, 249 | button_text : buttonText, 250 | li : opts.$li 251 | })); 252 | 253 | $(settings.tipContainer).append($tip_content); 254 | }, 255 | 256 | show : function (init) { 257 | var opts = {}, ii, opts_arr = [], opts_len = 0, p, 258 | $timer = null; 259 | 260 | // are we paused? 261 | if (settings.$li === undefined || ($.inArray(settings.$li.index(), settings.pauseAfter) === -1)) { 262 | 263 | // don't go to the next li if the tour was paused 264 | if (settings.paused) { 265 | settings.paused = false; 266 | } else { 267 | methods.set_li(init); 268 | } 269 | 270 | settings.attempts = 0; 271 | 272 | if (settings.$li.length && settings.$target.length > 0) { 273 | if(init){ //run when we first start 274 | settings.preRideCallback(settings.$li.index(), settings.$next_tip ); 275 | if(settings.modal){ 276 | methods.show_modal(); 277 | } 278 | } 279 | settings.preStepCallback(settings.$li.index(), settings.$next_tip ); 280 | 281 | // parse options 282 | opts_arr = (settings.$li.data('options') || ':').split(';'); 283 | opts_len = opts_arr.length; 284 | for (ii = opts_len - 1; ii >= 0; ii--) { 285 | p = opts_arr[ii].split(':'); 286 | 287 | if (p.length === 2) { 288 | opts[$.trim(p[0])] = $.trim(p[1]); 289 | } 290 | } 291 | settings.tipSettings = $.extend({}, settings, opts); 292 | settings.tipSettings.tipLocationPattern = settings.tipLocationPatterns[settings.tipSettings.tipLocation]; 293 | 294 | if(settings.modal && settings.expose){ 295 | methods.expose(); 296 | } 297 | 298 | // scroll if not modal 299 | if (!/body/i.test(settings.$target.selector) && settings.scroll) { 300 | methods.scroll_to(); 301 | } 302 | 303 | if (methods.is_phone()) { 304 | methods.pos_phone(true); 305 | } else { 306 | methods.pos_default(true); 307 | } 308 | 309 | $timer = $('.joyride-timer-indicator', settings.$next_tip); 310 | 311 | if (/pop/i.test(settings.tipAnimation)) { 312 | 313 | $timer.outerWidth(0); 314 | 315 | if (settings.timer > 0) { 316 | 317 | settings.$next_tip.show(); 318 | $timer.animate({ 319 | width: $('.joyride-timer-indicator-wrap', settings.$next_tip).outerWidth() 320 | }, settings.timer); 321 | 322 | } else { 323 | 324 | settings.$next_tip.show(); 325 | 326 | } 327 | 328 | 329 | } else if (/fade/i.test(settings.tipAnimation)) { 330 | 331 | $timer.outerWidth(0); 332 | 333 | if (settings.timer > 0) { 334 | 335 | settings.$next_tip.fadeIn(settings.tipAnimationFadeSpeed); 336 | 337 | settings.$next_tip.show(); 338 | $timer.animate({ 339 | width: $('.joyride-timer-indicator-wrap', settings.$next_tip).outerWidth() 340 | }, settings.timer); 341 | 342 | } else { 343 | 344 | settings.$next_tip.fadeIn(settings.tipAnimationFadeSpeed); 345 | 346 | } 347 | } 348 | 349 | settings.$current_tip = settings.$next_tip; 350 | // Focus next button for keyboard users. 351 | $('.joyride-next-tip', settings.$current_tip).focus(); 352 | methods.tabbable(settings.$current_tip); 353 | // skip non-existent targets 354 | } else if (settings.$li && settings.$target.length < 1) { 355 | 356 | methods.show(); 357 | 358 | } else { 359 | 360 | methods.end(); 361 | 362 | } 363 | } else { 364 | 365 | settings.paused = true; 366 | 367 | } 368 | 369 | }, 370 | 371 | // detect phones with media queries if supported. 372 | is_phone : function () { 373 | if (Modernizr) { 374 | return Modernizr.mq('only screen and (max-width: 767px)'); 375 | } 376 | 377 | return (settings.$window.width() < 767) ? true : false; 378 | }, 379 | 380 | support_localstorage : function () { 381 | if (Modernizr) { 382 | return Modernizr.localstorage; 383 | } else { 384 | return !!window.localStorage; 385 | } 386 | }, 387 | 388 | hide : function () { 389 | if(settings.modal && settings.expose){ 390 | methods.un_expose(); 391 | } 392 | if(!settings.modal){ 393 | $('.joyride-modal-bg').hide(); 394 | } 395 | settings.$current_tip.hide(); 396 | settings.postStepCallback(settings.$li.index(), settings.$current_tip); 397 | }, 398 | 399 | set_li : function (init) { 400 | if (init) { 401 | settings.$li = settings.$tip_content.eq(settings.startOffset); 402 | methods.set_next_tip(); 403 | settings.$current_tip = settings.$next_tip; 404 | } else { 405 | settings.$li = settings.$li.next(); 406 | methods.set_next_tip(); 407 | } 408 | 409 | methods.set_target(); 410 | }, 411 | 412 | set_next_tip : function () { 413 | settings.$next_tip = $('.joyride-tip-guide[data-index=' + settings.$li.index() + ']'); 414 | }, 415 | 416 | set_target : function () { 417 | var cl = settings.$li.attr('data-class'), 418 | id = settings.$li.attr('data-id'), 419 | $sel = function () { 420 | if (id) { 421 | return $(settings.document.getElementById(id)); 422 | } else if (cl) { 423 | return $('.' + cl).filter(":visible").first(); 424 | } else { 425 | return $('body'); 426 | } 427 | }; 428 | 429 | settings.$target = $sel(); 430 | }, 431 | 432 | scroll_to : function () { 433 | var window_half, tipOffset; 434 | 435 | window_half = settings.$window.height() / 2; 436 | tipOffset = Math.ceil(settings.$target.offset().top - window_half + settings.$next_tip.outerHeight()); 437 | 438 | $("html, body").stop().animate({ 439 | scrollTop: tipOffset 440 | }, settings.scrollSpeed); 441 | }, 442 | 443 | paused : function () { 444 | if (($.inArray((settings.$li.index() + 1), settings.pauseAfter) === -1)) { 445 | return true; 446 | } 447 | 448 | return false; 449 | }, 450 | 451 | destroy : function () { 452 | if(!$.isEmptyObject(settings)){ 453 | settings.$document.off('.joyride'); 454 | } 455 | 456 | $(window).off('.joyride'); 457 | $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride'); 458 | $('.joyride-tip-guide, .joyride-modal-bg').remove(); 459 | clearTimeout(settings.automate); 460 | settings = {}; 461 | }, 462 | 463 | restart : function () { 464 | if(!settings.autoStart) 465 | { 466 | if (!settings.startTimerOnClick && settings.timer > 0) { 467 | methods.show('init'); 468 | methods.startTimer(); 469 | } else { 470 | methods.show('init'); 471 | } 472 | settings.autoStart = true; 473 | } 474 | else 475 | { 476 | methods.hide(); 477 | settings.$li = undefined; 478 | methods.show('init'); 479 | } 480 | }, 481 | 482 | pos_default : function (init) { 483 | var half_fold = Math.ceil(settings.$window.height() / 2), 484 | tip_position = settings.$next_tip.offset(), 485 | $nub = $('.joyride-nub', settings.$next_tip), 486 | nub_width = Math.ceil($nub.outerWidth() / 2), 487 | nub_height = Math.ceil($nub.outerHeight() / 2), 488 | toggle = init || false; 489 | 490 | // tip must not be "display: none" to calculate position 491 | if (toggle) { 492 | settings.$next_tip.css('visibility', 'hidden'); 493 | settings.$next_tip.show(); 494 | } 495 | 496 | if (!/body/i.test(settings.$target.selector)) { 497 | var 498 | topAdjustment = settings.tipSettings.tipAdjustmentY ? parseInt(settings.tipSettings.tipAdjustmentY) : 0, 499 | leftAdjustment = settings.tipSettings.tipAdjustmentX ? parseInt(settings.tipSettings.tipAdjustmentX) : 0; 500 | 501 | if (methods.bottom()) { 502 | settings.$next_tip.css({ 503 | top: (settings.$target.offset().top + nub_height + settings.$target.outerHeight() + topAdjustment), 504 | left: settings.$target.offset().left + leftAdjustment}); 505 | 506 | if (/right/i.test(settings.tipSettings.nubPosition)) { 507 | settings.$next_tip.css('left', settings.$target.offset().left - settings.$next_tip.outerWidth() + settings.$target.outerWidth()); 508 | } 509 | 510 | methods.nub_position($nub, settings.tipSettings.nubPosition, 'top'); 511 | 512 | } else if (methods.top()) { 513 | 514 | settings.$next_tip.css({ 515 | top: (settings.$target.offset().top - settings.$next_tip.outerHeight() - nub_height + topAdjustment), 516 | left: settings.$target.offset().left + leftAdjustment}); 517 | 518 | methods.nub_position($nub, settings.tipSettings.nubPosition, 'bottom'); 519 | 520 | } else if (methods.right()) { 521 | 522 | settings.$next_tip.css({ 523 | top: settings.$target.offset().top + topAdjustment, 524 | left: (settings.$target.outerWidth() + settings.$target.offset().left + nub_width) + leftAdjustment}); 525 | 526 | methods.nub_position($nub, settings.tipSettings.nubPosition, 'left'); 527 | 528 | } else if (methods.left()) { 529 | 530 | settings.$next_tip.css({ 531 | top: settings.$target.offset().top + topAdjustment, 532 | left: (settings.$target.offset().left - settings.$next_tip.outerWidth() - nub_width) + leftAdjustment}); 533 | 534 | methods.nub_position($nub, settings.tipSettings.nubPosition, 'right'); 535 | 536 | } 537 | 538 | if (!methods.visible(methods.corners(settings.$next_tip)) && settings.attempts < settings.tipSettings.tipLocationPattern.length) { 539 | 540 | $nub.removeClass('bottom') 541 | .removeClass('top') 542 | .removeClass('right') 543 | .removeClass('left'); 544 | 545 | settings.tipSettings.tipLocation = settings.tipSettings.tipLocationPattern[settings.attempts]; 546 | 547 | settings.attempts++; 548 | 549 | methods.pos_default(true); 550 | 551 | } 552 | 553 | } else if (settings.$li.length) { 554 | 555 | methods.pos_modal($nub); 556 | 557 | } 558 | 559 | if (toggle) { 560 | settings.$next_tip.hide(); 561 | settings.$next_tip.css('visibility', 'visible'); 562 | } 563 | 564 | }, 565 | 566 | pos_phone : function (init) { 567 | var tip_height = settings.$next_tip.outerHeight(), 568 | tip_offset = settings.$next_tip.offset(), 569 | target_height = settings.$target.outerHeight(), 570 | $nub = $('.joyride-nub', settings.$next_tip), 571 | nub_height = Math.ceil($nub.outerHeight() / 2), 572 | toggle = init || false; 573 | 574 | $nub.removeClass('bottom') 575 | .removeClass('top') 576 | .removeClass('right') 577 | .removeClass('left'); 578 | 579 | if (toggle) { 580 | settings.$next_tip.css('visibility', 'hidden'); 581 | settings.$next_tip.show(); 582 | } 583 | 584 | if (!/body/i.test(settings.$target.selector)) { 585 | 586 | if (methods.top()) { 587 | 588 | settings.$next_tip.offset({top: settings.$target.offset().top - tip_height - nub_height}); 589 | $nub.addClass('bottom'); 590 | 591 | } else { 592 | 593 | settings.$next_tip.offset({top: settings.$target.offset().top + target_height + nub_height}); 594 | $nub.addClass('top'); 595 | 596 | } 597 | 598 | } else if (settings.$li.length) { 599 | 600 | methods.pos_modal($nub); 601 | 602 | } 603 | 604 | if (toggle) { 605 | settings.$next_tip.hide(); 606 | settings.$next_tip.css('visibility', 'visible'); 607 | } 608 | }, 609 | 610 | pos_modal : function ($nub) { 611 | methods.center(); 612 | $nub.hide(); 613 | 614 | methods.show_modal(); 615 | 616 | }, 617 | 618 | show_modal : function() { 619 | if ($('.joyride-modal-bg').length < 1) { 620 | $('body').append(settings.template.modal).show(); 621 | } 622 | 623 | if (/pop/i.test(settings.tipAnimation)) { 624 | $('.joyride-modal-bg').show(); 625 | } else { 626 | $('.joyride-modal-bg').fadeIn(settings.tipAnimationFadeSpeed); 627 | } 628 | }, 629 | 630 | expose: function(){ 631 | var expose, 632 | exposeCover, 633 | el, 634 | origCSS, 635 | randId = 'expose-'+Math.floor(Math.random()*10000); 636 | if (arguments.length>0 && arguments[0] instanceof $){ 637 | el = arguments[0]; 638 | } else if(settings.$target && !/body/i.test(settings.$target.selector)){ 639 | el = settings.$target; 640 | } else { 641 | return false; 642 | } 643 | if(el.length < 1){ 644 | if(window.console){ 645 | console.error('element not valid', el); 646 | } 647 | return false; 648 | } 649 | expose = $(settings.template.expose); 650 | settings.$body.append(expose); 651 | expose.css({ 652 | top: el.offset().top, 653 | left: el.offset().left, 654 | width: el.outerWidth(true), 655 | height: el.outerHeight(true) 656 | }); 657 | exposeCover = $(settings.template.exposeCover); 658 | origCSS = { 659 | zIndex: el.css('z-index'), 660 | position: el.css('position') 661 | }; 662 | el.css('z-index',expose.css('z-index')*1+1); 663 | if(origCSS.position == 'static'){ 664 | el.css('position','relative'); 665 | } 666 | el.data('expose-css',origCSS); 667 | exposeCover.css({ 668 | top: el.offset().top, 669 | left: el.offset().left, 670 | width: el.outerWidth(true), 671 | height: el.outerHeight(true) 672 | }); 673 | settings.$body.append(exposeCover); 674 | expose.addClass(randId); 675 | exposeCover.addClass(randId); 676 | if(settings.tipSettings['exposeClass']){ 677 | expose.addClass(settings.tipSettings['exposeClass']); 678 | exposeCover.addClass(settings.tipSettings['exposeClass']); 679 | } 680 | el.data('expose', randId); 681 | settings.postExposeCallback(settings.$li.index(), settings.$next_tip, el); 682 | methods.add_exposed(el); 683 | }, 684 | 685 | un_expose: function(){ 686 | var exposeId, 687 | el, 688 | expose , 689 | origCSS, 690 | clearAll = false; 691 | if (arguments.length>0 && arguments[0] instanceof $){ 692 | el = arguments[0]; 693 | } else if(settings.$target && !/body/i.test(settings.$target.selector)){ 694 | el = settings.$target; 695 | } else { 696 | return false; 697 | } 698 | if(el.length < 1){ 699 | if(window.console){ 700 | console.error('element not valid', el); 701 | } 702 | return false; 703 | } 704 | exposeId = el.data('expose'); 705 | expose = $('.'+exposeId); 706 | if(arguments.length>1){ 707 | clearAll = arguments[1]; 708 | } 709 | if(clearAll === true){ 710 | $('.joyride-expose-wrapper,.joyride-expose-cover').remove(); 711 | } else { 712 | expose.remove(); 713 | } 714 | origCSS = el.data('expose-css'); 715 | if(origCSS.zIndex == 'auto'){ 716 | el.css('z-index', ''); 717 | } else { 718 | el.css('z-index',origCSS.zIndex); 719 | } 720 | if(origCSS.position != el.css('position')){ 721 | if(origCSS.position == 'static'){// this is default, no need to set it. 722 | el.css('position', ''); 723 | } else { 724 | el.css('position',origCSS.position); 725 | } 726 | } 727 | el.removeData('expose'); 728 | el.removeData('expose-z-index'); 729 | methods.remove_exposed(el); 730 | }, 731 | 732 | add_exposed: function(el){ 733 | settings.exposed = settings.exposed || []; 734 | if(el instanceof $){ 735 | settings.exposed.push(el[0]); 736 | } else if(typeof el == 'string'){ 737 | settings.exposed.push(el); 738 | } 739 | }, 740 | 741 | remove_exposed: function(el){ 742 | var search; 743 | if(el instanceof $){ 744 | search = el[0] 745 | } else if (typeof el == 'string'){ 746 | search = el; 747 | } 748 | settings.exposed = settings.exposed || []; 749 | for(var i=0; i bottom){ 802 | bottom = offsetBottom; 803 | } 804 | 805 | return [ 806 | el.offset().top < top, 807 | right < el.offset().left + el.outerWidth(), 808 | bottom < el.offset().top + el.outerHeight(), 809 | w.scrollLeft() > el.offset().left 810 | ]; 811 | }, 812 | 813 | visible : function (hidden_corners) { 814 | var i = hidden_corners.length; 815 | 816 | while (i--) { 817 | if (hidden_corners[i]) return false; 818 | } 819 | 820 | return true; 821 | }, 822 | 823 | nub_position : function (nub, pos, def) { 824 | if (pos === 'auto') { 825 | nub.addClass(def); 826 | } else { 827 | nub.addClass(pos); 828 | } 829 | }, 830 | 831 | startTimer : function () { 832 | if (settings.$li.length) { 833 | settings.automate = setTimeout(function () { 834 | methods.hide(); 835 | methods.show(); 836 | methods.startTimer(); 837 | }, settings.timer); 838 | } else { 839 | clearTimeout(settings.automate); 840 | } 841 | }, 842 | 843 | end : function () { 844 | if (settings.cookieMonster) { 845 | $.cookie(settings.cookieName, 'ridden', { expires: 365, domain: settings.cookieDomain, path: settings.cookiePath }); 846 | } 847 | 848 | if (settings.localStorage) { 849 | localStorage.setItem(settings.localStorageKey, true); 850 | } 851 | 852 | if (settings.timer > 0) { 853 | clearTimeout(settings.automate); 854 | } 855 | if(settings.modal && settings.expose){ 856 | methods.un_expose(); 857 | } 858 | if (settings.$current_tip) { 859 | settings.$current_tip.hide(); 860 | } 861 | if (settings.$li) { 862 | settings.postStepCallback(settings.$li.index(), settings.$current_tip); 863 | settings.postRideCallback(settings.$li.index(), settings.$current_tip, joyride_parent_id); 864 | } 865 | $('.joyride-modal-bg').hide(); 866 | }, 867 | 868 | jquery_check : function () { 869 | // define on() and off() for older jQuery 870 | if (!$.isFunction($.fn.on)) { 871 | 872 | $.fn.on = function (types, sel, fn) { 873 | 874 | return this.delegate(sel, types, fn); 875 | 876 | }; 877 | 878 | $.fn.off = function (types, sel, fn) { 879 | 880 | return this.undelegate(sel, types, fn); 881 | 882 | }; 883 | 884 | return false; 885 | } 886 | 887 | return true; 888 | }, 889 | 890 | outerHTML : function (el) { 891 | // support FireFox < 11 892 | return el.outerHTML || new XMLSerializer().serializeToString(el); 893 | }, 894 | 895 | version : function () { 896 | return settings.version; 897 | }, 898 | 899 | tabbable : function (el) { 900 | $(el).on('keydown', function( event ) { 901 | if (!event.isDefaultPrevented() && event.keyCode && 902 | // Escape key. 903 | event.keyCode === 27 ) { 904 | event.preventDefault(); 905 | methods.end(); 906 | return; 907 | } 908 | 909 | // Prevent tabbing out of tour items. 910 | if ( event.keyCode !== 9 ) { 911 | return; 912 | } 913 | var tabbables = $(el).find(":tabbable"), 914 | first = tabbables.filter(":first"), 915 | last = tabbables.filter(":last"); 916 | if ( event.target === last[0] && !event.shiftKey ) { 917 | first.focus( 1 ); 918 | event.preventDefault(); 919 | } else if ( event.target === first[0] && event.shiftKey ) { 920 | last.focus( 1 ); 921 | event.preventDefault(); 922 | } 923 | }); 924 | } 925 | 926 | }; 927 | 928 | $.fn.joyride = function (method) { 929 | if (methods[method]) { 930 | return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 931 | } else if (typeof method === 'object' || !method) { 932 | return methods.init.apply(this, arguments); 933 | } else { 934 | $.error('Method ' + method + ' does not exist on jQuery.joyride'); 935 | } 936 | }; 937 | 938 | }(jQuery, this)); 939 | -------------------------------------------------------------------------------- /joyride/static/joyride/js/jquery-1.10.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license 2 | //@ sourceMappingURL=jquery-1.10.1.min.map 3 | */ 4 | (function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}: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},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?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},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.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+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,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(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===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]||at.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]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!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,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.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"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null) 5 | }),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); 6 | u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("