django项目CRM+stark组件+rbac权限管理(终极版)

 

因为这个项目牵扯到的组件有我们之前写好的stark,还有我们再之前写好的rbac权限组件,以及自己的App里面的逻辑,所以还是挺多的,一点点来梳理清楚

 

我们的HTML模板里面,在stark组件里面的base.html它是专为给我们的add.html以及edit.html用的,他们的页面重复度较高,所以我们就使用模板继承来解决代码复用性的问题,

还有我们的rbac组件里面有自己的自定义标签是用来显示我们的前端左侧菜单用的,它应该是要嵌入到我们的项目App下面的,我们的组件要有自己的一套完整的逻辑处理,从前端到后端都需要严谨,独立,不能够跟项目里面的逻辑胶合到一起,这样组件要用起来才能达到它应该有的效果.

 

所以我们下面要使用到两个组件的时候就会发现有两个base母板,而且他们几乎是同样的布局,这是为了备用,我们的这个项目需要的是rbac里面带有左侧菜单的base母板,但是换做别的项目的话,就可能需要使用stark组件里面的母板,所以尽管我们目前用不到stark组件里面的母板,但是它是有必要存在的,这一点需要澄清.还有一点是我们的add.HTML和edit.HTML以及dele.HTML在继承的时候都是默认继承它们自己stark组件里面的base.HTML所以我们为了不做过多的更改就把我们的根项目下面的base路径改成了跟我们的stark组件里面的base路径一致了.

 

所以我们的页面在展示的时候,一方面要把stark里面的modelForm表单校验自定义标签给整合到页面上,同时还需要把rbac里面的左侧菜单权限给显示到同一个页面上,这里的逻辑就需要我们的rbac和stark两个组件联合使用,要彼此配合好,然后才能顺利加载上,把我们想要的效果给渲染出来,

所以这里就需要一个知识点,那就是我们的项目在加载的时候会先从根项目里面找到templates文件夹里面开始找,然后再去到子项目里面找,这是它程序的正确查找顺序

 

代码如下

 

setting配置文件:

  1 """
  2 Django settings for crm_stark project.
  3 
  4 Generated by 'django-admin startproject' using Django 1.11.9.
  5 
  6 For more information on this file, see
  7 https://docs.djangoproject.com/en/1.11/topics/settings/
  8 
  9 For the full list of settings and their values, see
 10 https://docs.djangoproject.com/en/1.11/ref/settings/
 11 """
 12 
 13 import os
 14 
 15 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 17 
 18 
 19 # Quick-start development settings - unsuitable for production
 20 # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
 21 
 22 # SECURITY WARNING: keep the secret key used in production secret!
 23 SECRET_KEY = 'bnfm8vt86_^#snkwwo4770vnm54%04b7bu@jg_!x)!ixynv!5i'
 24 
 25 # SECURITY WARNING: don't run with debug turned on in production!
 26 DEBUG = True
 27 
 28 ALLOWED_HOSTS = []
 29 
 30 
 31 # Application definition
 32 
 33 INSTALLED_APPS = [
 34     'django.contrib.admin',
 35     'django.contrib.auth',
 36     'django.contrib.contenttypes',
 37     'django.contrib.sessions',
 38     'django.contrib.messages',
 39     'django.contrib.staticfiles',
 40     'stark.apps.StarkConfig',
 41     'permission.apps.PermissionConfig',
 42     'rbac.apps.RbacConfig',
 43 ]
 44 
 45 MIDDLEWARE = [
 46     'django.middleware.security.SecurityMiddleware',
 47     'django.contrib.sessions.middleware.SessionMiddleware',
 48     'django.middleware.common.CommonMiddleware',
 49     'django.middleware.csrf.CsrfViewMiddleware',
 50     'django.contrib.auth.middleware.AuthenticationMiddleware',
 51     'django.contrib.messages.middleware.MessageMiddleware',
 52     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 53     'rbac.support.tool.M1',
 54 ]
 55 
 56 ROOT_URLCONF = 'crm_stark.urls'
 57 
 58 TEMPLATES = [
 59     {
 60         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 61         'DIRS': [os.path.join(BASE_DIR, 'templates')]
 62         ,
 63         'APP_DIRS': True,
 64         'OPTIONS': {
 65             'context_processors': [
 66                 'django.template.context_processors.debug',
 67                 'django.template.context_processors.request',
 68                 'django.contrib.auth.context_processors.auth',
 69                 'django.contrib.messages.context_processors.messages',
 70             ],
 71         },
 72     },
 73 ]
 74 
 75 WSGI_APPLICATION = 'crm_stark.wsgi.application'
 76 
 77 
 78 # Database
 79 # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 80 
 81 DATABASES = {
 82     'default': {
 83         'ENGINE': 'django.db.backends.sqlite3',
 84         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 85     }
 86 }
 87 
 88 
 89 # Password validation
 90 # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
 91 
 92 AUTH_PASSWORD_VALIDATORS = [
 93     {
 94         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
 95     },
 96     {
 97         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
 98     },
 99     {
100         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
101     },
102     {
103         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
104     },
105 ]
106 
107 
108 # Internationalization
109 # https://docs.djangoproject.com/en/1.11/topics/i18n/
110 
111 LANGUAGE_CODE = 'en-us'
112 
113 TIME_ZONE = 'UTC'
114 
115 USE_I18N = True
116 
117 USE_L10N = True
118 
119 USE_TZ = True
120 
121 
122 # Static files (CSS, JavaScript, Images)
123 # https://docs.djangoproject.com/en/1.11/howto/static-files/
124 
125 STATIC_URL = '/static/'
setting

url配置文件:

 1 """crm_stark URL Configuration
 2 
 3 The `urlpatterns` list routes URLs to views. For more information please see:
 4     https://docs.djangoproject.com/en/1.11/topics/http/urls/
 5 Examples:
 6 Function views
 7     1. Add an import:  from my_app import views
 8     2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
 9 Class-based views
10     1. Add an import:  from other_app.views import Home
11     2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
12 Including another URLconf
13     1. Import the include() function: from django.conf.urls import url, include
14     2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
15 """
16 from django.conf.urls import url
17 from django.contrib import admin
18 from stark.tools.service import site
19 from permission import views
20 
21 urlpatterns = [
22     url(r'^admin/', admin.site.urls),
23     url(r'^stark/', site.urls),
24     url(r'^login/$', views.login),
25     url(r'^index/$', views.index),
26 ]
url配置

 

permission

项目表:

  1 # Create your models here.
  2 from django.db import models
  3 
  4 
  5 class Department(models.Model):
  6     """
  7     部门表
  8     市场部     1000
  9     销售       1001
 10 
 11     """
 12     title = models.CharField(verbose_name='部门名称', max_length=16)
 13     code = models.IntegerField(verbose_name='部门编号', unique=True, null=False)
 14 
 15     def __str__(self):
 16         return self.title
 17 
 18 
 19 class UserInfo(models.Model):
 20     """
 21     员工表
 22     """
 23 
 24     name = models.CharField(verbose_name='员工姓名', max_length=16)
 25     username = models.CharField(verbose_name='用户名', max_length=32)
 26     password = models.CharField(verbose_name='密码', max_length=64)
 27     email = models.EmailField(verbose_name='邮箱', max_length=64)
 28     rbac_user = models.OneToOneField(to="rbac.User", null=True)
 29     depart = models.ForeignKey(verbose_name='部门', to="Department", to_field="code")
 30 
 31     def __str__(self):
 32         return self.name
 33 
 34 
 35 class Course(models.Model):
 36     """
 37     课程表
 38     如:
 39         Linux基础
 40         Linux架构师
 41         Python自动化开发精英班
 42         Python自动化开发架构师班
 43         Python基础班
 44         go基础班
 45     """
 46     name = models.CharField(verbose_name='课程名称', max_length=32)
 47 
 48     def __str__(self):
 49         return self.name
 50 
 51 
 52 class School(models.Model):
 53     """
 54     校区表
 55     如:
 56         北京海淀校区
 57         上海校区
 58 
 59     """
 60     title = models.CharField(verbose_name='校区名称', max_length=32)
 61 
 62     def __str__(self):
 63         return self.title
 64 
 65 
 66 class ClassList(models.Model):
 67     """
 68     班级表
 69     如:
 70         Python全栈  面授班  5期  10000  2017-11-11  2018-5-11
 71     """
 72     school = models.ForeignKey(verbose_name='校区', to='School')
 73     course = models.ForeignKey(verbose_name='课程名称', to='Course')
 74 
 75     semester = models.IntegerField(verbose_name="班级(期)")
 76     price = models.IntegerField(verbose_name="学费")
 77     start_date = models.DateField(verbose_name="开班日期")
 78     graduate_date = models.DateField(verbose_name="结业日期", null=True, blank=True)
 79     memo = models.CharField(verbose_name='说明', max_length=256, blank=True, null=True, )
 80     teachers = models.ManyToManyField(verbose_name='任课老师', to='UserInfo',
 81                                       limit_choices_to={'depart_id__in': [1001, 1005]}, related_name="abc")
 82     tutor = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',
 83                               limit_choices_to={'depart_id': 1002, })
 84 
 85     def __str__(self):
 86         return "{0}({1}期)".format(self.course.name, self.semester)
 87 
 88 
 89 class Customer(models.Model):
 90     """
 91     客户表
 92     """
 93     qq = models.CharField(verbose_name='qq', max_length=64, unique=True, help_text='QQ号必须唯一')
 94 
 95     name = models.CharField(verbose_name='学生姓名', max_length=16)
 96     gender_choices = ((1, ''), (2, ''))
 97     gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
 98 
 99     education_choices = (
100         (1, '重点大学'),
101         (2, '普通本科'),
102         (3, '独立院校'),
103         (4, '民办本科'),
104         (5, '大专'),
105         (6, '民办专科'),
106         (7, '高中'),
107         (8, '其他')
108     )
109     education = models.IntegerField(verbose_name='学历', choices=education_choices, blank=True, null=True, )
110     graduation_school = models.CharField(verbose_name='毕业学校', max_length=64, blank=True, null=True)
111     major = models.CharField(verbose_name='所学专业', max_length=64, blank=True, null=True)
112 
113     experience_choices = [
114         (1, '在校生'),
115         (2, '应届毕业'),
116         (3, '半年以内'),
117         (4, '半年至一年'),
118         (5, '一年至三年'),
119         (6, '三年至五年'),
120         (7, '五年以上'),
121     ]
122     experience = models.IntegerField(verbose_name='工作经验', blank=True, null=True, choices=experience_choices)
123     work_status_choices = [
124         (1, '在职'),
125         (2, '无业')
126     ]
127     work_status = models.IntegerField(verbose_name="职业状态", choices=work_status_choices, default=1, blank=True,
128                                       null=True)
129     company = models.CharField(verbose_name="目前就职公司", max_length=64, blank=True, null=True)
130     salary = models.CharField(verbose_name="当前薪资", max_length=64, blank=True, null=True)
131 
132     source_choices = [
133         (1, "qq群"),
134         (2, "内部转介绍"),
135         (3, "官方网站"),
136         (4, "百度推广"),
137         (5, "360推广"),
138         (6, "搜狗推广"),
139         (7, "腾讯课堂"),
140         (8, "广点通"),
141         (9, "高校宣讲"),
142         (10, "渠道代理"),
143         (11, "51cto"),
144         (12, "智汇推"),
145         (13, "网盟"),
146         (14, "DSP"),
147         (15, "SEO"),
148         (16, "其它"),
149     ]
150     source = models.SmallIntegerField('客户来源', choices=source_choices, default=1)
151     referral_from = models.ForeignKey(
152         'self',
153         blank=True,
154         null=True,
155         verbose_name="转介绍自学员",
156         help_text="若此客户是转介绍自内部学员,请在此处选择内部学员姓名",
157         related_name="internal_referral"
158     )
159     course = models.ManyToManyField(verbose_name="咨询课程", to="Course")
160 
161     status_choices = [
162         (1, "已报名"),
163         (2, "未报名")
164     ]
165     status = models.IntegerField(
166         verbose_name="状态",
167         choices=status_choices,
168         default=2,
169         help_text=u"选择客户此时的状态"
170     )
171 
172     consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', related_name='consultanter',
173                                    limit_choices_to={'depart_id': 1002})
174 
175     date = models.DateField(verbose_name="咨询日期", auto_now_add=True)
176     recv_date = models.DateField(verbose_name="当前课程顾问的接单日期", null=True)
177     last_consult_date = models.DateField(verbose_name="最后跟进日期", )
178 
179     def __str__(self):
180         return "姓名:{0},QQ:{1}".format(self.name, self.qq, )
181 
182 
183 class ConsultRecord(models.Model):
184     """
185     客户跟进记录
186     """
187     customer = models.ForeignKey(verbose_name="所咨询客户", to='Customer')
188     consultant = models.ForeignKey(verbose_name="跟踪人", to='UserInfo')
189     date = models.DateField(verbose_name="跟进日期", auto_now_add=True)
190     note = models.TextField(verbose_name="跟进内容...")
191 
192     def __str__(self):
193         return self.customer.name + ":" + self.consultant.name
194 
195 
196 class PaymentRecord(models.Model):
197     """
198     缴费记录
199     """
200     customer = models.ForeignKey(Customer, verbose_name="客户")
201 
202     class_list = models.ForeignKey(verbose_name="班级", to="ClassList", blank=True, null=True)
203 
204     pay_type_choices = [
205         (1, "订金/报名费"),
206         (2, "学费"),
207         (3, "转班"),
208         (4, "退学"),
209         (5, "退款"),
210     ]
211     pay_type = models.IntegerField(verbose_name="费用类型", choices=pay_type_choices, default=1)
212     paid_fee = models.IntegerField(verbose_name="费用数额", default=0)
213     turnover = models.IntegerField(verbose_name="成交金额", blank=True, null=True)
214     quote = models.IntegerField(verbose_name="报价金额", blank=True, null=True)
215     note = models.TextField(verbose_name="备注", blank=True, null=True)
216     date = models.DateTimeField(verbose_name="交款日期", auto_now_add=True)
217     consultant = models.ForeignKey(verbose_name="负责老师", to='UserInfo', help_text="谁签的单就选谁")
218 
219 
220 class Student(models.Model):
221     """
222     学生表(已报名)
223     """
224     customer = models.OneToOneField(verbose_name='客户信息', to='Customer')
225 
226     username = models.CharField(verbose_name='用户名', max_length=32)
227     password = models.CharField(verbose_name='密码', max_length=64)
228     emergency_contract = models.CharField(max_length=32, blank=True, null=True, verbose_name='紧急联系人')
229 
230     class_list = models.ManyToManyField(verbose_name="已报班级", to='ClassList', blank=True)
231     company = models.CharField(verbose_name='公司', max_length=128, blank=True, null=True)
232     location = models.CharField(max_length=64, verbose_name='所在区域', blank=True, null=True)
233     position = models.CharField(verbose_name='岗位', max_length=64, blank=True, null=True)
234     salary = models.IntegerField(verbose_name='薪资', blank=True, null=True)
235     welfare = models.CharField(verbose_name='福利', max_length=256, blank=True, null=True)
236     date = models.DateField(verbose_name='入职时间', help_text='格式yyyy-mm-dd', blank=True, null=True)
237     memo = models.CharField(verbose_name='备注', max_length=256, blank=True, null=True)
238 
239     def __str__(self):
240         return self.username
241 
242 
243 class CourseRecord(models.Model):
244     """
245     上课记录表
246     """
247     class_obj = models.ForeignKey(verbose_name="班级", to="ClassList")
248     day_num = models.IntegerField(verbose_name="节次", help_text=u"此处填写第几节课或第几天课程...,必须为数字")
249     teacher = models.ForeignKey(verbose_name="讲师", to='UserInfo', limit_choices_to={"depart_id__in": [1001, 1005]})
250     date = models.DateField(verbose_name="上课日期", auto_now_add=True)
251 
252     course_title = models.CharField(verbose_name='本节课程标题', max_length=64, blank=True, null=True)
253     course_memo = models.TextField(verbose_name='本节课程内容概要', blank=True, null=True)
254     has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
255     homework_title = models.CharField(verbose_name='本节作业标题', max_length=64, blank=True, null=True)
256     homework_memo = models.TextField(verbose_name='作业描述', max_length=500, blank=True, null=True)
257     exam = models.TextField(verbose_name='踩分点', max_length=300, blank=True, null=True)
258 
259     def __str__(self):
260         return "{0} day{1}".format(self.class_obj, self.day_num)
261 
262 
263 class StudyRecord(models.Model):
264     course_record = models.ForeignKey(verbose_name="第几天课程", to="CourseRecord")
265     student = models.ForeignKey(verbose_name="学员", to='Student')
266     record_choices = (('checked', "已签到"),
267                       ('vacate', "请假"),
268                       ('late', "迟到"),
269                       ('noshow', "缺勤"),
270                       ('leave_early', "早退"),
271                       )
272     record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
273     score_choices = ((100, 'A+'),
274                      (90, 'A'),
275                      (85, 'B+'),
276                      (80, 'B'),
277                      (70, 'B-'),
278                      (60, 'C+'),
279                      (50, 'C'),
280                      (40, 'C-'),
281                      (0, ' D'),
282                      (-1, 'N/A'),
283                      (-100, 'COPY'),
284                      (-1000, 'FAIL'),
285                      )
286     score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
287     homework_note = models.CharField(verbose_name='作业评语', max_length=255, blank=True, null=True)
288     note = models.CharField(verbose_name="备注", max_length=255, blank=True, null=True)
289 
290     homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
291     stu_memo = models.TextField(verbose_name='学员备注', blank=True, null=True)
292     date = models.DateTimeField(verbose_name='提交作业日期', auto_now_add=True)
293 
294     def __str__(self):
295         return "{0}-{1}".format(self.course_record, self.student)
296 
297 
298 class CustomerDistrbute(models.Model):
299     customer = models.ForeignKey("Customer", related_name="customers")
300     consultant = models.ForeignKey(verbose_name="课程顾问", to="UserInfo", limit_choices_to={"depart_id": 1001})
301     date = models.DateField()
302     status = (
303         (1, "跟进状态"),
304         (2, "已报名"),
305         (3, "三天未跟进"),
306         (4, "15天未成单"),
307     )
308     status = models.IntegerField(choices=status, default=1)
309 
310     memo = models.CharField(max_length=255)
model

项目表注册:

  1 from .models import *
  2 from django.shortcuts import redirect, HttpResponse, render
  3 from stark.tools.service import site, ModelSubject
  4 from django.utils.safestring import mark_safe
  5 from django.forms import ModelForm
  6 from django.conf.urls import url
  7 from django.db.models import Q
  8 import datetime
  9 
 10 site.register(Department)
 11 site.register(Course)
 12 
 13 
 14 class UserInfoConfig(ModelSubject):
 15     list_display = ['depart', 'email', 'name']
 16     list_display_links = ['name']
 17 
 18 
 19 site.register(UserInfo, UserInfoConfig)
 20 site.register(School)
 21 
 22 
 23 class ClassListConfig(ModelSubject):
 24     def display_class(self, obj=None, is_header=None):
 25         if is_header:
 26             return '班级'
 27         return "%s(%s)" % (obj.course, obj.semester)
 28 
 29     list_display = [display_class, 'teachers', 'tutor', 'memo']
 30 
 31 
 32 site.register(ClassList, ClassListConfig)
 33 
 34 
 35 class CustomerConfig(ModelSubject):
 36     # 获取性别
 37     def display_gender(self, obj=None, is_header=False):
 38         if is_header:
 39             return '性别'
 40         return obj.get_gender_display()
 41 
 42     # 获取状态
 43     def display_status(self, obj=None, is_header=False):
 44         if is_header:
 45             return '状态'
 46         return obj.get_status_display()
 47 
 48     # 获取课程
 49     def display_courses(self, obj=None, is_header=False):
 50         if is_header:
 51             return '咨询课程'
 52         temp = []
 53         for course in obj.course.all():
 54             tag = "<a href='/stark/permissioncustomer/cancel/%s/%s' style='padding:5px 2px;border:1px solid #336699'>%s</a>" % \
 55                   (obj.pk, course.pk, course.name)
 56             temp.append(tag)
 57         a = "".join(temp)
 58         return mark_safe(a)
 59 
 60     # 取消课程
 61     def cancel_course(self, request, customer_id, course_id):
 62         customer = Customer.objects.get(pk=customer_id)
 63         customer.course.remove(course_id)
 64         # print("====>>", self.request.GET)  # <QueryDict: {'page': ['2']}>
 65         for i in self.request.GET:
 66             # print(i, self.request.GET[i], type(i), type(self.request.GET[i]))  # page 2 这一组数据都是str类型,
 67             b = i + "=" + self.request.GET[i]
 68             a = "%s?%s" % (self.get_stand_url(), b)
 69         return redirect(a)
 70 
 71     # 公共客户页面展示
 72     def public_customers(self, request):
 73         current_date = datetime.datetime.now()
 74         delta_15d = datetime.timedelta(days=15)
 75         delta_3d = datetime.timedelta(days=3)
 76         # 15天未成单,或者三天未跟进的客户属于公共客户
 77         user_id = 2
 78         customer_list = Customer.objects.filter(Q(recv_date__lt=current_date - delta_15d) |
 79                                                 Q(last_consult_date__lt=current_date - delta_3d), status=2). \
 80             exclude(consultant_id=user_id)
 81         return render(request, "public_customers.html", locals())
 82 
 83     # 个人客户页面展示
 84     def mine(self, request):
 85         user_id = 2
 86         customer_distrbute_list = CustomerDistrbute.objects.filter(consultant_id=user_id)
 87         return render(request, 'mine.html', locals())
 88 
 89     # 抢单操作
 90     def further_follow(self, request, customer_id):
 91         user_id = 3
 92         cdate = datetime.datetime.now()
 93         current_date = datetime.datetime.now()
 94         delta_15d = datetime.timedelta(days=15)
 95         delta_3d = datetime.timedelta(days=3)
 96         ret = Customer.objects.filter(pk=customer_id).filter(
 97             Q(recv_date__lt=current_date - delta_15d) | Q(last_consult_date__lt=current_date - delta_3d)).update(
 98             consultant_id=2, recv_date=cdate, last_consult_date=cdate)
 99         if not ret:
100             return HttpResponse("too late,shame on you ")
101         CustomerDistrbute.objects.create(customer_id=customer_id, consultant_id=user_id, date=cdate, status=1)
102         return HttpResponse("good job")
103 
104     def extra_url(self):
105         temp = []
106         temp.append(url("cancel/(\d+)/(\d+)/$", self.cancel_course))
107         temp.append(url("public/$", self.public_customers))
108         temp.append(url("mine/$", self.mine))
109         temp.append(url("further_follow/(\d+)$", self.further_follow))
110         return temp
111 
112     def display_consultrecord(self, obj=None, is_header=False):
113         if is_header:
114             return "跟进"
115         return mark_safe("<a href='/stark/permissionconsultrecord/?customer=%s'>跟进记录</a>" % (obj.pk))
116 
117     list_display = [display_gender, display_status, display_courses, 'name', "consultant", display_consultrecord]
118     list_display_links = ['name']
119 
120 
121 # site.register(Customer)
122 
123 
124 site.register(Customer, CustomerConfig)
125 
126 
127 class ConsultRecordConfig(ModelSubject):
128     list_display = ['customer', 'consultant', 'date', 'note']
129 
130 
131 site.register(ConsultRecord, ConsultRecordConfig)
132 
133 
134 class StudentConfig(ModelSubject):
135     def score_show(self, obj=None, is_header=False):
136         if is_header:
137             return "查看成绩"
138         return mark_safe("<a href='/stark/permissionstudent/score_view/%s'>查看成绩</a>" % obj.pk)
139 
140     def score_view(self, request, student_id):
141         if request.is_ajax():
142             cid = request.GET.get("cid")
143             sid = request.GET.get("sid")
144             study_record_list = StudyRecord.objects.filter(student=sid, course_record__class_obj_id=cid)
145             data = []
146             for study_record in study_record_list:
147                 data.append(["day%s" % study_record.course_record.day_num, study_record.score])
148             # print(data)  # [['day3', -1], ['day3', -1]]
149 
150             from django.http import JsonResponse
151             return JsonResponse(data, safe=False)
152         else:
153             obj = Student.objects.filter(pk=student_id).first()
154             class_list = obj.class_list.all()
155             return render(request, "../stark/templates/file/score_view.html", {"class_list": class_list, "obj": obj})
156 
157     def extra_url(self):
158         temp = []
159         temp.append(url("score_view/(\d+)/$", self.score_view))
160         return temp
161 
162     list_display = ['username', 'class_list', score_show]
163 
164 
165 site.register(Student, StudentConfig)
166 
167 
168 # site.register(Student)
169 
170 
171 class CourseRecordConfig(ModelSubject):
172     def check(self, obj=None, is_header=False):
173         if is_header:
174             return "考勤记录"
175         return mark_safe("<a href='/stark/permissionstudyrecord/?course_record=%s'>考勤</a>" % obj.pk)
176 
177     # 录入成绩配合的前端HTML
178     def score_list(self, request, courserecord_id):  # 这里的id值就是下面的recordscore函数里面的obj.pk值,传进来由它接收
179         if request.method == "GET":
180             """
181             方式一,使用简单写法:
182            
183             study_record_list = StudyRecord.objects.filter(course_record_id=courserecord_id)
184             score_choices = StudyRecord.score_choices
185             return render(request, "file/score_list.html",
186                           {"study_record_list": study_record_list, "score_choices": score_choices})
187             """
188             from django import forms
189             from django.forms import widgets
190             study_record_list = StudyRecord.objects.filter(course_record_id=courserecord_id)
191             for study_record in study_record_list:
192                 ScoreForm = type("ScoreForm", (forms.Form,),
193                                  {"score_%s" % study_record.pk: forms.ChoiceField(
194                                      choices=StudyRecord.score_choices,
195                                      widget=widgets.Select(attrs={"class": "form-control"})
196                                  ),
197                                      "homework_note_%s" % study_record.pk: forms.CharField(
198                                          widget=widgets.Textarea(attrs={"class": "form-control", "rows": 3, "cols": 8})
199                                      )
200                                  })
201                 study_record.form = ScoreForm(initial={"score_%s" % study_record.pk: study_record.score,
202                                                        "homework_note_%s" % study_record.pk: study_record.homework_note})
203 
204             return render(request, "../stark/templates/file/score_list.html", {"study_record_list": study_record_list})
205         else:
206             # print(request.POST)
207             # 'score_3': ['100'], 'homework_note_3': ['真棒'] 打印出来就是键值对的方式
208             info = {}
209             for item, val in request.POST.items():
210                 if item == "csrfmiddlewaretoken":
211                     continue
212                 field, pk = item.rsplit("_", 1)
213                 if pk not in info:
214                     info[pk] = {field: val}  # 得到的数据类型就是{1:{"score":90}}字典里面包裹着字典
215                 else:
216                     info[pk][field] = val
217             for pk, update_data in info.items():
218                 StudyRecord.objects.filter(pk=pk).update(**update_data)
219 
220             return redirect(request.path)
221 
222     # 配合录入成绩生成url
223     def extra_url(self):
224         temp = []
225         temp.append(url("score_list/(\d+)", self.score_list))
226         return temp
227 
228     # 录入成绩
229     def recordscore(self, obj=None, is_header=False):
230         if is_header:
231             return "录入成绩"
232         return mark_safe("<a href='/stark/permissioncourserecord/score_list/%s'>录入成绩</a>" % obj.pk)
233 
234     list_display_links = ["class_obj"]
235     list_display = ["class_obj", "day_num", recordscore, check]
236 
237     # 批量添加内容,使用两个for循环,
238     def patch_add(self, queryset):
239         """
240         print(queryset)
241         <class 'permission.models.ClassList'>
242         <class 'permission.models.UserInfo'>
243         """
244         for course_re in queryset:
245             student_list = Student.objects.filter(class_list=course_re.class_obj)
246             for std in student_list:
247                 StudyRecord.objects.create(course_record=course_re, student=std)
248 
249     patch_add.desc = "批量添加内容"
250     actions = [patch_add]
251 
252 
253 site.register(CourseRecord, CourseRecordConfig)
254 
255 
256 class StudentRecordConfig(ModelSubject):
257     def display_record(self, obj=None, is_header=False):
258         if is_header:
259             return '记录'
260         return obj.get_record_display()
261 
262     def display_score(self, obj=None, is_header=False):
263         if is_header:
264             return '成绩'
265         return obj.get_score_display()
266 
267     list_display = ['student', 'course_record', display_record, display_score]
268 
269     # 缺席操作
270     def absense(self, queryset):
271         queryset.update(record="noshow")
272 
273     # 请假操作
274     def vacate(self, queryset):
275         queryset.update(record="vacate")
276 
277     # 早退操作
278     def leave_early(self, queryset):
279         queryset.update(record="leave_early")
280 
281     # 迟到操作
282     def late(self, queryset):
283         queryset.update(record="late")
284 
285     # 签到操作
286     def check(self, queryset):
287         queryset.update(record="checked")
288 
289     vacate.desc = "请假"
290     absense.desc = "缺勤"
291     leave_early.desc = "早退"
292     late.desc = "迟到"
293     check.desc = "签到"
294 
295     actions = [vacate, absense, leave_early, late, check]
296 
297 
298 site.register(StudyRecord, StudentRecordConfig)
299 site.register(CustomerDistrbute)
model注册

项目权限之登录操作:

 1 from django.shortcuts import render
 2 from rbac.models import *
 3 from django.shortcuts import HttpResponse,render,redirect
 4 # Create your views here.
 5 def login(request):
 6     if request.method == 'GET':
 7         return render(request, 'login.html')
 8     else:
 9         user1 = request.POST.get('user')
10         pwd = request.POST.get('pwd')
11         user = User.objects.filter(name=user1, pwd=pwd).first()
12         if user:
13             # 验证成功之后做什么
14             request.session['user_info'] = {"user_id":user.pk,"username":user.userinfo.username}
15             # 这里是从数据库里面把权限列表给取出来,然后加到session里面,这里是实现了功能解耦,是代码看起来更加简洁
16             from rbac.support.initial import initial_session
17             initial_session(request, user)
18 
19             # return HttpResponse('congratulation!')
20             return redirect("/index/")
21         else:
22             return redirect('/login/')
23 
24 
25 def index(request):
26     return render(request, "index.html")
View 视图函数

 

rbac权限组件:

from support:

baseToHTML:

 1 class EasyTrans(object):
 2     """
 3     我们这里封装了增删改查的方法,给前端传递数据的时候使用类去调用效果更好
 4     """
 5     def __init__(self, code_list):
 6         self.code_list = code_list
 7 
 8     def list(self):
 9         return 'show_list' in self.code_list
10 
11     def add(self):
12         return 'add' in self.code_list
13 
14     def delete(self):
15         return 'del' in self.code_list
16 
17     def edit(self):
18         return 'editor' in self.code_list
base-to-HTML

权限数据结构生成:

 1 def initial_session(request, user):
 2     # 当前用户的所有权限
 3     permission_info = user.roles.all().values(
 4         'permission__id', 'permission__title', "permission__url", 'permission__parent_id',
 5         'permission__PGOne__menu_id', 'permission__PGOne__menu__caption', 'permission__code', 'permission__PGOne_id')
 6 
 7     li = []
 8     for item in permission_info:
 9         temp = {
10             'id': item['permission__id'],
11             'url': item['permission__url'],
12             'title': item['permission__title'],
13             'pid': item['permission__parent_id'],
14             'menu_name': item['permission__PGOne__menu__caption'],
15             'menu_id': item['permission__PGOne__menu_id']
16         }
17         li.append(temp)  # 我们这里把数据库里面的queryset数据结构转换成列表里面套着字典,
18         #  这样我们后面再对数据进行处理的时候, 效率会更高些,我们构建字典的时候,取的key的名,
19         # 后面会大量用到它,取值操作的时候
20     request.session['permission_li'] = li
21 
22     # 版本二 取出当前用户的所有权限内容,包括code和PGOne的内容,并使用特定的数据类型去展开它
23     # permission_dic = list(user.roles.all().values(
24     #     'permission__url', 'permission__title', 'permission__code', 'permission__PGOne').distinct())
25     dic = {}
26     for item in permission_info:
27         pgone = item['permission__PGOne_id']
28         if pgone in dic:
29             dic[pgone]['permission_url'].append(item['permission__url'])
30             dic[pgone]['permission_code'].append(item['permission__code'])
31         else:
32             dic[pgone] = {
33                 'permission_url': [item['permission__url'], ],
34                 'permission_code': [item['permission__code']]
35             }
36     # print(dic)
37     request.session['permission_dic'] = dic
initial(权限生成)

中间件拦截:

 1 from django.utils.deprecation import MiddlewareMixin
 2 from django.contrib import auth
 3 from django.shortcuts import redirect, HttpResponse
 4 import re
 5 
 6 
 7 class M1(MiddlewareMixin):
 8     def process_request(self, request):
 9         # pass
10         # /admin/login/?next=/admin/
11         current_path = request.path_info
12         valid_url_menu = ['/login/', '/reg/', '/admin/.*', '/$', '/index/']
13         for valid_url in valid_url_menu:
14             ret = re.match(valid_url, current_path)  # 这里是以前者为过滤条件,去过滤后者,查看结果是否与之匹配,这个顺序记牢,别搞反了
15             if ret:
16                 return None
17 
18         permission_dic = request.session.get('permission_dic')
19         # print(permission_dic)
20         user_id=None
21         if request.session.get("user_info"):
22             user_id = request.session.get('user_info').get("user_id")
23 
24         if not user_id:
25             return redirect('/login/')
26 
27         for item in permission_dic.values():
28             regs = item['permission_url']
29             codes = item['permission_code']
30             # print(regs, codes)
31             for reg in regs:
32                 reg = '^%s$' % reg
33                 ret = re.match(reg, current_path)
34                 if ret:
35                     request.permission_codes = codes  # 我们这里把request作为一个存贮器,我们的codes数据可以存进去,
36                     # 后面需要用的时候就取出来即可,
37                     return None
38         return HttpResponse('sorry no purview')
39         # return HttpResponse('sorry no purview')
tool.py(中间件)

 

前端模板:

from templates:

 1     <div class="menu_li">
 2 
 3         {% for item in menu_dict.values %}
 4             <div class="item">
 5             <!--我们的左侧菜单栏里面显示的数据要放到a标签里面,但是不能够有href属性,否则它会跳转,我们不想让它跳转,所以就需要把href属性给删除,-->
 6             <!--我们一开始没有把href属性给删掉,它就会刷新页面,我们要找到根源,是左侧菜单的问题,而菜单是在rbac组件里面的自定义标签里面,所以找到自定义标签和它所对应的HTML模板,就可以解决问题了-->
 7                 <div class="title"><a>{{ item.title }}</a></div>
 8                 {% if item.active %}
 9                      <div class="con">
10                 {% else %}
11                      <div class="con hide">
12                 {% endif %}
13                     {% for son in item.children %}
14                         {% if son.active %}
15                             <p><a href="{{ son.url }}" class="active">{{ son.title }}</a></p>
16                         {% else %}
17                             <p><a href="{{ son.url }}">{{ son.title }}</a></p>
18                         {% endif %}
19                     {% endfor %}
20                 </div>
21 
22             </div>
23         {% endfor %}
24 
25     </div>
menu

 

from templatetags:

 1 from django import template
 2 import re
 3 register = template.Library()
 4 
 5 
 6 @register.inclusion_tag('menu.html')
 7 def get_menu(request):
 8     permission_list = request.session['permission_li']
 9     # print("permission_list", permission_list)
10     """
11     [{'id': 1, 'url': '/stark/permissionschool/', 'title': '查看校区', 'pid': None, 'menu_name': '学校管理', 'menu_id': 2},
12      {'id': 2, 'url': '/stark/permissionschool/add/', 'title': '添加校区', 'pid': 1, 'menu_name': '学校管理', 'menu_id': 2}, {'id': 3, 'url': '/stark/permissionschool/(\\d+)/edit/', 'title': '编辑校区', 'pid': 1, 'menu_name': '学校管理', 'menu_id': 2}, {'id': 4, 'url': '/stark/permissionschool/(\\d+)/dele/', 'title': '删除校区', 'pid': 1, 'menu_name': '学校管理', 'menu_id': 2}, {'id': 5, 'url': '/stark/permissioncourse/', 'title': '查看班级', 'pid': None, 'menu_name': '班级管理', 'menu_id': 1}, {'id': 6, 'url': '/stark/permissioncourse/add', 'title': '添加班级', 'pid': 5, 'menu_name': '班级管理', 'menu_id': 1}, {'id': 7, 'url': '/stark/permissioncourse/(\\d+)/edit', 'title': '编辑班级', 'pid': 6, 'menu_name': '班级管理', 'menu_id': 1}, {'id': 8, 'url': '/stark/permissioncourse/(\\d+)/dele/', 'title': '删除班级', 'pid': 5, 'menu_name': '班级管理', 'menu_id': 1}, {'id': 9, 'url': '/stark/permissioncustomer/', 'title': '查看客户', 'pid': None, 'menu_name': '客户管理', 'menu_id': 5}, {'id': 10, 'url': '/stark/permissioncustomer/add/', 'title': '添加客户', 'pid': 9, 'menu_name': '客户管理', 'menu_id': 5}, {'id': 11, 'url': '/stark/permissioncustomer/(\\d+)/edit/', 'title': '编辑客户', 'pid': 9, 'menu_name': '客户管理', 'menu_id': 5}, {'id': 12, 'url': '/stark/permissioncustomer/(\\d+)/dele/', 'title': '删除客户', 'pid': 9, 'menu_name': '客户管理', 'menu_id': 5}, {'id': 13, 'url': '/stark/permissioncustomer/public/', 'title': '公共客户资源', 'pid': None, 'menu_name': '客户管理', 'menu_id': 5}, {'id': 14, 'url': '/stark/permissioncustomer/mine/', 'title': '我的客户资源', 'pid': None, 'menu_name': '客户管理', 'menu_id': 5}]
13     """
14     current_path = request.path_info
15     temp_dict = {}
16     for item in permission_list:
17         pid = item['pid']
18         if not pid:
19             item['active'] = False
20             temp_dict[item['id']] = item
21 
22     for item in permission_list:
23         pid = item['pid']
24         url = item['url']
25         if re.match(url, current_path):
26             if pid:
27                 temp_dict[pid]['active'] = True  # 如果有父级菜单,那就是把父级菜单的active设置成True
28             else:
29                 item['active'] = True  # 如果没有父级菜单,那就是把子级菜单给设置成True
30 
31     menu_dict = {}
32     for item in temp_dict.values():
33         if item['menu_id'] in menu_dict:
34             temp = {
35                 # 'title': item['title'],  我们把数据结构里面的title都找到,
36                        # 然后确认它们在数据中显示的位置,来判断哪一个title应该被替换成menu_name
37                 'title': item['menu_name'],
38                 'url': item['url'],
39                 'active': item['active']
40             },
41 
42             menu_dict[item['menu_id']]['children'].append(temp)  # 这里是把子级菜单给添加进去
43 
44             if item['active']:
45                 menu_dict[item['menu_id']]['active'] = True
46         else:
47             menu_dict[item['menu_id']] = {
48                 # 'title': item['title'],  这里我们要取到的是menu_name,而不是title,
49                 # 所以在前端显示的时候需要把title给替换成menu_name才可以,
50                 # 需要把生成的数据类型给打印出来看看,进行比对,才能找到是哪里出的问题,我们进行数据比对的时候,
51                 # 发现了是title和menu_name的不匹配导致的,所以就在数据结构生成的时候,找到我们的menu_name是在那一层显示出来的,
52                 # 然后把对应的title给替换掉即可
53                 'title': item['menu_name'],
54                 'active': item['active'],
55                 'children': [
56                     {
57                         'title': item['title'],
58                         'url': item['url'],
59                         'active': item['active']
60                     },
61                 ]
62             }
63     # print("=====>", menu_dict)
64     """
65     =====> {2: {'title': '查看校区', 'active': True, 'children': [{'title': '查看校区', 
66     'url': '/stark/permissionschool/', 'active': True}]}, 1: 
67     {'title': '查看班级', 'active': False, 'children': [{'title': '查看班级', 'url': '/stark/permissioncourse/', 'active': False}]}, 5: {'title': '查看客户', 'active': False, 'children': [{'title': '查看客户', 'url': '/stark/permissioncustomer/', 'active': False}, ({'title': '公共客户资源', 'url': '/stark/permissioncustomer/public/', 'active': False},), ({'title': '我的客户资源', 'url': '/stark/permissioncustomer/mine/', 'active': False},)]}}
68     """
69     return {'menu_dict': menu_dict}
70 
71 
72 @register.simple_tag
73 def mul(x, y):
74     return x*y
自定义标签

 

权限model:

 1 from django.db import models
 2 
 3 # Create your models here.
 4 
 5 
 6 # 一级菜单,就是只显示list(它里面有school_list,course_list,student_list,class_list),它的下面会有add,edit,delete
 7 class Menu(models.Model):
 8     caption = models.CharField(max_length=32)
 9 
10     def __str__(self):
11         return self.caption
12 
13 
14 # 员工表
15 class User(models.Model):
16     name = models.CharField(max_length=32)
17     pwd = models.CharField(max_length=32, default=123)
18     email = models.EmailField()
19     roles = models.ManyToManyField(to='Role')
20 
21     def __str__(self):
22         return self.name
23 
24 
25 # 角色表,关联员工,和权限
26 class Role(models.Model):
27     title = models.CharField(max_length=32)
28     permission = models.ManyToManyField(to='Permission')
29 
30     def __str__(self):
31         return self.title
32 
33 
34 # 权限表
35 class Permission(models.Model):
36     title = models.CharField(max_length=32)
37     url = models.CharField(max_length=64)
38     PGOne = models.ForeignKey("PermissionGroup", default=2)
39     code = models.CharField(max_length=32, default="")
40     parent = models.ForeignKey('self', default=1, null=True, blank=True)  # 我们的blank这里是可以选择空白,
41     # 这是在admin浏览器级别的显示,null=True是数据库级别的显示
42 
43     def __str__(self):
44         return self.title
45 
46 
47 # 权限分组表,我们的权限有重复的操作,就把重复的分成组,
48 class PermissionGroup(models.Model):
49 
50     caption = models.CharField(max_length=32)
51     menu = models.ForeignKey(to="Menu", default=1)
52 
53     def __str__(self):
54         return self.caption
model(权限专用)

 

使用stark组件注册权限model:

1 from stark.tools.service import site,ModelSubject
2 from .models import *
3 site.register(Menu)
4 site.register(Permission)
5 site.register(PermissionGroup)
6 site.register(Role)
7 site.register(User)
权限model注册

 

stark组件:

 

from templates-file

HTML模板:

母板:

 1 <!DOCTYPE html>
 2 {#我们的这个base是专供我们的stark组件用的,我们的这个stark组件是独立的组件,#}
 3 {#可以放到任何地方去嵌套使用,这个base是专供下面的add和edit以及delete子版继承用的,它的存在是为了我们的stark迁移到任何地方都可以玩得转,所以是必须的#}
 4 <html lang="en">
 5 <head>
 6     <meta charset="UTF-8">
 7     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 8     <meta name="viewport" content="width=device-width, initial-scale=1">
 9     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
10     <script src="/static/js/jquery-3.2.1.min.js"></script>
11     <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
12     <title>Title</title>
13     {% block css %}
14 
15     {% endblock css %}
16 </head>
17 <body>
18 <div class="container">
19     {% block content %}
20 
21     {% endblock content %}
22 
23 </div>
24 
25 {% block js %}
26 
27 {% endblock js %}
28 
29 </body>
30 </html>
base.html

自定义标签模板:

 1 <div class="container">
 2     <div class="row">
 3         <div class="col-md-8">
 4 
 5             <form action="" method="post" novalidate>
 6                 {% csrf_token %}
 7                 {% for i in form %}
 8                     <div class="form-group put_in" >
 9                         <label for="">{{ i.label }}</label>
10                         <div class="input_style">{{ i }}
11                             <span class="error">{{ i.errors.0 }}</span>
12                         </div>
13                     {% if i.is_pop %}
14                         <a href="" onclick="pop('{{ i.url }}')" class="pop_btn"><span class="pull-right sign">+</span></a>
15                     {% endif %}
16                     </div>
17                 {% endfor %}
18 
19                 <div class="form-group">
20                     <p><input type="submit" class="btn btn-primary"></p>
21                 </div>
22 
23             </form>
24         </div>
25     </div>
26 </div>
27 
28 <script src="/static/js/base.js"></script>
自定义标签模板

 

addhtml:

 1 {% extends "file/base.html" %}
 2 {% block css %}
 3     <link rel="stylesheet" href="/static/css/base.input.css">
 4 
 5 {% endblock css %}
 6 
 7 {% load my_tag %}
 8 
 9 {% block content %}
10     <h3>添加数据</h3>
11     {% get_tag form config %}
12 {% endblock content %}
13 
14 
15 {% block js %}
16 <script src="/static/js/add.js"></script>
17 {% endblock js %}
add_HTML

 

dele.html:

 1 {% extends "file/base.html" %}
 2 
 3 {% block content %}
 4 <table class="table table-hover">
 5     <thead>
 6     <tr>
 7         <th>
 8 
 9         </th>
10     </tr>
11     </thead>
12     <tbody>
13     <tr>
14         <td class="warning">{{ del_obj }}</td>
15     </tr>
16     </tbody>
17 </table>
18 
19 <form action="" method="post">
20     {% csrf_token %}
21     <input type="submit" class="btn btn-danger" value="确认删除?">
22     <a href="{{ list_url }}"></a>
23 </form>
24 {% endblock content %}
dele.html

 

edit.html:

 1 {% extends "file/base.html" %}
 2 
 3 {% load my_tag %}
 4 
 5 {% block css %}
 6     <link rel="stylesheet" href="/static/css/base.input.css">
 7 
 8 {% endblock css %}
 9 
10 {% block content %}
11 <h3>编辑数据</h3>
12 
13 {% get_tag form config %}
14 {% endblock content %}
edit.HTML

 

展示页面:

  1 {% extends "file/base.html" %}
  2 
  3 {% block css %}
  4     <link rel="stylesheet" href="/static/css/hello.css">
  5     <link rel="stylesheet" type="text/css" href="/static/css/jquery.datetimepicker.css"/>
  6     <script src="/static/js/jquery.js"></script>
  7     <script src="/static/js/jquery.datetimepicker.full.js"></script>
  8     <script src="/static/js/jquery.datetimepicker.js"></script>
  9 {% endblock css %}
 10 
 11 {% block content %}
 12 
 13     <h1>数据展示</h1>
 14     <h2>code change the world</h2>
 15 
 16 
 17     <div class="container-fluid">
 18         <div class="row">
 19             <div class="col-md-8">
 20             {% if sl.show_add_btn %}
 21 
 22                 <a href="{{ add_url }}">
 23                     <button class="btn btn-primary" value="添加">添加数据</button>
 24                 </a>
 25             {% endif %}
 26                 {% if sl.config.search_fields %}
 27                     <div class="pull-right form-group">
 28 
 29                         <form action="" method="get" class="form-inline">
 30                             <input type="text" class="form-control" name="q" value="">
 31                             <input type="submit" class="btn btn-info" value="search">
 32                         </form>
 33 
 34                     </div>
 35                 {% endif %}
 36 
 37             {% if sl.show_actions %}
 38                 <form action="" method="post">
 39                     {% csrf_token %}
 40                     <div>
 41 
 42                         <select class="form-control" name="action" id="" style="width:200px;margin:8px 2px;
 43                     display:inline-block;vertical-align:-1px">
 44                             <option value="">---------</option>
 45                             {% for item in sl.handle_actions %}
 46                                 <option value="{{ item.name }}">{{ item.desc }}</option>
 47                             {% endfor %}
 48                         </select>
 49                         <button type="submit" class="btn btn-primary">Go</button>
 50                     </div>
 51                 {% endif %}
 52 
 53                     <table class="table table-stripped table-hover">
 54 
 55                         <thead>
 56                         <tr>
 57                             {% for foo in sl.get_header %}
 58                                 <td>{{ foo }}</td>
 59                             {% endfor %}
 60                         </tr>
 61                         </thead>
 62                         <tbody>
 63                         {% for data in sl.get_body %}
 64                             <tr>
 65                                 {% for item in data %}
 66                                     <td>{{ item }}</td>
 67                                 {% endfor %}
 68                             </tr>
 69                         {% endfor %}
 70 
 71                         </tbody>
 72 
 73                     </table>
 74                 </form>
 75 
 76 
 77                 <div class="text-center">
 78                     <nav aria-label="Page navigation">
 79                         <ul class="pagination">
 80                             {{ sl.pagination.page_html|safe }}
 81                         </ul>
 82                     </nav>
 83                 </div>
 84 
 85 
 86             </div>
 87 
 88             <div class="col-md-3">
 89                 <div class="filter">
 90                     {% for filter_link_tag in sl.get_filter_link_tags %}
 91 
 92 
 93                         <div class="well">{% for data in filter_link_tag %}
 94                             <div>{{ data }}</div>
 95                         {% endfor %}
 96                         </div>
 97 
 98                     {% endfor %}
 99                 </div>
100             </div>
101 {#            <div class="col-md-2">#}
102 
103 {#            <input type="text" id="datetimepicker">#}
104 
105 {#        </div>#}
106         </div>
107     </div>
108 {% endblock content %}
109 
110 {% block js %}
111     <script src="/static/js/hello.js">
112         {#    我们的js代码里面需要注意单引号和双引号的区别,不能轻易改写,还有选择器,组合选择器之间需要空格#}
113     </script>
114     <script src="/static/js/datetimepicker_demo.js"></script>
115     {#我们的这个插件是需要放到body的最底部,带到所有的程序都加载完了,才可以执行它,不能放到上面,放错位置就无效了#}
116 {% endblock js %}
show_list

 

外键关联字段添加内容:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7     <script src="/static/js/jquery-3.2.1.min.js"></script>
 8     <title>Title</title>
 9 </head>
10 <body>
11 
12 <script>
13     opener.hi('{{ ret|safe }}');
14     window.close();
15 </script>
16 </body>
17 </html>
pop(model表数据外键关联数据添加)

 

成绩录入页面:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
 8     <title>Title</title>
 9 </head>
10 <body>
11 <h3>录入成绩</h3>
12 <div class="container">
13     <div class="row">
14 
15         <form action="" method="post">
16             {% csrf_token %}
17             <table class="table table-bordered table-stripped">
18                 <tbody>
19                 {% for study_record in study_record_list %}
20                     <tr>
21                     <td>
22                         {{ study_record.student }}
23                     </td>
24                     <td>
25                         {{ study_record.course_record }}
26                     </td>
27 
28                     {% for field in study_record.form %}
29                             <td>{{ field }}</td>
30                             {% endfor %}
31 
32 {#                    这里是分割线,把这里的部分包裹住就是简单的标签渲染#}
33 {#                        <select name="score_{{ study_record.pk }}" class="form-control" id="">#}
34 {#                            {% for item in score_choices %}#}
35 {#                                {% if study_record.score == item.0 %}#}
36 {##}
37 {#                                <option selected value="{{ item.0 }}">{{ item.1 }}</option>#}
38 {#          我们的score_choices是元祖里面套着元祖,索引位置是分数在前,级别在后,使用if判断是让已经存在的成绩被选中#}
39 {#                                {% else %}#}
40 {#                                    <option value="{{ item.0 }}">{{ item.1 }}</option>#}
41 {#                                {% endif %}#}
42 {#                                {% endfor %}#}
43 {#                        </select>#}
44 {#                      </td>#}
45 {#                    <td>#}
46 {#                        <textarea#}
47 {#                                name="homework_note_{{ study_record.pk }}" class="form-control"#}
48 {#                                id="" cols="40" rows="5" placeholder="{{ study_record.homework_note }}"></textarea>#}
49 {#                    </td>#}
50 {#                    分割线=======简单用法#}
51                     </tr>
52                 {% endfor %}
53 
54                 </tbody>
55 
56             </table>
57             <input type="submit" class="btn btn-primary">
58         </form>
59 
60     </div>
61 </div>
62 </body>
63 </html>
数据录入页面

 

成绩查看页面:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
 8     <script src="/static/js/jquery-3.2.1.min.js"></script>
 9     <script src="/static/js/highcharts.js"></script>
10     <title>Title</title>
11 </head>
12 <body>
13 
14 <h3>查看成绩</h3>
15 <div class="container">
16     <div class="row">
17         <table class="table table-bordered table-striped">
18             {% for cls in class_list %}
19                 <tr>
20                     <td>{{ forloop.counter }}</td>
21                     <td>{{ cls.course }}({{ cls.semester }})</td>
22                     <td><a class="chart" cid="{{ cls.pk }}" sid="{{ obj.pk }}">成绩柱状图</a></td>
23                 </tr>
24             {% endfor %}
25         </table>
26     </div>
27 </div>
28 <div id="container" style="width:600px"></div>
29 
30 <script>
31     $(".chart").click(function () {
32         var sid = $(this).attr("sid");
33         var cid = $(this).attr("cid");
34         $.ajax({
35             url: "",
36             data: {"sid": sid, "cid": cid},
37             success: function (data) {
38                 console.log(data);
39                 console.log(typeof data);
40                 param = {
41                     chart: {
42                         type: 'column'
43                     },
44                     title: {
45                         text: "成绩图"
46                     },
47                     subtitle: {
48                         text: '为了保护学生的自尊心, 成绩都不对外公开'
49                     },
50                     xAxis: {
51                         type: 'category',
52                         labels: {
53                             rotation: -30,
54                             style: {
55                                 fontSize: '13px',
56                                 fontFamily: 'Verdana,sans-serif'
57                             }
58                         }
59                     },
60                     yAxis: {
61                         min: 0,
62                         title: {
63                             text: '分数'
64                         }
65                     },
66                     legend: {
67                         enabled: false
68                     },
69                     tooltip: {
70                         pointFormat: '分数:<b>{point.y:.2f}</b>'
71                     },
72                     series: [{
73                         name: '总人口',
74                         data: [],
75                         dataLabels: {
76                             enabled: true,
77                             rotation: 0,
78                             color: 'red',
79                             align: 'right',
80                             format: '{point.y:.1f}',//one decimal
81                             y: 10,//10pixels down from the top
82                             style: {
83                                 fontSize: '13px',
84                                 fontFamily: 'Verdana, sans-serif'
85                             }
86                         }
87                     }]
88                 };
89                 param.series[0].data=data;
90                 $("#container").highcharts(param);
91 
92             }
93         })
94     })
95 </script>
96 
97 </body>
98 </html>
带柱状图显示页面

 

from templatetags自定义标签:

 1 from django import template
 2 from django.urls import reverse
 3 from django.forms.models import ModelChoiceField
 4 
 5 register = template.Library()
 6 
 7 
 8 @register.inclusion_tag("../templates/file/base_form.html")
 9 def get_tag(form, config):
10 
11     for bound_field in form:
12         """
13         这里的form是我们的前端的form表单,循环这个表单,就得到每一个form里面的外键关联字段
14         """
15         if isinstance(bound_field.field, ModelChoiceField):
16             bound_field.is_pop = True
17             # print(bound_field.field.queryset.model)
18 
19             app_label = bound_field.field.queryset.model._meta.app_label
20             model_name = bound_field.field.queryset.model._meta.model_name
21             _url = "%s_%s_add" % (app_label, model_name)
22             current_model_name = config.model._meta.model_name
23             related_name = config.model._meta.get_field(bound_field.name).rel.related_name
24             bound_field.url = \
25                 reverse(_url) + "?pop_id=id_%s&current_model_name=%s&related_name=%s" % \
26                                 (bound_field.name, current_model_name, related_name)
27 
28     return {'form': form}
自定义标签

 

from tool组件核心源码:

  1 from django.conf.urls import url
  2 from django.shortcuts import render, redirect, reverse
  3 from django.utils.safestring import mark_safe
  4 from django.forms import ModelForm  # 这个ModelForm里面封装了很强大的功能,要把源码过一遍
  5 from django.db.models import ForeignKey, ManyToManyField
  6 from django.utils.http import urlencode
  7 from django.forms.models import ModelChoiceField
  8 import copy
  9 import json
 10 from types import FunctionType
 11 from django.db.models.fields.reverse_related import ManyToOneRel  # 这里的ManyToOneRelated这个类里面封装的方法,点进去细读之
 12 
 13 # 这个类主要帮我们处理多级过滤的a标签,我们之前是把多级过滤的a标签给写到get_filter_link_tags这个函数里面,
 14 # 后来为了实现功能解耦,避免单个函数代码量过大,就把这个功能封装成了一个类,以便于阅读,以及功能扩展
 15 class LinkTagsGen(object):
 16     def __init__(self, data, filter_field, request):
 17         self.data = data
 18         self.filter_field = filter_field
 19         self.request = request
 20 
 21     def __iter__(self):
 22         """
 23         所有的可迭代对象内部都是实现了__iter__方法,我们把数据写到这里就是实现的数据的可迭代
 24         :return: yield 多级过滤的A标签
 25         """
 26         current_id = self.request.GET.get(self.filter_field.filter_name, 0)
 27         params = copy.deepcopy(self.request.GET)
 28         params._mutable = True
 29         if params.get(self.filter_field.filter_name):
 30             del params[self.filter_field.filter_name]
 31             _url = "%s?%s" % (self.request.path_info, params.urlencode())
 32             yield mark_safe("<a href='%s'>All</a>" % _url)
 33         else:
 34             yield mark_safe("<a href='#' class='active'>All</a>")
 35 
 36         for item in self.data:  # self.data是一个个的queryset集合以及元祖,((1,'已出版'),(2,'未出版')),
 37             # <QuerySet[<Publish:人民出版社>,<Publish:北京出版社>]>
 38             # print(self.data)
 39             pk, text = None, None
 40             if self.filter_field.filter_obj.choices:
 41                 pk, text = str(item[0]), item[1]
 42             elif isinstance(self.filter_field.filter_obj, ForeignKey) or isinstance(self.filter_field.filter_obj,
 43                                                                                     ManyToManyField):
 44                 pk, text = str(item.pk), item
 45             else:
 46                 pk, text = item[1], item[1]
 47 
 48             params[self.filter_field.filter_name] = pk
 49             _url = "%s?%s" % (self.request.path_info, params.urlencode())
 50             if current_id == pk:
 51                 link_tag = "<a class='active' href='%s'>%s</a>" % (_url, text)
 52             else:
 53                 link_tag = "<a href='%s'>%s</a>" % (_url, text)
 54             yield mark_safe(link_tag)
 55 
 56 
 57 # 为每一个过滤的字段封装成整体类
 58 class FilterField(object):
 59     def __init__(self, filter_name, filter_obj, config):
 60         self.filter_name = filter_name
 61         self.filter_obj = filter_obj
 62         self.config = config
 63 
 64     def get_data(self):
 65         if isinstance(self.filter_obj, ForeignKey) or isinstance(self.filter_obj, ManyToManyField):
 66             return self.filter_obj.rel.to.objects.all()
 67         elif self.filter_obj.choices:
 68             return self.filter_obj.choices
 69         else:  # 这里是取到我们的当前表格的所有数据,把pk值和字段名显示出来
 70             return self.config.model.objects.values_list('pk', self.filter_name)
 71 
 72 
 73 # 服务于ModelSubject下面的stand_li,我们把stand_li里面的很多方法给封装到这个类里面实现功能解耦,
 74 # 主要是为了减轻我们的StandLi里面的代码量
 75 class StandLi(object):
 76     def __init__(self, config, request, queryset):
 77         """
 78         :param config: 它就是我们下面的类ModelSubject所传过来的它的self实例对象,
 79         我们在这里要使用那些方法和变量就需要把它的这个实例对象拿过来,否则如下搬过来的代码块都会失效
 80         :param request: 我们这个类是在下面的ModelSubject里面调用然后在那里实例化出来的对象,所以这个request是它传过来的
 81         :param queryset: 同上,这个queryset也是ModelSubject所传过来的参数,供下面的代码调用
 82         """
 83         self.config = config
 84         self.request = request
 85         self.queryset = queryset
 86 
 87         # 生成分页器
 88         path = self.request.path_info
 89         params = self.request.GET
 90         page_num = request.GET.get('page', 1)  # 如果没有找到page,就返回1,也就是第一页
 91         from stark.utensil.page import MyPage
 92         count = queryset.count()
 93         page = MyPage(page_num, count, path, params)
 94         self.pagination = page
 95         data_list = self.queryset[page.start:page.end]
 96         self.data_list = data_list
 97         # page_html = page.page_html()  # 这里我们可以把page_html方法直接在前端HTML模板里面引用
 98 
 99         # actions 实现批量操作功能
100         self.actions = self.config.get_actions()  # [patch_init, patch_delete]
101         # print('actions', self.actions)
102 
103         # filter 实现筛选功能
104         self.list_filter = self.config.list_filter
105 
106     # 根据权限是否显示添加按钮
107     # self.show_add_btn=self.config.show_add_btn
108     def show_add_btn(self):
109         if not self.config.show_add_btn:
110             return False
111         if "add" in self.request.permission_codes:
112             return True
113 
114     # 根据权限判断是否显示批量操作按钮
115     def show_actions(self):
116         if not self.config.show_action:
117             return False
118         if "delete" in self.request.permission_codes:
119             return True
120 
121     # 实现多级过滤的类里面封装的一个函数
122     def get_filter_link_tags(self):
123         for filter_name in self.list_filter:
124             filter_obj = self.config.model._meta.get_field(filter_name)
125             filter_field = FilterField(filter_name, filter_obj, self.config)
126             # 这里是按照位置传参,不能随便写的,这边传过去的是什么顺序,那边接收的就是什么顺序
127 
128 
129             # print("filter_field", filter_field.get_data())
130             """
131             filter_field <QuerySet [<Publish: 长春出版社>, <Publish: 香港中文大学出版社>, <Publish: 中信出版社>]>
132             filter_field ((0, '已出版'), (1, '未出版'))
133             filter_field <QuerySet [<Writer: White>, <Writer: Black>, <Writer: Miss Lin>]>
134             """
135             val = LinkTagsGen(filter_field.get_data(), filter_field, self.request)
136             yield val
137 
138     # 这里是使用两个yield去实现的多级过滤
139     #  展示筛选条件
140     # def get_filter_link_tags(self):  # list_filter=['state','publish','authors']
141     #
142     #     for filter_name in self.list_filter:
143     #         current_id = int(self.request.GET.get(filter_name, 0))  # 这里加上int之后我们点击超链接标签的时候就会有字体颜色的变化
144     #         # current_id = self.request.GET.get(filter_name, 0)  # 这里没有加上int点击超链接的时候不会有变化
145     #         # print('current_id', current_id)
146     #         filter_obj = self.config.model._meta.get_field(filter_name)
147     #         # print('filter_obj', filter_obj)
148     #         filter_field = FilterField(filter_name, filter_obj)
149     #         # print("filter_field",filter_field)
150     #         def inner(filter_field, current_id):
151     #             # print(filter_field.get_data())
152     #
153     #             # 这里得出的结果是我们的多对多字段和一对多字段的所有关联数据
154     #             # <QuerySet [<Publish: 长春出版社>, <Publish: 香港中文大学出版社>, <Publish: 中信出版社>]>
155     #             # <QuerySet [<Writer: White>, <Writer: Black>, <Writer: Miss Lin>]>
156     #
157     #             for obj in filter_field.get_data():
158     #                 if isinstance(filter_field.filter_obj, ForeignKey) or \
159     #                         isinstance(filter_field.filter_obj, ManyToManyField):
160     #                     # link_tags=[]
161     #                     params = copy.deepcopy(self.request.GET)
162     #                     params._mutable = True
163     #                     params[filter_field.filter_name] = obj.pk
164     #
165     #                     if current_id == obj.pk:
166     #                         yield mark_safe("<a class='active' href='?%s'>%s</a>" % (params.urlencode(), obj))
167     #                     else:
168     #                         yield mark_safe("<a href='?%s'>%s</a>" % (params.urlencode(), obj))
169     #                 elif filter_field.filter_obj.choices:
170     #                     params = copy.deepcopy(self.request.GET)
171     #                     params._mutable = True
172     #                     params[filter_field.filter_name] = obj[0]
173     #                     if current_id == obj[0]:
174     #                         yield mark_safe("<a class='active' href='?%s'>%s</a>" % (params.urlencode(), obj[1]))
175     #                     else:
176     #                         yield mark_safe("<a href='?%s'>%s</a>" % (params.urlencode(), obj[1]))
177     #                 else:
178     #                     # params = copy.deepcopy(self.request.GET)
179     #                     # params._mutable = True
180     #                     # params[filter_field.filter_name] = obj
181     #                     # yield mark_safe("<a href='?%s'>%s</a>" % (params.urlencode(), obj))
182     #                     ...
183     #         yield inner(filter_field, current_id)
184 
185     # 把自定义的action内容放到一个列表里面,以字典的形式
186     def handle_actions(self):
187         temp = []
188         for action_func in self.actions:
189             temp.append({'name': action_func.__name__, "desc": action_func.desc})
190         return temp
191 
192     # 获取表头数据
193     def get_header(self):
194         # 生成表头数据
195         # ['id','title','price',edit]
196         header_list = []
197         for field in self.config.get_list_display():
198             if callable(field):
199                 ret = field(self, is_header=True)
200                 header_list.append(ret)
201             else:
202                 if field == '__str__':  # 这里是判断我们的list_display列表里面是否有我们自定义传入的值,如果没有的话,
203                     # 就是直接等于我们在静态属性里面设定的那个默认的'__str__',也就是说如果这一步判断成立,
204                     # 那么就证明我们的用户没有自定义展示的字段,我们就需要自己给浏览器一个字段去展示,那个字段就是我们这里所设定的那个大写的表名
205                     header_list.append(self.config.model._meta.model_name.upper())  # 我们这里的操作是
206                 else:
207                     obj = self.config.model._meta.get_field(field)  # 我们的list_display里面是一个个的字符串,
208                     # 把字符串放到get_field里面来可以把我们的字符串转换成类对象,
209                     header_list.append(obj.verbose_name)  # 我们这里的verbose_name在model里面是内置方法,
210                     # 我们的verbose_name本质上是对我们的字段进行描述的,比如我们的book里面的title可以在字段约束里面设
211                     # verbose_name='书名',类似于这样,把它变成中文,然后我们在前端HTML模板里面渲染的时候就可以渲染出来中文了,
212                     # 而不是使用默认的英文,当然了我们如果不设置verbose_name的值那么就使用默认的title作为字段名传到浏览器
213 
214         return header_list
215 
216     # 获取表单数据
217     def get_body(self):
218         # 生成表单数据列表(我们把这个函数挪到上面这个类里面来之后,把循环遍历的数据改动了,之前是把当前表格的数据取出来之后就直接遍历它,
219         # 后来我们有了搜索功能,那么就不能遍历表格里面的所有数据了,需要把我们过滤查询出来的数据给遍历出来
220         # ret = self.config.model.objects.all().count()
221         # print('self.list_display', self.list_display)
222         data_temp = []
223         for obj in self.data_list:  # 我们遍历这个queryset集合得到的obj是它的每一个对象
224             # print(self.data_list)
225             """
226             <QuerySet [<Writer: White>, <Writer: Black>, <Writer: Miss Lin>]>
227             """
228             temp = []
229             for field in self.config.get_list_display():  # 我们遍历list_display得到每一个字符串
230 
231                 if callable(field):
232                     # res = field(obj)  # @@@更上面的特殊标识的代码块相呼应
233                     res = field(self.config, obj)  # &&& 这里跟上面同样标识的代码块相呼应的,上面我们使用的类名去调用函数名,
234                     # 得到的是一个函数,这里就是给所调用的函数传参的,self,和obj都是我们传给函数的参数;
235                     # 如果我们使用self这个对象去调用函数名的方法的话,就不需要再传一个self作为参数进去了,我们两种方法都可以,需要对应上即可
236                 # if isinstance(field, FunctionType):
237                 #     res = field(self.config, obj=obj)
238                 else:
239                     try:
240                         field_obj = self.config.model._meta.get_field(field)
241                         if isinstance(field_obj, ManyToManyField):  # 这里是判断该字段是否是多对多字段,
242                             ret = getattr(obj, field).all()  # 使用getattr方法去判断该对象是否具有,field属性方法,
243                             # getattr里面需要两个参数(类对象,字符串属性方法).另外一点是,使用getattr(obj, field).all()就相当于
244                             # 是obj.fields.all取出该字段的所有数据
245                             list = []
246                             for j in ret:
247                                 list.append(str(j))
248                             res = ' / '.join(list)
249                         else:
250                             res = getattr(obj, field)
251                             if field in self.config.list_display_links:  # 我们这里是判断表单里面的字段是否在links表格里面
252                                 # 被自定义作为可跳转标签,
253                                 # 如果答案是肯定的,那么我们就需要把a标签给拼出来
254                                 res = self.config.get_link_tag(obj, res)
255                     except Exception as e:
256                         # print("hello-world", e)  # Customer has no field named '__str__'
257                         res = str(obj)
258                 temp.append(res)
259             data_temp.append(temp)
260 
261         # print('data_list', data_list)
262 
263         """
264         我们最终得到的数据类型是如下格式:列表套着列表
265         [
266         使用orm语句得到的每一个类对象,有几个表格就有几个对象
267         ]
268         list_display=['id','title',]
269         [
270         [1,'python',<a>编辑</a>],
271         [2,'java',<a>编辑</a>],
272         ]
273         """
274         return data_temp
275 
276 
277 # 默认样式类
278 class ModelSubject(object):
279     """
280     我们在这里模拟admin源码里面的ModelAdmin,
281     """
282     list_display = ["__str__", ]  # 我们在这里给空列表里面加上"__str__",它就相当于是一个默认值,
283     model_form_class = None  # 为下面我们判断用户是否有自定义ModelForm校验方式而做铺垫
284     search_fields = []
285     list_display_links = []  # 为我们后面用户是否有自定义可跳转字段做铺垫
286     # 就像我们的函数里面有默认值的参数一样,如果有传参就使用我们的自定义传参,如果没有传参就使用我们默认的参数也就是这个字符串,
287     # 这里是为了给我们后面的代码做铺垫,我们的目的是在我们的数据展示页面里面默认就会把复选框和编辑还有删除按钮都加上,
288     # 在这里把空列表里面添加上一个默认的字符串,是为了我们后面往该列表里面添加默认固定数据也就是复选框和编辑删除按钮做铺垫
289     actions = []
290     list_filter = []  # 多级过滤
291 
292     # 是否显示添加按钮
293     show_add_btn = True
294 
295     # 是否显示action批量操作按钮这里是默认值,在此默认值基础上进行权限判断
296     show_action = True
297 
298     # 静态内置方法
299 
300     def __init__(self, model, site):
301         self.model = model  # 当我们生成一个实例化对象的时候需要把model这个参数传进来,
302         # 必须要传,它是位置参数,然后我们所传入的那个model就是我们在models.py里面定义的每一个表名也就是类名
303         self.site = site
304         self.namespace = '{}_{}'.format(self.model._meta.app_label, self.model._meta.model_name)
305         # self.app_model_name = (self.model._meta.app_label, self.model._meta.model_name)  # 这里写得跟上面一句是一样的效果,
306         # 这里调用的时候需要有两个%s,因为这里是一个元祖,而我们上面的namespace是一个字符串,不是一个元祖,所以只需要一个%s即可,调用的时候就这点区别
307 
308     # 我们这里的namespace是因为会频繁使用到所以就把它作为一个内置静态属性写入到这里,其他地方如果要调用它就直接使用self.namespace即可
309     # .format的方法:'{}_{}'.format(a,b)
310 
311     # 默认actions批量删除
312     def patch_delete(self, queryset):
313         queryset.delete()
314         return None
315 
316     patch_delete.desc = '批量删除'
317 
318     # 获取真正展示的actions
319     def get_actions(self):
320         temp = []
321         temp.extend(self.actions)  # [patch_init,patch_delete]
322         temp.append(ModelSubject.patch_delete)
323         return temp
324 
325     # 获取展示页面的url
326     def get_stand_url(self):
327         stand_url = reverse('%s_standlist' % self.namespace)
328         return stand_url
329 
330     # 获取编辑页面的url
331     def get_edit_url(self, obj):
332         edit_url = reverse('%s_edit' % self.namespace, args=(obj.pk,))
333         return edit_url
334 
335     # 获取删除页面的url
336     def get_dele_url(self, obj):
337         dele_url = reverse('%s_dele' % self.namespace, args=(obj.pk,))
338         return dele_url
339 
340     # 获取增加页面的url
341     def get_add_url(self):
342         add_url = reverse('%s_add' % self.namespace)
343         return add_url
344 
345     # 展示页面默认附带的编辑按钮
346     def edit(self, obj=None, is_header=False):
347         if is_header:
348             return '操作'
349         return mark_safe('<a href="%s">编辑</a>' % reverse('%s_edit' % self.namespace, args=(obj.pk,)))
350 
351     # 展示页面默认附带的删除按钮
352     def dele(self, obj=None, is_header=False):
353         if is_header:
354             return '删除'
355         return mark_safe("<a href='%s'>删除</a>" % reverse('%s_dele' % self.namespace, args=(obj.pk,)))
356 
357     # 展示页面附带的默认复选框
358     def checkbox(self, obj=None, is_header=False):
359         if is_header:
360             return mark_safe("<input id='action-toggle' type='checkbox'>")
361         return mark_safe("<input type='checkbox' value='%s' name='_selected_action'>" % obj.pk)
362 
363     # 展示页面默认显示按钮被存放的列表
364     def get_list_display(self):
365         new_li = []
366         new_li.extend(self.list_display)
367         if not self.list_display_links and "edit" in self.request.permission_codes:
368             new_li.append(ModelSubject.edit)  # &&& 跟如下同样特征的代码块相呼应我们在这里使用类名去调用函数名,得到的是一个函数的方法,
369         # 函数如果有参数是需要我们传参数的;但是我们如果使用self去调用的话,self就是实例化出来的对象,
370         # 而我们的对象去调用函数方法的时候就不需要去传自己了也就是self,
371         if "delete" in self.request.permission_codes:
372             new_li.append(ModelSubject.dele)
373         new_li.insert(0, ModelSubject.checkbox)  # 把checkbox放到第一个位置,使用insert插入到索引为0
374         # else:
375         #     new_li.extend(self.list_display)  # 我们这里的extend是把它后面的列表里面的数据都取出来放到我们自己的这个列表里面来
376         #     new_li.append(ModelSubject.dele)
377         #     new_li.insert(0, ModelSubject.checkbox)
378         """
379         # @@@ 跟下面特殊标识的代码块相呼应
380         new_li.append(self.edit)
381         new_li.append(self.dele)
382         new_li.insert(0,self.checkbox)
383         """
384         return new_li
385 
386     # 模糊查询
387     def get_search_condition(self):
388         from django.db.models import Q
389         search_condition = Q()
390         search_condition.connector = 'or'
391         if self.search_fields:  # 如果用户有自定义的查询字段,我们就走这个if下面的代码,
392             key_word = self.request.GET.get('q')  # 取出用户输入的input里面的值,
393             if key_word:
394                 for search_field in self.search_fields:  # 遍历用户自定义的查询字段列表,
395                     search_condition.children.append((search_field + "__contains", key_word))
396         return search_condition
397 
398     # 处理用户自定义的link超链接字段标签,然后让超链接携带url键值对参数方法,供get_body使用
399     def get_link_tag(self, obj, val):
400         params = self.request.GET
401         params = copy.deepcopy(params)
402         params._mutable = True
403         # from django.http import QueryDict
404         # qqx = QueryDict(mutable=True)
405         qqx = {}  # 这里只写一行,等效于上面的两行,当然了前提是我们要引入urlencoded
406         qqx['list_filter'] = params.urlencode()
407         whh = mark_safe("<a href='{}?{}'>{}</a>".format(self.get_edit_url(obj), urlencode(qqx), val))
408         return whh
409 
410     # 获取多级过滤的数据
411     def get_filter_condition(self):
412         from django.db.models import Q
413         fiter_condition = Q()
414         for field, val in self.request.GET.items():
415             if field in self.list_filter:
416                 fiter_condition.children.append((field, val))
417         return fiter_condition
418 
419     # 展示页面
420     def stand_li(self, request):
421         # print(self.model)
422         # 所以我们在这里可以获取到当前的url里面的表名,然后直接使用orm语句即可得到当前表格的所有信息
423         if request.method == 'POST':
424             # print('request.POST.get', request.POST.get('action'))
425             # print('request.POST.getlist', request.POST.getlist("_selected_action"))
426             # 打印出来的结果是request.POST.getlist ['on', 'on'] 这个on是从何而来的,我的input里面的所有value值都设定的是obj.pk,
427             # 这个obj.pk是有值的,
428             # 为什么这里打印出来的getlist是两个on?我们的input标签上面有name值,
429             # 然后我们使用request.POST.get后面的括号里面放的是name属性的值,然后它的返回值是我们的input标签里面的value值,
430             # 都说了是value值,怎么还能加上s呢?简直愚蠢,
431 
432             pk_list = request.POST.getlist("_selected_action")
433             queryset = self.model.objects.filter(pk__in=pk_list)
434             func_name = request.POST.get("action")
435             func = getattr(self, func_name)
436             ret = func(queryset)
437 
438         self.request = request
439 
440         # 关于search的模糊查询
441         search_condition = self.get_search_condition()
442 
443         # action
444         # a=self.model.objects.all().count()  # 这样就是可以获取我们的queryset集合的总数据长度,
445         # 然后就可以用它去传给我们的分页组件,用它也可以,直接用count就能获取数据长度,或者是用len也行,我之前都是用len获取的
446 
447         # filter多级过滤,
448         get_filter_condition = self.get_filter_condition()
449         queryset = self.model.objects.filter(search_condition).filter(get_filter_condition)
450         add_url = self.get_add_url()
451         sl = StandLi(self, request, queryset)  # 这里是把我们的StandLi这个类所需要的参数都传给它,然后通过StandLi实例化出来的一个对象
452         # 然后在这里实例化出来一个对象我在这里调用那个对象就能够使用那个类里面的封装的方法了
453 
454         return render(request, '../templates/file/hello.html', locals())
455 
456     # ModelForm校验添加和编辑页面
457     def get_modelform_class(self):
458         from django.forms import widgets
459 
460         class AllModelForm(ModelForm):
461             class Meta:
462                 model = self.model
463                 fields = '__all__'
464 
465         if not self.model_form_class:  # 这里的model_form_class在上面被定义了默认是None,
466             # 我们的分发下去的App里面自定义的file文件里面注册model类的时候实例化出来的对象,在注册的时候传过来的这个变量
467             return AllModelForm
468         else:
469             return self.model_form_class
470 
471     # ModelForm校验数据添加页面
472     def add_view(self, request):
473 
474         FormClass = self.get_modelform_class()
475         if request.method == 'GET':
476             form = FormClass()
477 
478             from django.forms.boundfield import BoundField
479 
480             return render(request, '../templates/file/add.html', {'form': form, "config": self})
481         else:
482             data_list = FormClass(data=request.POST)
483             if data_list.is_valid():
484                 ret = data_list.save()
485                 # print("hello world", ret._meta.related_objects)
486                 # hello world (<ManyToOneRel: permission.classlist>,) 直接使用ret._meta.related_objects得到的就是与该表关联的表
487                 """
488                 我添加的是School表格的数据
489              
490                 print(1,ret, type(ret))  # 1 台北大学 <class 'permission.models.School'>
491                 print(2,ret._meta)  # 2 permission.school
492                 print(3,type(ret._meta))  # 3 <class 'django.db.models.options.Options'>
493                 print(4,ret._meta.related_objects)  # 4 (<ManyToOneRel: permission.classlist>,)
494                 """
495 
496                 pop_id = request.GET.get('pop_id')
497                 if pop_id:
498                     # 判断ret是否符合当前要求
499                     related_name = request.GET.get("related_name")  # None
500                     # print(related_name)  # consultanter
501                     current_model_name = request.GET.get("current_model_name")
502                     for obj_related_field in ret._meta.related_objects:
503                         _related_name = str(obj_related_field.related_name)
504                         _model_name = obj_related_field.field.model._meta.model_name
505                         # _model_name = obj_related_field.to
506 
507                         print(1, _model_name, _related_name)  # classlist classes
508                         val = {"state": False, 'pk': None, 'text': None, 'pop_id': None}
509                         if related_name == _related_name and _model_name == current_model_name:
510                             print(2, "limit_choices_to:", obj_related_field.limit_choices_to)
511                             res = self.model.objects.filter(pk=ret.pk, **obj_related_field.limit_choices_to)
512                             """
513                             **obj_related_field.limit_choices_to这里得到的是一个字典,我们使用**把这个字典打散,打散后的格式是:
514                             depart_id=1002,就按照这个格式过滤
515                             """
516                             if res:
517                                 val["state"] = True
518                                 val["pk"] = getattr(ret, obj_related_field.field_name)
519                                 val["text"] = str(ret)
520                                 val["pop_id"] = pop_id
521 
522                                 return render(request, '../templates/file/pop_demo.html', {'ret': json.dumps(val)})
523                     return render(request, "../templates/file/pop_demo.html", {'ret': json.dumps(val)})
524                 """
525                 我们这里的for循环需要一个return值,
526                 """
527 
528                 return redirect(self.get_stand_url())
529             else:
530                 return render(request, '../templates/file/add.html', {'form': data_list, "config": self})
531 
532     # ModelForm校验数据编辑页面
533     def edit_view(self, request, id):
534         edit_list = self.model.objects.filter(pk=id).first()
535         FormClass = self.get_modelform_class()
536         if request.method == 'GET':
537             data_list = FormClass(instance=edit_list)
538             return render(request, '../templates/file/edit.html', {'form': data_list, 'config': self})
539         else:
540             data_list = FormClass(data=request.POST, instance=edit_list)
541         if data_list.is_valid():
542             data_list.save()
543             params = request.GET.get('list_filter')
544             url = "%s?%s" % (self.get_stand_url(), params)
545             return redirect(url)
546             # return redirect(self.get_stand_url())
547         else:
548             return render(request, '../templates/file/edit.html', {'form': data_list})
549 
550     # 数据删除页面
551     def dele_view(self, request, id):
552         del_obj = self.model.objects.filter(pk=id).first()
553         if request.method == 'GET':
554             stand_url = self.get_stand_url()
555             return render(request, '../templates/file/dele.html', {'del_obj': del_obj, 'list_url': stand_url})
556         else:
557             del_obj.delete()
558 
559             return redirect(self.get_stand_url())
560 
561     def extra_url(self):
562         return []
563 
564     # 获取url,此为第二次分发
565     def get_urls(self):
566         temp = []
567         temp.append(url(r'^$', self.stand_li, name='%s_standlist' % self.namespace))
568         temp.append(url(r'^(\d+)/dele/', self.dele_view, name='%s_dele' % self.namespace))
569         temp.append(url(r'^(\d+)/edit/', self.edit_view, name='%s_edit' % self.namespace))
570         temp.append(url(r'^add/', self.add_view, name='%s_add' % self.namespace))
571 
572         temp.extend(self.extra_url())
573         return temp
574 
575     @property
576     def urls(self):
577         return self.get_urls()
578 
579 
580 class Stark(object):
581     """
582     我们这里面的功能是可以跟上面的类写到一起去的,但是我们为了功能解耦,所以就分开写了,这里的主要功能就是
583     生成registry的字典,把键值对生成,然后我们最终的结果是要得到一个实例化对象,供我们后面的程序调用,这里的类才是主要的,核心的代码块
584     而我们上面的那个ModelSubject是辅助我们这里的功能,它之所以分发出去是为了便于扩展其他的功能,我们的自定义样式,
585     还有很多的方法和参数,就像我们的admin里面的ModelAdmin一样,长达1400多行代码,单独把它分离出去便于功能的扩展
586     """
587 
588     def __init__(self):
589         self._registry = {}  # 这里是定义一个私有属性,就是为了避免被子类修改
590 
591     # 注册model表
592     def register(self, model, model_config=None):  # 我们是仿照着admin的源码写的组件,这里的model_config默认值是None,
593         # 我们在传参的时候,如果给它传值,那么就使用我们传入的值替换掉这个None
594         # 它的源码里面有这几个参数,我们也要按照顺序把这几个参数加进来
595         if not model_config:
596             model_config = ModelSubject  # 我们这里的model_config我们上面的类ModelSubject实例化出来的对象,
597             # 它是上面的类所实例化出来的对象,这一句写得明明白白的,这大白话再看不懂就真是白学了,
598         self._registry[model] = model_config(model, self)
599 
600     # 获取url,第一次分发
601     def get_urls(self):
602         li = []
603         for model, model_config in self._registry.items():  # 我们在这里所循环的model_config就是
604             # 我们往上数第四行所实例化出来的那个model_config,它是上面的ModelSubject这个类所实例化出来对象,
605             model_name = model._meta.model_name  # 这里的._meta.model_name是获取字符串格式的类名,
606             app_label = model._meta.app_label  # 这里的._meta.app_labe获取的是字符串格式的App名,都是为了跟url做匹配,
607             sli = url(r'%s%s/' % (app_label, model_name), (model_config.urls, None, None))  # 我们这里的model_config,
608             # 它后面的.urls是在调用一个私有方法,我们的私有方法就是使用.urls来调用,不用加上括号,
609             # 因为有@property这个装饰器在里面起到的作用,然后我们需要找到model_config这个实例对象是哪个类生成的,
610             # 然后找到该类所拥有的方法,从里面找到urls,届时,那个urls就是我们在这里调用的那个urls了,
611             # 所以关键的点就是我们的model_config,老师讲课的时候一再地强调过这个model_config从何而来,这个是关键,
612             li.append(sli)
613         return li
614 
615     # 我们最终的数据结构就是这样的,嵌套多层
616     # [
617     # url(
618     # r'',(
619     # [
620     # (url(r'',views.add)),
621     # (url(r'',views.edit)),
622     # ],
623     # none,none)
624     # )
625     # ]
626     @property
627     def urls(self):
628         return self.get_urls(), None, None
629 
630 
631 site = Stark()
加上权限限制的组件核心源码

 

from utensil:

  1 # 分页封装方法(带参数版)
  2 class MyPage(object):
  3 
  4     def __init__(self, page_num, total_count, base_url, params, per_page_num=8, max_show=5):
  5         """
  6         :param params: 当前页码所携带的url里面的键值对参数
  7         :param page_num: 当前页面
  8         :param total_count: 数据总个数
  9         :param base_url: 分页页码跳转的url
 10         :param per_page_num: 每一页显示多少条数据
 11         :param max_show: 页面上最多显示多少页码
 12         """
 13         # 实例化时传进来的参数
 14         # 我们在这里捕捉一下异常,把传进去的参数改成数字类型,否则就返回第一页
 15         try:
 16             page_num = int(page_num)
 17         except Exception as e:
 18             page_num = 1
 19         if page_num < 1:  # 如果我们的当前页码出现负数的时候,这里就直接返回第一页,避免出现负数的情况
 20             page_num = 1
 21         self.params = params
 22         self.page_num = page_num
 23         self.total_count = total_count
 24         self.base_url = base_url
 25         self.per_page_num = per_page_num
 26         self.max_show = max_show
 27         self.half_show = int((self.max_show-1)/2)
 28         total_page_num, more = divmod(total_count, per_page_num)
 29         """
 30         我们使用总数据的个数对每页显示的数据个数取余,得到的商是页码数,如果有余数就在商的页码数上加一
 31         """
 32         if more:
 33             total_page_num += 1
 34         self.total_page_num = total_page_num
 35 
 36         import copy
 37         params = copy.deepcopy(params)  # 这里的QueryDict里面是有内置方法,它存储的是一个字典,
 38         # 我们的url里面的参数都在这里面,我们要用它就需要对其进行赋值操作,然后它有一个参数是_mutable默认值False,
 39         # 不能修改也不能被赋值,我们需要把params给copy一份,使用deepcopy,然后deepcopy的基础上进行赋值
 40         params._mutable = True
 41         self.params = params  # self.params: {'page':23, 'title': python, 'nid': 3}
 42         # 这里就是我们的url里面携带的键值对,都封装到params里面了
 43 
 44     # 首页
 45     @property
 46     def start(self):
 47         return (self.page_num-1)*self.per_page_num
 48 
 49     # 尾页
 50     @property
 51     def end(self):
 52         return self.page_num*self.per_page_num
 53 
 54     def page_html(self):
 55         """
 56         返回页面上可以用的一段HTML
 57         一段可用的分页页码的HTML
 58         :return:
 59         """
 60         # 如果总页码数<=最大显示页码数,那么起始页码数分别是什么
 61         if self.total_page_num <= self.max_show:
 62             page_start = 1
 63             page_end = self.total_page_num
 64         else:  # 如果当前页<=最多显示的页码数的一半,那么起始页码分别是什么
 65             """
 66             假设,我们最多显示7个分页,那么第一页就是1,最后一页就是7,但是我们的当前页是2,
 67             它往前倒推7/2商3余1,2-3得到当前页的首页-1,就是负数了,所以这个时候需要做限制,让首页等于1,
 68             """
 69             if self.page_num <= self.half_show:
 70                 page_start = 1
 71                 page_end = self.max_show
 72             else:
 73                 # 如果当前页>=总页码数-最多显示的页码数的一半,那么起始页码分别是什么
 74                 """
 75                 如果我们在第6页,我们的页面最多显示7个页码,而我们的总数据就只能显示8页的话,
 76                 倒推的6+7/2商3余1,就是(6+3)>8,我们的第9页就是空白页,这个时候就需要加以限制,
 77                 此时第一页就是8-6+1,也就是从第二页开始,一直到第八页,就刚好是7页,这样就完美了
 78                 此时最后一页就是数据最多所展示的页码第8页
 79                 """
 80                 if self.page_num >= self.total_page_num - self.half_show:
 81                     page_start = self.total_page_num - self.max_show + 1
 82                     page_end = self.total_page_num
 83                 else:  # 最后到这里我们判断了数据所在的页码出现在最前面把负数页码排除了,也判断了数据所在的页码出现最后面把空白页码排除了,
 84                     # 也判断了总页码数还不够我们所设置的最大页码显示,就剩下最后一种情况了,那就是当前页不在最后也不在最前,
 85                     # 直接用当前页加上或减去最大显示页的1/2,就得到了起始页面
 86                     page_start = self.page_num - self.half_show
 87                     page_end = self.page_num + self.half_show
 88 
 89         # 生成前页码的HTML
 90         page_html_list = []
 91 
 92         # 生成第一页
 93         self.params['page'] = 1
 94         page_first_tmp = '<li><a href="{}?{}">首页</a><li>'.format(self.base_url, self.params.urlencode())
 95         page_html_list.append(page_first_tmp)
 96 
 97         # 生成上一页
 98         if self.page_num <= 1:
 99             page_prev_tmp = '<li class=disabled><a href="#">上一页</a></li>'
100         else:
101             self.params['page'] = self.page_num-1
102             page_prev_tmp = '<li><a href="{}?{}">上一页</a></li>'.format(self.base_url, self.params.urlencode())
103 
104         page_html_list.append(page_prev_tmp)
105 
106         # 生成页码中间页数前半截
107         for i in range(page_start, page_end+1):
108             self.params['page'] = i
109             if i == self.page_num:
110                 tmp = '<li class="active"><a href="{}?{}">{}</a></li>'.format(self.base_url, self.params.urlencode(), i)
111             else:
112                 tmp = '<li><a href="{}?{}">{}</a></li>'.format(self.base_url, self.params.urlencode(), i,)
113 
114             page_html_list.append(tmp)
115 
116         # 生成页码中间页数后半截
117         if self.page_num + 1 > self.total_page_num:
118             page_next_tmp = '<li class="disabled"><a href="#">下一页</a></li>'
119         else:
120             self.params['page'] = self.page_num+1
121             page_next_tmp = '<li><a href="{}?{}">下一页</a></li>'.format(self.base_url, self.params.urlencode(),)
122 
123         page_html_list.append(page_next_tmp)
124 
125         # 生成最后一页
126         self.params['page'] = self.total_page_num
127         page_last_tmp = '<li><a href="{0}?{1}">尾页</a></li>'.format(self.base_url, self.params.urlencode(),)
128         page_html_list.append(page_last_tmp)
129 
130         return "".join(page_html_list)
131 
132 
133 
134 
135 """
136 # 分页封装方法(简化版)
137 class MyPage(object):
138 
139     def __init__(self, page_num, total_count, base_url, per_page_num=3, max_show=5):
140 
141         '''
142         :param page_num: 当前页面
143         :param total_count: 数据总个数
144         :param base_url: 分页页码跳转的url
145         :param per_page_num: 每一页显示多少条数据
146         :param max_show: 页面上最多显示多少页码
147         '''
148         # 实例化时传进来的参数
149         # 我们在这里捕捉一下异常,把传进去的参数改成数字类型,否则就返回第一页
150         try:
151             page_num = int(page_num)
152         except Exception as e:
153             page_num = 1
154         if page_num < 1:  # 如果我们的当前页码出现负数的时候,这里就直接返回第一页,避免出现负数的情况
155             page_num = 1
156         self.page_num = page_num
157         self.total_count = total_count
158         self.base_url = base_url
159         self.per_page_num = per_page_num
160         self.max_show = max_show
161         self.half_show = int((self.max_show-1)/2)
162         total_page_num, more = divmod(total_count, per_page_num)
163         '''
164         我们使用总数据的个数对每页显示的数据个数取余,得到的商是页码数,如果有余数就在商的页码数上加一
165         '''
166         if more:
167             total_page_num += 1
168         self.total_page_num = total_page_num
169 
170     # 首页
171     @property
172     def start(self):
173         return (self.page_num-1)*self.per_page_num
174 
175     # 尾页
176     @property
177     def end(self):
178         return self.page_num*self.per_page_num
179 
180     def page_html(self):
181         '''
182         返回页面上可以用的一段HTML
183         一段可用的分页页码的HTML
184         :return:
185         '''
186         # 如果总页码数<=最大显示页码数,那么起始页码数分别是什么
187         if self.total_page_num <= self.max_show:
188             page_start = 1
189             page_end = self.total_page_num
190         else:  # 如果当前页<=最多显示的页码数的一半,那么起始页码分别是什么
191             '''
192             假设,我们最多显示7个分页,那么第一页就是1,最后一页就是7,但是我们的当前页是2,
193             它往前倒推7/2商3余1,2-3得到当前页的首页-1,就是负数了,所以这个时候需要做限制,让首页等于1,
194             '''
195             if self.page_num <= self.half_show:
196                 page_start = 1
197                 page_end = self.max_show
198             else:
199                 # 如果当前页>=总页码数-最多显示的页码数的一半,那么起始页码分别是什么
200                 '''
201                 如果我们在第6页,我们的页面最多显示7个页码,而我们的总数据就只能显示8页的话,
202                 倒推的6+7/2商3余1,就是(6+3)>8,我们的第9页就是空白页,这个时候就需要加以限制,
203                 此时第一页就是8-6+1,也就是从第二页开始,一直到第八页,就刚好是7页,这样就完美了
204                 此时最后一页就是数据最多所展示的页码第8页
205                 '''
206                 if self.page_num >= self.total_page_num - self.half_show:
207                     page_start = self.total_page_num - self.max_show + 1
208                     page_end = self.total_page_num
209                 else:  # 最后到这里我们判断了数据所在的页码出现在最前面把负数页码排除了,也判断了数据所在的页码出现最后面把空白页码排除了,
210                     # 也判断了总页码数还不够我们所设置的最大页码显示,就剩下最后一种情况了,那就是当前页不在最后也不在最前,
211                     # 直接用当前页加上或减去最大显示页的1/2,就得到了起始页面
212                     page_start = self.page_num - self.half_show
213                     page_end = self.page_num + self.half_show
214 
215         # 生成前页码的HTML
216         page_html_list = []
217         page_first_tmp = '<li><a href="{}?page=1">首页</a><li>'.format(self.base_url,)
218         page_html_list.append(page_first_tmp)
219 
220         # 生成上一页
221         if self.page_num <= 1:
222             page_prev_tmp = '<li class=disabled><a href="#">上一页</a></li>'
223         else:
224             page_prev_tmp = '<li><a href="{}?{}">上一页</a></li>'.format(self.base_url, self.page_num-1,)
225 
226         page_html_list.append(page_prev_tmp)
227 
228         # 生成页码中间页数前半截
229         for i in range(page_start, page_end+1):
230             if i == self.page_num:
231                 tmp = '<li class="active"><a href="{0}?{1}">{1}</a></li>'.format(self.base_url, i)
232             else:
233                 tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i,)
234 
235             page_html_list.append(tmp)
236 
237         # 生成页码中间页数后半截
238         if self.page_num + 1 > self.total_page_num:
239             page_next_tmp = '<li class="disabled"><a href="#">下一页</a></li>'
240         else:
241             page_next_tmp = '<li><a href="{0}?page={1}">下一页</a></li>'.format(self.base_url, self.page_num+1,)
242 
243         page_html_list.append(page_next_tmp)
244 
245         # 生成最后一页
246         page_last_tmp = '<li><a href="{0}?page={1}">尾页</a></li>'.format(self.base_url, self.total_page_num,)
247         page_html_list.append(page_last_tmp)
248 
249         return "".join(page_html_list)
250 
251 """
分页插件

 

组件部分到此为止==========================================================================================================================

 

主项目的HTML模板文件:

from第一张图的template

from template.file

 1 {% load tags %}
 2 {#这个模板主要解决的是把rbac里面的自定义标签HTML文件加载过来,然后供继承用,它是专供我们的rbac组件用的,我们在这个项目里面需要使用到rbac和stark两个组件#}
 3 {#所以就需要在这两个地方都写上base母板,而且还得是同样的路径,因为我们的stark组件里面的子版是固定继承这个路径下面的母板,#}
 4 {#为了方便统一管理避免不断修改数据,就把我们的根目录下面的base母板也改成了同样的路径#}
 5 <html lang="en">
 6 <head>
 7     <meta charset="UTF-8">
 8     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 9     <meta name="viewport" content="width=device-width, initial-scale=1">
10     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
11     <script src="/static/js/jquery-3.2.1.min.js"></script>
12     <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
13 
14     {% block css %}
15 
16     {% endblock css %}
17 
18     <link rel="stylesheet" href="/static/css/base.css/">
19     <title>Title</title>
20 
21 </head>
22 <body>
23 
24 <div class="header"></div>
25 
26 
27 <div class="box">
28         <div class="menu ">
29             {% get_menu request %}
30         </div>
31 
32 
33         <div class="content">
34         {% block content %}
35 
36         {% endblock content %}
37         </div>
38 </div>
39 
40 {% block js %}
41 
42 {% endblock js %}
43 
44 <script>
45 
46     $(".menu_li .title").click(function(){
47         if($(this).next().hasClass("hide")){
48             $(this).next().removeClass("hide");
49         }else{
50             $(this).next().addClass("hide");
51         }
52     })
53 
54 </script>
55 
56 </body>
57 </html>
母板(带权限左侧菜单展示页面)

 

跟我们的总路由url里面对应的index页面:

 1 {% load tags %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 7     <meta name="viewport" content="width=device-width, initial-scale=1">
 8     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
 9     <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
10     <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
11     {#    <link rel="stylesheet" href="/static/css/base.css/">#}
12     <title>Title</title>
13     <style>
14         .header {
15             width: 100%;
16             height: 50px;
17             background-color: #336699;
18         }
19 
20         .menu, .content {
21             float: left;
22         }
23 
24         .menu {
25             height: 780px;
26             background-color: darkgray;
27         }
28 
29         .hide {
30             display: none;
31         }
32 
33         .menu .title {
34             font-size: 16px;
35             color: #336699 !important;
36             margin: 20px 0;
37         }
38 
39         .con a {
40             margin-left: 30px;
41             color: white;
42         }
43 
44         .active {
45             color: red !important;
46         }
47     </style>
48 </head>
49 <body>
50 
51 <div class="header"></div>
52 
53 
54 <div class="box">
55 
56     <div class="row">
57         <div class="menu col-md-2">
58             {% get_menu request %}
59         </div>
60 
61 
62         <div class="content col-md-9">
63         {% block con %}
64 
65         {% endblock con %}
66         </div>
67 
68     </div>
69 
70 </div>
71 </body>
72 </html>
index

 

url总路由对应的login页面:

 1 {% load tags %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 7     <meta name="viewport" content="width=device-width, initial-scale=1">
 8     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
 9     <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
10     <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
11     {#    <link rel="stylesheet" href="/static/css/base.css/">#}
12     <title>Title</title>
13     <style>
14         .header {
15             width: 100%;
16             height: 50px;
17             background-color: #336699;
18         }
19 
20         .menu, .content {
21             float: left;
22         }
23 
24         .menu {
25             height: 780px;
26             background-color: darkgray;
27         }
28 
29         .hide {
30             display: none;
31         }
32 
33         .menu .title {
34             font-size: 16px;
35             color: #336699 !important;
36             margin: 20px 0;
37         }
38 
39         .con a {
40             margin-left: 30px;
41             color: white;
42         }
43 
44         .active {
45             color: red !important;
46         }
47     </style>
48 </head>
49 <body>
50 
51 <div class="header"></div>
52 
53 
54 <div class="box">
55 
56     <div class="row">
57         <div class="menu col-md-2">
58             {% get_menu request %}
59         </div>
60 
61 
62         <div class="content col-md-9">
63         {% block con %}
64 
65         {% endblock con %}
66         </div>
67 
68     </div>
69 
70 </div>
71 </body>
72 </html>
login

 

permissionApp下面的个人客户页面:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7      <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
 8     <title>Title</title>
 9 </head>
10 <body>
11 
12 <h3>个人客户列表</h3>
13 
14 <div class="container">
15     <table class="table table-bordered table-striped">
16         <thead>
17         <tr>
18             <th>编号</th>
19             <th>姓名</th>
20             <th>性别</th>
21             <th>最后跟进日期</th>
22             <th>状态</th>
23         </tr>
24         </thead>
25         <tbody>
26         {% for customer_distrbute in customer_distrbute_list %}
27             <tr>
28             <td>{{ forloop.counter }}</td>
29             <td>{{ customer_distrbute.customer.name }}</td>
30             <td>{{ customer_distrbute.customer.get_gender_display }}</td>
31             <td>{{ customer_distrbute.customer.last_consult_date|date:"Y-m-d" }}</td>
32             <td>{{ customer_distrbute.get_status_display }}</td>
33             <td><a href="/stark/permissioncustomer/further_follow/{{ customer.pk }}">确认跟进</a></td>
34             </tr>
35         {% endfor %}
36         </tbody>
37     </table>
38 </div>
39 </body>
40 </html>
mine_customer

 

permissionApp下面的公共客户页面:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width, initial-scale=1">
 7      <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
 8     <title>Title</title>
 9 </head>
10 <body>
11 
12 <h3>公共客户列表</h3>
13 
14 <div class="container">
15     <table class="table table-bordered table-striped">
16         <thead>
17         <tr>
18             <th>编号</th>
19             <th>姓名</th>
20             <th>性别</th>
21             <th>最后跟进日期</th>
22             <th>当前课程顾问</th>
23             <th>操作</th>
24         </tr>
25         </thead>
26         <tbody>
27         {% for customer in customer_list %}
28             <tr>
29             <td>{{ forloop.counter }}</td>
30             <td>{{ customer.name }}</td>
31             <td>{{ customer.get_gender_display }}</td>
32             <td>{{ customer.last_consult_date|date:"Y-m-d" }}</td>
33             <td>{{ customer.consultant }}</td>
34             <td><a href="/stark/permissioncustomer/further_follow/{{ customer.pk }}">确认跟进</a></td>
35             </tr>
36         {% endfor %}
37         </tbody>
38     </table>
39 </div>
40 </body>
41 </html>
public_customer_HTML

 

 

静态文件配置:

from static.css

 1 .header {
 2     width: 100%;
 3     height: 50px;
 4     background-color: bisque;
 5 }
 6 
 7 .menu, .content {
 8     float: left;
 9 }
10 
11 .menu {
12     position:fixed;
13     top:50px;
14     left:0;
15     bottom:0;
16     width:200px;
17     /*height: 100vh;*/
18     background-color: lightgreen;
19 }
20 
21 .content {
22     position:fixed;
23     top:50px;
24     left:200px;
25     right:0;
26     bottom:0;
27     overflow:scroll;  /*这里的参数就是让我们的页面自动延展,不论鼠标滚轮如何滑动,页面都会自动延伸*/
28     /*height: 100vh;*/
29     background-color: palevioletred;
30 }
31 
32 .hide {
33     display: none;
34 }
35 
36 .menu .title {
37     font-size: 16px;
38     color: lightgreen;
39     margin: 20px 0;
40 }
41 
42 .con a {
43     margin-left: 30px;
44     color: black;
45 }
46 
47 .active {
48     color: orangered !important;
49 }
base.css

 

 1 .form-group .input_style input, select{
 2     display:block;
 3     width:100%;
 4     height:34px;
 5     padding:6px 12px;
 6     font-size:14px;
 7     line-height: 1.42857143;
 8     color:#555;
 9     background-color:#fff;
10     background-image:none;
11     border:1px solid #ccc;
12     border-radius:4px;
13     -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0, .075);
14     box-shadow:inset 0 1px rgba(0,0,0, .075);
15     -webkit-transition:border-color
16     ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
17     -o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;
18     transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
19 }
20 
21 .error{
22     color:red;
23 }
24 
25 .put_in{
26     position:relative
27 }
28 .pop_btn{
29     position:absolute;
30     top:45%;right:-24px;
31     /*vertical-align:2px;*/
32 }
33 .sign{
34     font-size:27px;
35 }
base.input.css

 

 1 .filter a {
 2         padding: 3px 6px;
 3         border: 1px solid #336699;
 4         color: white;
 5         background-color: pink;
 6     }
 7 
 8     .active {
 9         background-color: #336699 !important;
10         color: purple !important;
11     }
hello.css

 

  1 .xdsoft_datetimepicker {
  2     box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.506);
  3     background: #fff;
  4     border-bottom: 1px solid #bbb;
  5     border-left: 1px solid #ccc;
  6     border-right: 1px solid #ccc;
  7     border-top: 1px solid #ccc;
  8     color: #333;
  9     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
 10     padding: 8px;
 11     padding-left: 0;
 12     padding-top: 2px;
 13     position: absolute;
 14     z-index: 9999;
 15     -moz-box-sizing: border-box;
 16     box-sizing: border-box;
 17     display: none;
 18 }
 19 .xdsoft_datetimepicker.xdsoft_rtl {
 20     padding: 8px 0 8px 8px;
 21 }
 22 
 23 .xdsoft_datetimepicker iframe {
 24     position: absolute;
 25     left: 0;
 26     top: 0;
 27     width: 75px;
 28     height: 210px;
 29     background: transparent;
 30     border: none;
 31 }
 32 
 33 /*For IE8 or lower*/
 34 .xdsoft_datetimepicker button {
 35     border: none !important;
 36 }
 37 
 38 .xdsoft_noselect {
 39     -webkit-touch-callout: none;
 40     -webkit-user-select: none;
 41     -khtml-user-select: none;
 42     -moz-user-select: none;
 43     -ms-user-select: none;
 44     -o-user-select: none;
 45     user-select: none;
 46 }
 47 
 48 .xdsoft_noselect::selection { background: transparent }
 49 .xdsoft_noselect::-moz-selection { background: transparent }
 50 
 51 .xdsoft_datetimepicker.xdsoft_inline {
 52     display: inline-block;
 53     position: static;
 54     box-shadow: none;
 55 }
 56 
 57 .xdsoft_datetimepicker * {
 58     -moz-box-sizing: border-box;
 59     box-sizing: border-box;
 60     padding: 0;
 61     margin: 0;
 62 }
 63 
 64 .xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker {
 65     display: none;
 66 }
 67 
 68 .xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active {
 69     display: block;
 70 }
 71 
 72 .xdsoft_datetimepicker .xdsoft_datepicker {
 73     width: 224px;
 74     float: left;
 75     margin-left: 8px;
 76 }
 77 .xdsoft_datetimepicker.xdsoft_rtl .xdsoft_datepicker {
 78     float: right;
 79     margin-right: 8px;
 80     margin-left: 0;
 81 }
 82 
 83 .xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_datepicker {
 84     width: 256px;
 85 }
 86 
 87 .xdsoft_datetimepicker .xdsoft_timepicker {
 88     width: 58px;
 89     float: left;
 90     text-align: center;
 91     margin-left: 8px;
 92     margin-top: 0;
 93 }
 94 .xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker {
 95     float: right;
 96     margin-right: 8px;
 97     margin-left: 0;
 98 }
 99 
100 .xdsoft_datetimepicker .xdsoft_datepicker.active+.xdsoft_timepicker {
101     margin-top: 8px;
102     margin-bottom: 3px
103 }
104 
105 .xdsoft_datetimepicker .xdsoft_mounthpicker {
106     position: relative;
107     text-align: center;
108 }
109 
110 .xdsoft_datetimepicker .xdsoft_label i,
111 .xdsoft_datetimepicker .xdsoft_prev,
112 .xdsoft_datetimepicker .xdsoft_next,
113 .xdsoft_datetimepicker .xdsoft_today_button {
114     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NBRjI1NjM0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NBRjI1NjQ0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0FGMjU2MTQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0FGMjU2MjQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoNEP54AAAIOSURBVHja7Jq9TsMwEMcxrZD4WpBYeKUCe+kTMCACHZh4BFfHO/AAIHZGFhYkBBsSEqxsLCAgXKhbXYOTxh9pfJVP+qutnZ5s/5Lz2Y5I03QhWji2GIcgAokWgfCxNvcOCCGKqiSqhUp0laHOne05vdEyGMfkdxJDVjgwDlEQgYQBgx+ULJaWSXXS6r/ER5FBVR8VfGftTKcITNs+a1XpcFoExREIDF14AVIFxgQUS+h520cdud6wNkC0UBw6BCO/HoCYwBhD8QCkQ/x1mwDyD4plh4D6DDV0TAGyo4HcawLIBBSLDkHeH0Mg2yVP3l4TQMZQDDsEOl/MgHQqhMNuE0D+oBh0CIr8MAKyazBH9WyBuKxDWgbXfjNf32TZ1KWm/Ap1oSk/R53UtQ5xTh3LUlMmT8gt6g51Q9p+SobxgJQ/qmsfZhWywGFSl0yBjCLJCMgXail3b7+rumdVJ2YRss4cN+r6qAHDkPWjPjdJCF4n9RmAD/V9A/Wp4NQassDjwlB6XBiCxcJQWmZZb8THFilfy/lfrTvLghq2TqTHrRMTKNJ0sIhdo15RT+RpyWwFdY96UZ/LdQKBGjcXpcc1AlSFEfLmouD+1knuxBDUVrvOBmoOC/rEcN7OQxKVeJTCiAdUzUJhA2Oez9QTkp72OTVcxDcXY8iKNkxGAJXmJCOQwOa6dhyXsOa6XwEGAKdeb5ET3rQdAAAAAElFTkSuQmCC);
115 }
116 
117 .xdsoft_datetimepicker .xdsoft_label i {
118     opacity: 0.5;
119     background-position: -92px -19px;
120     display: inline-block;
121     width: 9px;
122     height: 20px;
123     vertical-align: middle;
124 }
125 
126 .xdsoft_datetimepicker .xdsoft_prev {
127     float: left;
128     background-position: -20px 0;
129 }
130 .xdsoft_datetimepicker .xdsoft_today_button {
131     float: left;
132     background-position: -70px 0;
133     margin-left: 5px;
134 }
135 
136 .xdsoft_datetimepicker .xdsoft_next {
137     float: right;
138     background-position: 0 0;
139 }
140 
141 .xdsoft_datetimepicker .xdsoft_next,
142 .xdsoft_datetimepicker .xdsoft_prev ,
143 .xdsoft_datetimepicker .xdsoft_today_button {
144     background-color: transparent;
145     background-repeat: no-repeat;
146     border: 0 none;
147     cursor: pointer;
148     display: block;
149     height: 30px;
150     opacity: 0.5;
151     -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
152     outline: medium none;
153     overflow: hidden;
154     padding: 0;
155     position: relative;
156     text-indent: 100%;
157     white-space: nowrap;
158     width: 20px;
159     min-width: 0;
160 }
161 
162 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev,
163 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next {
164     float: none;
165     background-position: -40px -15px;
166     height: 15px;
167     width: 30px;
168     display: block;
169     margin-left: 14px;
170     margin-top: 7px;
171 }
172 .xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_prev,
173 .xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_next {
174     float: none;
175     margin-left: 0;
176     margin-right: 14px;
177 }
178 
179 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev {
180     background-position: -40px 0;
181     margin-bottom: 7px;
182     margin-top: 0;
183 }
184 
185 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box {
186     height: 151px;
187     overflow: hidden;
188     border-bottom: 1px solid #ddd;
189 }
190 
191 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div {
192     background: #f5f5f5;
193     border-top: 1px solid #ddd;
194     color: #666;
195     font-size: 12px;
196     text-align: center;
197     border-collapse: collapse;
198     cursor: pointer;
199     border-bottom-width: 0;
200     height: 25px;
201     line-height: 25px;
202 }
203 
204 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div > div:first-child {
205     border-top-width: 0;
206 }
207 
208 .xdsoft_datetimepicker .xdsoft_today_button:hover,
209 .xdsoft_datetimepicker .xdsoft_next:hover,
210 .xdsoft_datetimepicker .xdsoft_prev:hover {
211     opacity: 1;
212     -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
213 }
214 
215 .xdsoft_datetimepicker .xdsoft_label {
216     display: inline;
217     position: relative;
218     z-index: 9999;
219     margin: 0;
220     padding: 5px 3px;
221     font-size: 14px;
222     line-height: 20px;
223     font-weight: bold;
224     background-color: #fff;
225     float: left;
226     width: 182px;
227     text-align: center;
228     cursor: pointer;
229 }
230 
231 .xdsoft_datetimepicker .xdsoft_label:hover>span {
232     text-decoration: underline;
233 }
234 
235 .xdsoft_datetimepicker .xdsoft_label:hover i {
236     opacity: 1.0;
237 }
238 
239 .xdsoft_datetimepicker .xdsoft_label > .xdsoft_select {
240     border: 1px solid #ccc;
241     position: absolute;
242     right: 0;
243     top: 30px;
244     z-index: 101;
245     display: none;
246     background: #fff;
247     max-height: 160px;
248     overflow-y: hidden;
249 }
250 
251 .xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect{ right: -7px }
252 .xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect{ right: 2px }
253 .xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
254     color: #fff;
255     background: #ff8000;
256 }
257 
258 .xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option {
259     padding: 2px 10px 2px 5px;
260     text-decoration: none !important;
261 }
262 
263 .xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
264     background: #33aaff;
265     box-shadow: #178fe5 0 1px 3px 0 inset;
266     color: #fff;
267     font-weight: 700;
268 }
269 
270 .xdsoft_datetimepicker .xdsoft_month {
271     width: 100px;
272     text-align: right;
273 }
274 
275 .xdsoft_datetimepicker .xdsoft_calendar {
276     clear: both;
277 }
278 
279 .xdsoft_datetimepicker .xdsoft_year{
280     width: 48px;
281     margin-left: 5px;
282 }
283 
284 .xdsoft_datetimepicker .xdsoft_calendar table {
285     border-collapse: collapse;
286     width: 100%;
287 
288 }
289 
290 .xdsoft_datetimepicker .xdsoft_calendar td > div {
291     padding-right: 5px;
292 }
293 
294 .xdsoft_datetimepicker .xdsoft_calendar th {
295     height: 25px;
296 }
297 
298 .xdsoft_datetimepicker .xdsoft_calendar td,.xdsoft_datetimepicker .xdsoft_calendar th {
299     width: 14.2857142%;
300     background: #f5f5f5;
301     border: 1px solid #ddd;
302     color: #666;
303     font-size: 12px;
304     text-align: right;
305     vertical-align: middle;
306     padding: 0;
307     border-collapse: collapse;
308     cursor: pointer;
309     height: 25px;
310 }
311 .xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar td,.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar th {
312     width: 12.5%;
313 }
314 
315 .xdsoft_datetimepicker .xdsoft_calendar th {
316     background: #f1f1f1;
317 }
318 
319 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today {
320     color: #33aaff;
321 }
322 
323 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_default {
324     background: #ffe9d2;
325     box-shadow: #ffb871 0 1px 4px 0 inset;
326     color: #000;
327 }
328 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_mint {
329     background: #c1ffc9;
330     box-shadow: #00dd1c 0 1px 4px 0 inset;
331     color: #000;
332 }
333 
334 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default,
335 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current,
336 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current {
337     background: #33aaff;
338     box-shadow: #178fe5 0 1px 3px 0 inset;
339     color: #fff;
340     font-weight: 700;
341 }
342 
343 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month,
344 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled,
345 .xdsoft_datetimepicker .xdsoft_time_box >div >div.xdsoft_disabled {
346     opacity: 0.5;
347     -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
348     cursor: default;
349 }
350 
351 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled {
352     opacity: 0.2;
353     -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
354 }
355 
356 .xdsoft_datetimepicker .xdsoft_calendar td:hover,
357 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div:hover {
358     color: #fff !important;
359     background: #ff8000 !important;
360     box-shadow: none !important;
361 }
362 
363 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current.xdsoft_disabled:hover,
364 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current.xdsoft_disabled:hover {
365     background: #33aaff !important;
366     box-shadow: #178fe5 0 1px 3px 0 inset !important;
367     color: #fff !important;
368 }
369 
370 .xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover,
371 .xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_disabled:hover {
372     color: inherit    !important;
373     background: inherit !important;
374     box-shadow: inherit !important;
375 }
376 
377 .xdsoft_datetimepicker .xdsoft_calendar th {
378     font-weight: 700;
379     text-align: center;
380     color: #999;
381     cursor: default;
382 }
383 
384 .xdsoft_datetimepicker .xdsoft_copyright {
385     color: #ccc !important;
386     font-size: 10px;
387     clear: both;
388     float: none;
389     margin-left: 8px;
390 }
391 
392 .xdsoft_datetimepicker .xdsoft_copyright a { color: #eee !important }
393 .xdsoft_datetimepicker .xdsoft_copyright a:hover { color: #aaa !important }
394 
395 .xdsoft_time_box {
396     position: relative;
397     border: 1px solid #ccc;
398 }
399 .xdsoft_scrollbar >.xdsoft_scroller {
400     background: #ccc !important;
401     height: 20px;
402     border-radius: 3px;
403 }
404 .xdsoft_scrollbar {
405     position: absolute;
406     width: 7px;
407     right: 0;
408     top: 0;
409     bottom: 0;
410     cursor: pointer;
411 }
412 .xdsoft_datetimepicker.xdsoft_rtl .xdsoft_scrollbar {
413     left: 0;
414     right: auto;
415 }
416 .xdsoft_scroller_box {
417     position: relative;
418 }
419 
420 .xdsoft_datetimepicker.xdsoft_dark {
421     box-shadow: 0 5px 15px -5px rgba(255, 255, 255, 0.506);
422     background: #000;
423     border-bottom: 1px solid #444;
424     border-left: 1px solid #333;
425     border-right: 1px solid #333;
426     border-top: 1px solid #333;
427     color: #ccc;
428 }
429 
430 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box {
431     border-bottom: 1px solid #222;
432 }
433 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div {
434     background: #0a0a0a;
435     border-top: 1px solid #222;
436     color: #999;
437 }
438 
439 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_label {
440     background-color: #000;
441 }
442 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select {
443     border: 1px solid #333;
444     background: #000;
445 }
446 
447 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
448     color: #000;
449     background: #007fff;
450 }
451 
452 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
453     background: #cc5500;
454     box-shadow: #b03e00 0 1px 3px 0 inset;
455     color: #000;
456 }
457 
458 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_label i,
459 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_prev,
460 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_next,
461 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_today_button {
462     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUExQUUzOTA0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUExQUUzOTE0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTFBRTM4RTQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTFBRTM4RjQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp0VxGEAAAIASURBVHja7JrNSgMxEMebtgh+3MSLr1T1Xn2CHoSKB08+QmR8Bx9A8e7RixdB9CKCoNdexIugxFlJa7rNZneTbLIpM/CnNLsdMvNjM8l0mRCiQ9Ye61IKCAgZAUnH+mU3MMZaHYChBnJUDzWOFZdVfc5+ZFLbrWDeXPwbxIqrLLfaeS0hEBVGIRQCEiZoHQwtlGSByCCdYBl8g8egTTAWoKQMRBRBcZxYlhzhKegqMOageErsCHVkk3hXIFooDgHB1KkHIHVgzKB4ADJQ/A1jAFmAYhkQqA5TOBtocrKrgXwQA8gcFIuAIO8sQSA7hidvPwaQGZSaAYHOUWJABhWWw2EMIH9QagQERU4SArJXo0ZZL18uvaxejXt/Em8xjVBXmvFr1KVm/AJ10tRe2XnraNqaJvKE3KHuUbfK1E+VHB0q40/y3sdQSxY4FHWeKJCunP8UyDdqJZenT3ntVV5jIYCAh20vT7ioP8tpf6E2lfEMwERe+whV1MHjwZB7PBiCxcGQWwKZKD62lfGNnP/1poFAA60T7rF1UgcKd2id3KDeUS+oLWV8DfWAepOfq00CgQabi9zjcgJVYVD7PVzQUAUGAQkbNJTBICDhgwYTjDYD6XeW08ZKh+A4pYkzenOxXUbvZcWz7E8ykRMnIHGX1XPl+1m2vPYpL+2qdb8CDAARlKFEz/ZVkAAAAABJRU5ErkJggg==);
463 }
464 
465 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td,
466 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
467     background: #0a0a0a;
468     border: 1px solid #222;
469     color: #999;
470 }
471 
472 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
473     background: #0e0e0e;
474 }
475 
476 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_today {
477     color: #cc5500;
478 }
479 
480 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_default {
481     background: #ffe9d2;
482     box-shadow: #ffb871 0 1px 4px 0 inset;
483     color:#000;
484 }
485 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_mint {
486     background: #c1ffc9;
487     box-shadow: #00dd1c 0 1px 4px 0 inset;
488     color:#000;
489 }
490 
491 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_default,
492 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_current,
493 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current {
494     background: #cc5500;
495     box-shadow: #b03e00 0 1px 3px 0 inset;
496     color: #000;
497 }
498 
499 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td:hover,
500 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div:hover {
501     color: #000 !important;
502     background: #007fff !important;
503 }
504 
505 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
506     color: #666;
507 }
508 
509 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright { color: #333 !important }
510 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a { color: #111 !important }
511 .xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a:hover { color: #555 !important }
512 
513 .xdsoft_dark .xdsoft_time_box {
514     border: 1px solid #333;
515 }
516 
517 .xdsoft_dark .xdsoft_scrollbar >.xdsoft_scroller {
518     background: #333 !important;
519 }
520 .xdsoft_datetimepicker .xdsoft_save_selected {
521     display: block;
522     border: 1px solid #dddddd !important;
523     margin-top: 5px;
524     width: 100%;
525     color: #454551;
526     font-size: 13px;
527 }
528 .xdsoft_datetimepicker .blue-gradient-button {
529     font-family: "museo-sans", "Book Antiqua", sans-serif;
530     font-size: 12px;
531     font-weight: 300;
532     color: #82878c;
533     height: 28px;
534     position: relative;
535     padding: 4px 17px 4px 33px;
536     border: 1px solid #d7d8da;
537     background: -moz-linear-gradient(top, #fff 0%, #f4f8fa 73%);
538     /* FF3.6+ */
539     background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(73%, #f4f8fa));
540     /* Chrome,Safari4+ */
541     background: -webkit-linear-gradient(top, #fff 0%, #f4f8fa 73%);
542     /* Chrome10+,Safari5.1+ */
543     background: -o-linear-gradient(top, #fff 0%, #f4f8fa 73%);
544     /* Opera 11.10+ */
545     background: -ms-linear-gradient(top, #fff 0%, #f4f8fa 73%);
546     /* IE10+ */
547     background: linear-gradient(to bottom, #fff 0%, #f4f8fa 73%);
548     /* W3C */
549     filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff', endColorstr='#f4f8fa',GradientType=0 );
550 /* IE6-9 */
551 }
552 .xdsoft_datetimepicker .blue-gradient-button:hover, .xdsoft_datetimepicker .blue-gradient-button:focus, .xdsoft_datetimepicker .blue-gradient-button:hover span, .xdsoft_datetimepicker .blue-gradient-button:focus span {
553   color: #454551;
554   background: -moz-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
555   /* FF3.6+ */
556   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4f8fa), color-stop(73%, #FFF));
557   /* Chrome,Safari4+ */
558   background: -webkit-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
559   /* Chrome10+,Safari5.1+ */
560   background: -o-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
561   /* Opera 11.10+ */
562   background: -ms-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
563   /* IE10+ */
564   background: linear-gradient(to bottom, #f4f8fa 0%, #FFF 73%);
565   /* W3C */
566   filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f8fa', endColorstr='#FFF',GradientType=0 );
567   /* IE6-9 */
568 }
jquery datetimepicker

 

1 body{
2     background-color: lightgrey;
3 }
4 .container{
5     padding-top:100px;
6 }
login.css

 

from static.js

 1 function hi(ret) {
 2     var ret = JSON.parse(ret);
 3     // console.log(ret);
 4 
 5     if (ret.state) {
 6 
 7         var ele_option = document.createElement("option");
 8         ele_option.value = ret.pk;
 9         ele_option.innerHTML = ret.text;
10         ele_option.selected = "selected";
11         console.log(ele_option);
12 
13         document.getElementById(ret.pop_id).appendChild(ele_option)
14     }
15     else{
16         console.log(ret.state)
17     }
18 }
add.js
1 function pop(url){
2     window.open(url,"","width=400,height=300,top=200,left=500")
3 }
base.js
1 $('#datetimepicker').datetimepicker({
2     format: "Y-m-d",
3     timepicker: false,//是否开启精确到小时按钮
4     todayButton: true,//是否开启返回今天的home键
5 });
6 
7 $.datetimepicker.setLocale('ch');//中文显示
datetimepicker_demo.js
1 $("#action-toggle").click(function(){
2     if($(this).prop("checked")){
3         $("tbody :checkbox").prop("checked",true);
4     }else{
5         $("tbody :checkbox").prop("checked",false);
6     }
7 });
hello.js

还有一个柱状图的配置文件,highcharts.js

  1 /*
  2  Highcharts JS v6.0.7 (2018-02-16)
  3 
  4  (c) 2009-2016 Torstein Honsi
  5 
  6  License: www.highcharts.com/license
  7 */
  8 (function(S,K){"object"===typeof module&&module.exports?module.exports=S.document?K(S):K:S.Highcharts=K(S)})("undefined"!==typeof window?window:this,function(S){var K=function(){var a="undefined"===typeof S?window:S,B=a.document,H=a.navigator&&a.navigator.userAgent||"",E=B&&B.createElementNS&&!!B.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,q=/(edge|msie|trident)/i.test(H)&&!a.opera,f=-1!==H.indexOf("Firefox"),l=-1!==H.indexOf("Chrome"),t=f&&4>parseInt(H.split("Firefox/")[1],
  9 10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highcharts",version:"6.0.7",deg2rad:2*Math.PI/360,doc:B,hasBidiBug:t,hasTouch:B&&void 0!==B.documentElement.ontouchstart,isMS:q,isWebKit:-1!==H.indexOf("AppleWebKit"),isFirefox:f,isChrome:l,isSafari:!l&&-1!==H.indexOf("Safari"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(H),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:E,win:a,marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){},
 10 charts:[]}}();(function(a){a.timers=[];var B=a.charts,H=a.doc,E=a.win;a.error=function(q,f){q=a.isNumber(q)?"Highcharts error #"+q+": www.highcharts.com/errors/"+q:q;if(f)throw Error(q);E.console&&console.log(q)};a.Fx=function(a,f,l){this.options=f;this.elem=a;this.prop=l};a.Fx.prototype={dSetter:function(){var a=this.paths[0],f=this.paths[1],l=[],t=this.now,n=a.length,v;if(1===t)l=this.toD;else if(n===f.length&&1>t)for(;n--;)v=parseFloat(a[n]),l[n]=isNaN(v)?f[n]:t*parseFloat(f[n]-v)+v;else l=f;this.elem.attr("d",
 11 l,null,!0)},update:function(){var a=this.elem,f=this.prop,l=this.now,t=this.options.step;if(this[f+"Setter"])this[f+"Setter"]();else a.attr?a.element&&a.attr(f,l,null,!0):a.style[f]=l+this.unit;t&&t.call(a,l,this)},run:function(q,f,l){var t=this,n=t.options,v=function(a){return v.stopped?!1:t.step(a)},u=E.requestAnimationFrame||function(a){setTimeout(a,13)},c=function(){for(var b=0;b<a.timers.length;b++)a.timers[b]()||a.timers.splice(b--,1);a.timers.length&&u(c)};q===f?(delete n.curAnim[this.prop],
 12 n.complete&&0===a.keys(n.curAnim).length&&n.complete.call(this.elem)):(this.startTime=+new Date,this.start=q,this.end=f,this.unit=l,this.now=this.start,this.pos=0,v.elem=this.elem,v.prop=this.prop,v()&&1===a.timers.push(v)&&u(c))},step:function(q){var f=+new Date,l,t=this.options,n=this.elem,v=t.complete,u=t.duration,c=t.curAnim;n.attr&&!n.element?q=!1:q||f>=u+this.startTime?(this.now=this.end,this.pos=1,this.update(),l=c[this.prop]=!0,a.objectEach(c,function(a){!0!==a&&(l=!1)}),l&&v&&v.call(n),q=
 13 !1):(this.pos=t.easing((f-this.startTime)/u),this.now=this.start+(this.end-this.start)*this.pos,this.update(),q=!0);return q},initPath:function(q,f,l){function t(a){var c,h;for(e=a.length;e--;)c="M"===a[e]||"L"===a[e],h=/[a-zA-Z]/.test(a[e+3]),c&&h&&a.splice(e+1,0,a[e+1],a[e+2],a[e+1],a[e+2])}function n(a,c){for(;a.length<h;){a[0]=c[h-a.length];var b=a.slice(0,d);[].splice.apply(a,[0,0].concat(b));p&&(b=a.slice(a.length-d),[].splice.apply(a,[a.length,0].concat(b)),e--)}a[0]="M"}function v(a,c){for(var b=
 14 (h-a.length)/d;0<b&&b--;)k=a.slice().splice(a.length/r-d,d*r),k[0]=c[h-d-b*d],m&&(k[d-6]=k[d-2],k[d-5]=k[d-1]),[].splice.apply(a,[a.length/r,0].concat(k)),p&&b--}f=f||"";var u,c=q.startX,b=q.endX,m=-1<f.indexOf("C"),d=m?7:3,h,k,e;f=f.split(" ");l=l.slice();var p=q.isArea,r=p?2:1,I;m&&(t(f),t(l));if(c&&b){for(e=0;e<c.length;e++)if(c[e]===b[0]){u=e;break}else if(c[0]===b[b.length-c.length+e]){u=e;I=!0;break}void 0===u&&(f=[])}f.length&&a.isNumber(u)&&(h=l.length+u*r*d,I?(n(f,l),v(l,f)):(n(l,f),v(f,
 15 l)));return[f,l]}};a.Fx.prototype.fillSetter=a.Fx.prototype.strokeSetter=function(){this.elem.attr(this.prop,a.color(this.start).tweenTo(a.color(this.end),this.pos),null,!0)};a.merge=function(){var q,f=arguments,l,t={},n=function(l,q){"object"!==typeof l&&(l={});a.objectEach(q,function(c,b){!a.isObject(c,!0)||a.isClass(c)||a.isDOMElement(c)?l[b]=q[b]:l[b]=n(l[b]||{},c)});return l};!0===f[0]&&(t=f[1],f=Array.prototype.slice.call(f,2));l=f.length;for(q=0;q<l;q++)t=n(t,f[q]);return t};a.pInt=function(a,
 16 f){return parseInt(a,f||10)};a.isString=function(a){return"string"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return"[object Array]"===a||"[object Array Iterator]"===a};a.isObject=function(q,f){return!!q&&"object"===typeof q&&(!f||!a.isArray(q))};a.isDOMElement=function(q){return a.isObject(q)&&"number"===typeof q.nodeType};a.isClass=function(q){var f=q&&q.constructor;return!(!a.isObject(q,!0)||a.isDOMElement(q)||!f||!f.name||"Object"===f.name)};a.isNumber=function(a){return"number"===
 17 typeof a&&!isNaN(a)&&Infinity>a&&-Infinity<a};a.erase=function(a,f){for(var l=a.length;l--;)if(a[l]===f){a.splice(l,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(q,f,l){var t;a.isString(f)?a.defined(l)?q.setAttribute(f,l):q&&q.getAttribute&&(t=q.getAttribute(f)):a.defined(f)&&a.isObject(f)&&a.objectEach(f,function(a,l){q.setAttribute(l,a)});return t};a.splat=function(q){return a.isArray(q)?q:[q]};a.syncTimeout=function(a,f,l){if(f)return setTimeout(a,f,l);a.call(0,
 18 l)};a.extend=function(a,f){var l;a||(a={});for(l in f)a[l]=f[l];return a};a.pick=function(){var a=arguments,f,l,t=a.length;for(f=0;f<t;f++)if(l=a[f],void 0!==l&&null!==l)return l};a.css=function(q,f){a.isMS&&!a.svg&&f&&void 0!==f.opacity&&(f.filter="alpha(opacity\x3d"+100*f.opacity+")");a.extend(q.style,f)};a.createElement=function(q,f,l,t,n){q=H.createElement(q);var v=a.css;f&&a.extend(q,f);n&&v(q,{padding:0,border:"none",margin:0});l&&v(q,l);t&&t.appendChild(q);return q};a.extendClass=function(q,
 19 f){var l=function(){};l.prototype=new q;a.extend(l.prototype,f);return l};a.pad=function(a,f,l){return Array((f||2)+1-String(a).length).join(l||0)+a};a.relativeLength=function(a,f,l){return/%$/.test(a)?f*parseFloat(a)/100+(l||0):parseFloat(a)};a.wrap=function(a,f,l){var t=a[f];a[f]=function(){var a=Array.prototype.slice.call(arguments),v=arguments,u=this;u.proceed=function(){t.apply(u,arguments.length?arguments:v)};a.unshift(t);a=l.apply(this,a);u.proceed=null;return a}};a.formatSingle=function(q,
 20 f,l){var t=/\.([0-9])/,n=a.defaultOptions.lang;/f$/.test(q)?(l=(l=q.match(t))?l[1]:-1,null!==f&&(f=a.numberFormat(f,l,n.decimalPoint,-1<q.indexOf(",")?n.thousandsSep:""))):f=(l||a.time).dateFormat(q,f);return f};a.format=function(q,f,l){for(var t="{",n=!1,v,u,c,b,m=[],d;q;){t=q.indexOf(t);if(-1===t)break;v=q.slice(0,t);if(n){v=v.split(":");u=v.shift().split(".");b=u.length;d=f;for(c=0;c<b;c++)d&&(d=d[u[c]]);v.length&&(d=a.formatSingle(v.join(":"),d,l));m.push(d)}else m.push(v);q=q.slice(t+1);t=(n=
 21 !n)?"}":"{"}m.push(q);return m.join("")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(q,f,l,t,n){var v,u=q;l=a.pick(l,1);v=q/l;f||(f=n?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===t&&(1===l?f=a.grep(f,function(a){return 0===a%1}):.1>=l&&(f=[1/l])));for(t=0;t<f.length&&!(u=f[t],n&&u*l>=q||!n&&v<=(f[t]+(f[t+1]||f[t]))/2);t++);return u=a.correctFloat(u*l,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,f){var l=
 22 a.length,t,n;for(n=0;n<l;n++)a[n].safeI=n;a.sort(function(a,l){t=f(a,l);return 0===t?a.safeI-l.safeI:t});for(n=0;n<l;n++)delete a[n].safeI};a.arrayMin=function(a){for(var f=a.length,l=a[0];f--;)a[f]<l&&(l=a[f]);return l};a.arrayMax=function(a){for(var f=a.length,l=a[0];f--;)a[f]>l&&(l=a[f]);return l};a.destroyObjectProperties=function(q,f){a.objectEach(q,function(a,t){a&&a!==f&&a.destroy&&a.destroy();delete q[t]})};a.discardElement=function(q){var f=a.garbageBin;f||(f=a.createElement("div"));q&&f.appendChild(q);
 23 f.innerHTML=""};a.correctFloat=function(a,f){return parseFloat(a.toPrecision(f||14))};a.setAnimation=function(q,f){f.renderer.globalAnimation=a.pick(q,f.options.chart.animation,!0)};a.animObject=function(q){return a.isObject(q)?a.merge(q):{duration:q?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(q,f,l,t){q=+q||0;f=+f;var n=a.defaultOptions.lang,v=(q.toString().split(".")[1]||"").split("e")[0].length,u,
 24 c,b=q.toString().split("e");-1===f?f=Math.min(v,20):a.isNumber(f)?f&&b[1]&&0>b[1]&&(u=f+ +b[1],0<=u?(b[0]=(+b[0]).toExponential(u).split("e")[0],f=u):(b[0]=b[0].split(".")[0]||0,q=20>f?(b[0]*Math.pow(10,b[1])).toFixed(f):0,b[1]=0)):f=2;c=(Math.abs(b[1]?b[0]:q)+Math.pow(10,-Math.max(f,v)-1)).toFixed(f);v=String(a.pInt(c));u=3<v.length?v.length%3:0;l=a.pick(l,n.decimalPoint);t=a.pick(t,n.thousandsSep);q=(0>q?"-":"")+(u?v.substr(0,u)+t:"");q+=v.substr(u).replace(/(\d{3})(?=\d)/g,"$1"+t);f&&(q+=l+c.slice(-f));
 25 b[1]&&0!==+q&&(q+="e"+b[1]);return q};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(q,f,l){if("width"===f)return Math.min(q.offsetWidth,q.scrollWidth)-a.getStyle(q,"padding-left")-a.getStyle(q,"padding-right");if("height"===f)return Math.min(q.offsetHeight,q.scrollHeight)-a.getStyle(q,"padding-top")-a.getStyle(q,"padding-bottom");E.getComputedStyle||a.error(27,!0);if(q=E.getComputedStyle(q,void 0))q=q.getPropertyValue(f),a.pick(l,"opacity"!==f)&&(q=a.pInt(q));
 26 return q};a.inArray=function(q,f){return(a.indexOfPolyfill||Array.prototype.indexOf).call(f,q)};a.grep=function(q,f){return(a.filterPolyfill||Array.prototype.filter).call(q,f)};a.find=Array.prototype.find?function(a,f){return a.find(f)}:function(a,f){var l,t=a.length;for(l=0;l<t;l++)if(f(a[l],l))return a[l]};a.map=function(a,f){for(var l=[],t=0,n=a.length;t<n;t++)l[t]=f.call(a[t],a[t],t,a);return l};a.keys=function(q){return(a.keysPolyfill||Object.keys).call(void 0,q)};a.reduce=function(q,f,l){return(a.reducePolyfill||
 27 Array.prototype.reduce).call(q,f,l)};a.offset=function(a){var f=H.documentElement;a=a.parentElement?a.getBoundingClientRect():{top:0,left:0};return{top:a.top+(E.pageYOffset||f.scrollTop)-(f.clientTop||0),left:a.left+(E.pageXOffset||f.scrollLeft)-(f.clientLeft||0)}};a.stop=function(q,f){for(var l=a.timers.length;l--;)a.timers[l].elem!==q||f&&f!==a.timers[l].prop||(a.timers[l].stopped=!0)};a.each=function(q,f,l){return(a.forEachPolyfill||Array.prototype.forEach).call(q,f,l)};a.objectEach=function(a,
 28 f,l){for(var t in a)a.hasOwnProperty(t)&&f.call(l,a[t],t,a)};a.isPrototype=function(q){return q===a.Axis.prototype||q===a.Chart.prototype||q===a.Point.prototype||q===a.Series.prototype||q===a.Tick.prototype};a.addEvent=function(q,f,l){var t,n=q.addEventListener||a.addEventListenerPolyfill;t=a.isPrototype(q)?"protoEvents":"hcEvents";t=q[t]=q[t]||{};n&&n.call(q,f,l,!1);t[f]||(t[f]=[]);t[f].push(l);return function(){a.removeEvent(q,f,l)}};a.removeEvent=function(q,f,l){function t(c,b){var m=q.removeEventListener||
 29 a.removeEventListenerPolyfill;m&&m.call(q,c,b,!1)}function n(c){var b,m;q.nodeName&&(f?(b={},b[f]=!0):b=c,a.objectEach(b,function(a,h){if(c[h])for(m=c[h].length;m--;)t(h,c[h][m])}))}var v,u;a.each(["protoEvents","hcEvents"],function(c){var b=q[c];b&&(f?(v=b[f]||[],l?(u=a.inArray(l,v),-1<u&&(v.splice(u,1),b[f]=v),t(f,l)):(n(b),b[f]=[])):(n(b),q[c]={}))})};a.fireEvent=function(q,f,l,t){var n,v,u,c,b;l=l||{};H.createEvent&&(q.dispatchEvent||q.fireEvent)?(n=H.createEvent("Events"),n.initEvent(f,!0,!0),
 30 a.extend(n,l),q.dispatchEvent?q.dispatchEvent(n):q.fireEvent(f,n)):a.each(["protoEvents","hcEvents"],function(m){if(q[m])for(v=q[m][f]||[],u=v.length,l.target||a.extend(l,{preventDefault:function(){l.defaultPrevented=!0},target:q,type:f}),c=0;c<u;c++)(b=v[c])&&!1===b.call(q,l)&&l.preventDefault()});t&&!l.defaultPrevented&&t(l)};a.animate=function(q,f,l){var t,n="",v,u,c;a.isObject(l)||(c=arguments,l={duration:c[2],easing:c[3],complete:c[4]});a.isNumber(l.duration)||(l.duration=400);l.easing="function"===
 31 typeof l.easing?l.easing:Math[l.easing]||Math.easeInOutSine;l.curAnim=a.merge(f);a.objectEach(f,function(c,m){a.stop(q,m);u=new a.Fx(q,l,m);v=null;"d"===m?(u.paths=u.initPath(q,q.d,f.d),u.toD=f.d,t=0,v=1):q.attr?t=q.attr(m):(t=parseFloat(a.getStyle(q,m))||0,"opacity"!==m&&(n="px"));v||(v=c);v&&v.match&&v.match("px")&&(v=v.replace(/px/g,""));u.run(t,v,n)})};a.seriesType=function(q,f,l,t,n){var v=a.getOptions(),u=a.seriesTypes;v.plotOptions[q]=a.merge(v.plotOptions[f],l);u[q]=a.extendClass(u[f]||function(){},
 32 t);u[q].prototype.type=q;n&&(u[q].prototype.pointClass=a.extendClass(a.Point,n));return u[q]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),f=0;return function(){return"highcharts-"+a+"-"+f++}}();E.jQuery&&(E.jQuery.fn.highcharts=function(){var q=[].slice.call(arguments);if(this[0])return q[0]?(new (a[a.isString(q[0])?q.shift():"Chart"])(this[0],q[0],q[1]),this):B[a.attr(this[0],"data-highcharts-chart")]})})(K);(function(a){var B=a.each,H=a.isNumber,E=a.map,q=a.merge,f=a.pInt;
 33 a.Color=function(l){if(!(this instanceof a.Color))return new a.Color(l);this.init(l)};a.Color.prototype={parsers:[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[f(a[1]),f(a[2]),f(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[f(a[1]),f(a[2]),f(a[3]),1]}}],names:{none:"rgba(255,255,255,0)",white:"#ffffff",black:"#000000"},init:function(l){var f,
 34 n,v,u;if((this.input=l=this.names[l&&l.toLowerCase?l.toLowerCase():""]||l)&&l.stops)this.stops=E(l.stops,function(c){return new a.Color(c[1])});else if(l&&l.charAt&&"#"===l.charAt()&&(f=l.length,l=parseInt(l.substr(1),16),7===f?n=[(l&16711680)>>16,(l&65280)>>8,l&255,1]:4===f&&(n=[(l&3840)>>4|(l&3840)>>8,(l&240)>>4|l&240,(l&15)<<4|l&15,1])),!n)for(v=this.parsers.length;v--&&!n;)u=this.parsers[v],(f=u.regex.exec(l))&&(n=u.parse(f));this.rgba=n||[]},get:function(a){var l=this.input,n=this.rgba,v;this.stops?
 35 (v=q(l),v.stops=[].concat(v.stops),B(this.stops,function(n,c){v.stops[c]=[v.stops[c][0],n.get(a)]})):v=n&&H(n[0])?"rgb"===a||!a&&1===n[3]?"rgb("+n[0]+","+n[1]+","+n[2]+")":"a"===a?n[3]:"rgba("+n.join(",")+")":l;return v},brighten:function(a){var l,n=this.rgba;if(this.stops)B(this.stops,function(n){n.brighten(a)});else if(H(a)&&0!==a)for(l=0;3>l;l++)n[l]+=f(255*a),0>n[l]&&(n[l]=0),255<n[l]&&(n[l]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this},tweenTo:function(a,f){var n=this.rgba,
 36 l=a.rgba;l.length&&n&&n.length?(a=1!==l[3]||1!==n[3],f=(a?"rgba(":"rgb(")+Math.round(l[0]+(n[0]-l[0])*(1-f))+","+Math.round(l[1]+(n[1]-l[1])*(1-f))+","+Math.round(l[2]+(n[2]-l[2])*(1-f))+(a?","+(l[3]+(n[3]-l[3])*(1-f)):"")+")"):f=a.input||"none";return f}};a.color=function(l){return new a.Color(l)}})(K);(function(a){var B,H,E=a.addEvent,q=a.animate,f=a.attr,l=a.charts,t=a.color,n=a.css,v=a.createElement,u=a.defined,c=a.deg2rad,b=a.destroyObjectProperties,m=a.doc,d=a.each,h=a.extend,k=a.erase,e=a.grep,
 37 p=a.hasTouch,r=a.inArray,I=a.isArray,z=a.isFirefox,M=a.isMS,D=a.isObject,C=a.isString,x=a.isWebKit,F=a.merge,A=a.noop,J=a.objectEach,G=a.pick,g=a.pInt,w=a.removeEvent,L=a.stop,P=a.svg,N=a.SVG_NS,O=a.symbolSizes,R=a.win;B=a.SVGElement=function(){return this};h(B.prototype,{opacity:1,SVG_NS:N,textProps:"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),init:function(a,g){this.element="span"===g?v(g):m.createElementNS(this.SVG_NS,
 38 g);this.renderer=a},animate:function(y,g,c){g=a.animObject(G(g,this.renderer.globalAnimation,!0));0!==g.duration?(c&&(g.complete=c),q(this,y,g)):(this.attr(y,null,c),g.step&&g.step.call(this));return this},colorGradient:function(y,g,c){var w=this.renderer,h,b,e,k,p,Q,x,N,m,A,r=[],P;y.radialGradient?b="radialGradient":y.linearGradient&&(b="linearGradient");b&&(e=y[b],p=w.gradients,x=y.stops,A=c.radialReference,I(e)&&(y[b]=e={x1:e[0],y1:e[1],x2:e[2],y2:e[3],gradientUnits:"userSpaceOnUse"}),"radialGradient"===
 39 b&&A&&!u(e.gradientUnits)&&(k=e,e=F(e,w.getRadialAttr(A,k),{gradientUnits:"userSpaceOnUse"})),J(e,function(a,y){"id"!==y&&r.push(y,a)}),J(x,function(a){r.push(a)}),r=r.join(","),p[r]?A=p[r].attr("id"):(e.id=A=a.uniqueKey(),p[r]=Q=w.createElement(b).attr(e).add(w.defs),Q.radAttr=k,Q.stops=[],d(x,function(y){0===y[1].indexOf("rgba")?(h=a.color(y[1]),N=h.get("rgb"),m=h.get("a")):(N=y[1],m=1);y=w.createElement("stop").attr({offset:y[0],"stop-color":N,"stop-opacity":m}).add(Q);Q.stops.push(y)})),P="url("+
 40 w.url+"#"+A+")",c.setAttribute(g,P),c.gradient=r,y.toString=function(){return P})},applyTextOutline:function(y){var g=this.element,c,w,h,e,b;-1!==y.indexOf("contrast")&&(y=y.replace(/contrast/g,this.renderer.getContrast(g.style.fill)));y=y.split(" ");w=y[y.length-1];if((h=y[0])&&"none"!==h&&a.svg){this.fakeTS=!0;y=[].slice.call(g.getElementsByTagName("tspan"));this.ySetter=this.xSetter;h=h.replace(/(^[\d\.]+)(.*?)$/g,function(a,y,g){return 2*y+g});for(b=y.length;b--;)c=y[b],"highcharts-text-outline"===
 41 c.getAttribute("class")&&k(y,g.removeChild(c));e=g.firstChild;d(y,function(a,y){0===y&&(a.setAttribute("x",g.getAttribute("x")),y=g.getAttribute("y"),a.setAttribute("y",y||0),null===y&&g.setAttribute("y",0));a=a.cloneNode(1);f(a,{"class":"highcharts-text-outline",fill:w,stroke:w,"stroke-width":h,"stroke-linejoin":"round"});g.insertBefore(a,e)})}},attr:function(a,g,c,w){var y,h=this.element,b,e=this,d,k;"string"===typeof a&&void 0!==g&&(y=a,a={},a[y]=g);"string"===typeof a?e=(this[a+"Getter"]||this._defaultGetter).call(this,
 42 a,h):(J(a,function(y,g){d=!1;w||L(this,g);this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(g)&&(b||(this.symbolAttr(a),b=!0),d=!0);!this.rotation||"x"!==g&&"y"!==g||(this.doTransform=!0);d||(k=this[g+"Setter"]||this._defaultSetter,k.call(this,y,g,h),this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(g)&&this.updateShadows(g,y,k))},this),this.afterSetters());c&&c.call(this);return e},afterSetters:function(){this.doTransform&&(this.updateTransform(),
 43 this.doTransform=!1)},updateShadows:function(a,g,c){for(var y=this.shadows,w=y.length;w--;)c.call(y[w],"height"===a?Math.max(g-(y[w].cutHeight||0),0):"d"===a?this.d:g,a,y[w])},addClass:function(a,g){var y=this.attr("class")||"";-1===y.indexOf(a)&&(g||(a=(y+(y?" ":"")+a).replace("  "," ")),this.attr("class",a));return this},hasClass:function(a){return-1!==r(a,(this.attr("class")||"").split(" "))},removeClass:function(a){return this.attr("class",(this.attr("class")||"").replace(a,""))},symbolAttr:function(a){var y=
 44 this;d("x y r start end width height innerR anchorX anchorY".split(" "),function(g){y[g]=G(a[g],y[g])});y.attr({d:y.renderer.symbols[y.symbolName](y.x,y.y,y.width,y.height,y)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":"none")},crisp:function(a,g){var y;g=g||a.strokeWidth||0;y=Math.round(g)%2/2;a.x=Math.floor(a.x||this.x||0)+y;a.y=Math.floor(a.y||this.y||0)+y;a.width=Math.floor((a.width||this.width||0)-2*y);a.height=Math.floor((a.height||this.height||0)-
 45 2*y);u(a.strokeWidth)&&(a.strokeWidth=g);return a},css:function(a){var y=this.styles,c={},w=this.element,b,e="",d,k=!y,p=["textOutline","textOverflow","width"];a&&a.color&&(a.fill=a.color);y&&J(a,function(a,g){a!==y[g]&&(c[g]=a,k=!0)});k&&(y&&(a=h(y,c)),b=this.textWidth=a&&a.width&&"auto"!==a.width&&"text"===w.nodeName.toLowerCase()&&g(a.width),this.styles=a,b&&!P&&this.renderer.forExport&&delete a.width,w.namespaceURI===this.SVG_NS?(d=function(a,y){return"-"+y.toLowerCase()},J(a,function(a,y){-1===
 46 r(y,p)&&(e+=y.replace(/([A-Z])/g,d)+":"+a+";")}),e&&f(w,"style",e)):n(w,a),this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline)));return this},strokeWidth:function(){return this["stroke-width"]||0},on:function(a,g){var y=this,c=y.element;p&&"click"===a?(c.ontouchstart=function(a){y.touchEventFired=Date.now();a.preventDefault();g.call(c,a)},c.onclick=function(a){(-1===R.navigator.userAgent.indexOf("Android")||1100<Date.now()-
 47 (y.touchEventFired||0))&&g.call(c,a)}):c["on"+a]=g;return this},setRadialReference:function(a){var y=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;y&&y.radAttr&&y.animate(this.renderer.getRadialAttr(a,y.radAttr));return this},translate:function(a,g){return this.attr({translateX:a,translateY:g})},invert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,g=this.translateY||0,c=this.scaleX,w=this.scaleY,
 48 h=this.inverted,e=this.rotation,b=this.matrix,d=this.element;h&&(a+=this.width,g+=this.height);a=["translate("+a+","+g+")"];u(b)&&a.push("matrix("+b.join(",")+")");h?a.push("rotate(90) scale(-1,1)"):e&&a.push("rotate("+e+" "+G(this.rotationOriginX,d.getAttribute("x"),0)+" "+G(this.rotationOriginY,d.getAttribute("y")||0)+")");(u(c)||u(w))&&a.push("scale("+G(c,1)+" "+G(w,1)+")");a.length&&d.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},
 49 align:function(a,g,c){var y,w,h,e,d={};w=this.renderer;h=w.alignedObjects;var b,p;if(a){if(this.alignOptions=a,this.alignByTranslate=g,!c||C(c))this.alignTo=y=c||"renderer",k(h,this),h.push(this),c=null}else a=this.alignOptions,g=this.alignByTranslate,y=this.alignTo;c=G(c,w[y],w);y=a.align;w=a.verticalAlign;h=(c.x||0)+(a.x||0);e=(c.y||0)+(a.y||0);"right"===y?b=1:"center"===y&&(b=2);b&&(h+=(c.width-(a.width||0))/b);d[g?"translateX":"x"]=Math.round(h);"bottom"===w?p=1:"middle"===w&&(p=2);p&&(e+=(c.height-
 50 (a.height||0))/p);d[g?"translateY":"y"]=Math.round(e);this[this.placed?"animate":"attr"](d);this.placed=!0;this.alignAttr=d;return this},getBBox:function(a,g){var y,w=this.renderer,b,e=this.element,k=this.styles,p,x=this.textStr,N,m=w.cache,A=w.cacheKeys,F;g=G(g,this.rotation);b=g*c;p=k&&k.fontSize;u(x)&&(F=x.toString(),-1===F.indexOf("\x3c")&&(F=F.replace(/[0-9]/g,"0")),F+=["",g||0,p,k&&k.width,k&&k.textOverflow].join());F&&!a&&(y=m[F]);if(!y){if(e.namespaceURI===this.SVG_NS||w.forExport){try{(N=
 51 this.fakeTS&&function(a){d(e.querySelectorAll(".highcharts-text-outline"),function(y){y.style.display=a})})&&N("none"),y=e.getBBox?h({},e.getBBox()):{width:e.offsetWidth,height:e.offsetHeight},N&&N("")}catch(W){}if(!y||0>y.width)y={width:0,height:0}}else y=this.htmlGetBBox();w.isSVG&&(a=y.width,w=y.height,k&&"11px"===k.fontSize&&17===Math.round(w)&&(y.height=w=14),g&&(y.width=Math.abs(w*Math.sin(b))+Math.abs(a*Math.cos(b)),y.height=Math.abs(w*Math.cos(b))+Math.abs(a*Math.sin(b))));if(F&&0<y.height){for(;250<
 52 A.length;)delete m[A.shift()];m[F]||A.push(F);m[F]=y}}return y},show:function(a){return this.attr({visibility:a?"inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var y=this;y.animate({opacity:0},{duration:a||150,complete:function(){y.attr({y:-9999})}})},add:function(a){var y=this.renderer,g=this.element,c;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;void 0!==this.textStr&&y.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)c=
 53 this.zIndexSetter();c||(a?a.element:y.box).appendChild(g);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var y=a.parentNode;y&&y.removeChild(a)},destroy:function(){var a=this,g=a.element||{},c=a.renderer.isSVG&&"SPAN"===g.nodeName&&a.parentGroup,w=g.ownerSVGElement,h=a.clipPath;g.onclick=g.onmouseout=g.onmouseover=g.onmousemove=g.point=null;L(a);h&&w&&(d(w.querySelectorAll("[clip-path],[CLIP-PATH]"),function(a){var g=a.getAttribute("clip-path"),y=h.element.id;(-1<g.indexOf("(#"+
 54 y+")")||-1<g.indexOf('("#'+y+'")'))&&a.removeAttribute("clip-path")}),a.clipPath=h.destroy());if(a.stops){for(w=0;w<a.stops.length;w++)a.stops[w]=a.stops[w].destroy();a.stops=null}a.safeRemoveChild(g);for(a.destroyShadows();c&&c.div&&0===c.div.childNodes.length;)g=c.parentGroup,a.safeRemoveChild(c.div),delete c.div,c=g;a.alignTo&&k(a.renderer.alignedObjects,a);J(a,function(g,y){delete a[y]});return null},shadow:function(a,g,c){var y=[],w,h,e=this.element,b,d,k,p;if(!a)this.destroyShadows();else if(!this.shadows){d=
 55 G(a.width,3);k=(a.opacity||.15)/d;p=this.parentInverted?"(-1,-1)":"("+G(a.offsetX,1)+", "+G(a.offsetY,1)+")";for(w=1;w<=d;w++)h=e.cloneNode(0),b=2*d+1-2*w,f(h,{isShadow:"true",stroke:a.color||"#000000","stroke-opacity":k*w,"stroke-width":b,transform:"translate"+p,fill:"none"}),c&&(f(h,"height",Math.max(f(h,"height")-b,0)),h.cutHeight=b),g?g.element.appendChild(h):e.parentNode&&e.parentNode.insertBefore(h,e),y.push(h);this.shadows=y}return this},destroyShadows:function(){d(this.shadows||[],function(a){this.safeRemoveChild(a)},
 56 this);this.shadows=void 0},xGetter:function(a){"circle"===this.element.nodeName&&("x"===a?a="cx":"y"===a&&(a="cy"));return this._defaultGetter(a)},_defaultGetter:function(a){a=G(this[a+"Value"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,g,c){a&&a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");this[g]!==a&&(c.setAttribute(g,a),this[g]=a)},dashstyleSetter:function(a){var y,c=this["stroke-width"];"inherit"===
 57 c&&(c=1);if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(y=a.length;y--;)a[y]=g(a[y])*c;a=a.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.alignValue=a;this.element.setAttribute("text-anchor",{left:"start",center:"middle",
 58 right:"end"}[a])},opacitySetter:function(a,g,c){this[g]=a;c.setAttribute(g,a)},titleSetter:function(a){var g=this.element.getElementsByTagName("title")[0];g||(g=m.createElementNS(this.SVG_NS,"title"),this.element.appendChild(g));g.firstChild&&g.removeChild(g.firstChild);g.appendChild(m.createTextNode(String(G(a),"").replace(/<[^>]*>/g,"").replace(/&lt;/g,"\x3c").replace(/&gt;/g,"\x3e")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},
 59 fillSetter:function(a,g,c){"string"===typeof a?c.setAttribute(g,a):a&&this.colorGradient(a,g,c)},visibilitySetter:function(a,g,c){"inherit"===a?c.removeAttribute(g):this[g]!==a&&c.setAttribute(g,a);this[g]=a},zIndexSetter:function(a,c){var w=this.renderer,y=this.parentGroup,h=(y||w).element||w.box,e,b=this.element,d,k,w=h===w.box;e=this.added;var p;u(a)&&(b.zIndex=a,a=+a,this[c]===a&&(e=!1),this[c]=a);if(e){(a=this.zIndex)&&y&&(y.handleZ=!0);c=h.childNodes;for(p=c.length-1;0<=p&&!d;p--)if(y=c[p],
 60 e=y.zIndex,k=!u(e),y!==b)if(0>a&&k&&!w&&!p)h.insertBefore(b,c[p]),d=!0;else if(g(e)<=a||k&&(!u(a)||0<=a))h.insertBefore(b,c[p+1]||null),d=!0;d||(h.insertBefore(b,c[w?3:0]||null),d=!0)}return d},_defaultSetter:function(a,g,c){c.setAttribute(g,a)}});B.prototype.yGetter=B.prototype.xGetter;B.prototype.translateXSetter=B.prototype.translateYSetter=B.prototype.rotationSetter=B.prototype.verticalAlignSetter=B.prototype.rotationOriginXSetter=B.prototype.rotationOriginYSetter=B.prototype.scaleXSetter=B.prototype.scaleYSetter=
 61 B.prototype.matrixSetter=function(a,g){this[g]=a;this.doTransform=!0};B.prototype["stroke-widthSetter"]=B.prototype.strokeSetter=function(a,g,c){this[g]=a;this.stroke&&this["stroke-width"]?(B.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===g&&0===a&&this.hasStroke&&(c.removeAttribute("stroke"),this.hasStroke=!1)};H=a.SVGRenderer=function(){this.init.apply(this,arguments)};h(H.prototype,{Element:B,SVG_NS:N,
 62 init:function(a,g,c,w,h,e){var y;w=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(w));y=w.element;a.appendChild(y);f(a,"dir","ltr");-1===a.innerHTML.indexOf("xmlns")&&f(y,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=y;this.boxWrapper=w;this.alignedObjects=[];this.url=(z||x)&&m.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(m.createTextNode("Created with Highcharts 6.0.7"));
 63 this.defs=this.createElement("defs").add();this.allowHTML=e;this.forExport=h;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(g,c,!1);var b;z&&a.getBoundingClientRect&&(g=function(){n(a,{left:0,top:0});b=a.getBoundingClientRect();n(a,{left:Math.ceil(b.left)-b.left+"px",top:Math.ceil(b.top)-b.top+"px"})},g(),this.unSubPixelFix=E(R,"resize",g))},getStyle:function(a){return this.style=h({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},
 64 a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();b(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var g=new this.Element;g.init(this,a);return g},draw:A,getRadialAttr:function(a,g){return{cx:a[0]-a[2]/2+g.cx*a[2],cy:a[1]-
 65 a[2]/2+g.cy*a[2],r:g.r*a[2]}},getSpanWidth:function(a){return a.getBBox(!0).width},applyEllipsis:function(a,g,c,w){var h=a.rotation,y=c,b,e=0,d=c.length,k=function(a){g.removeChild(g.firstChild);a&&g.appendChild(m.createTextNode(a))},p;a.rotation=0;y=this.getSpanWidth(a,g);if(p=y>w){for(;e<=d;)b=Math.ceil((e+d)/2),y=c.substring(0,b)+"\u2026",k(y),y=this.getSpanWidth(a,g),e===d?e=d+1:y>w?d=b-1:e=b;0===d&&k("")}a.rotation=h;return p},escapes:{"\x26":"\x26amp;","\x3c":"\x26lt;","\x3e":"\x26gt;","'":"\x26#39;",
 66 '"':"\x26quot;"},buildText:function(a){var c=a.element,w=this,h=w.forExport,b=G(a.textStr,"").toString(),y=-1!==b.indexOf("\x3c"),k=c.childNodes,p,x,A,F,z=f(c,"x"),L=a.styles,O=a.textWidth,l=L&&L.lineHeight,D=L&&L.textOutline,C=L&&"ellipsis"===L.textOverflow,v=L&&"nowrap"===L.whiteSpace,u=L&&L.fontSize,M,t,I=k.length,L=O&&!a.added&&this.box,R=function(a){var h;h=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:u||w.style.fontSize||12;return l?g(l):w.fontMetrics(h,a.getAttribute("style")?a:c).h},
 67 q=function(a,g){J(w.escapes,function(c,w){g&&-1!==r(c,g)||(a=a.toString().replace(new RegExp(c,"g"),w))});return a};M=[b,C,v,l,D,u,O].join();if(M!==a.textCache){for(a.textCache=M;I--;)c.removeChild(k[I]);y||D||C||O||-1!==b.indexOf(" ")?(p=/<.*class="([^"]+)".*>/,x=/<.*style="([^"]+)".*>/,A=/<.*href="([^"]+)".*>/,L&&L.appendChild(c),b=y?b.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g,"\x3cspan").replace(/<\/(b|strong|i|em|a)>/g,
 68 "\x3c/span\x3e").split(/<br.*?>/g):[b],b=e(b,function(a){return""!==a}),d(b,function(g,b){var e,y=0;g=g.replace(/^\s+|\s+$/g,"").replace(/<span/g,"|||\x3cspan").replace(/<\/span>/g,"\x3c/span\x3e|||");e=g.split("|||");d(e,function(g){if(""!==g||1===e.length){var d={},k=m.createElementNS(w.SVG_NS,"tspan"),r,L;p.test(g)&&(r=g.match(p)[1],f(k,"class",r));x.test(g)&&(L=g.match(x)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),f(k,"style",L));A.test(g)&&!h&&(f(k,"onclick",'location.href\x3d"'+g.match(A)[1]+
 69 '"'),f(k,"class","highcharts-anchor"),n(k,{cursor:"pointer"}));g=q(g.replace(/<[a-zA-Z\/](.|\n)*?>/g,"")||" ");if(" "!==g){k.appendChild(m.createTextNode(g));y?d.dx=0:b&&null!==z&&(d.x=z);f(k,d);c.appendChild(k);!y&&t&&(!P&&h&&n(k,{display:"block"}),f(k,"dy",R(k)));if(O){d=g.replace(/([^\^])-/g,"$1- ").split(" ");r=1<e.length||b||1<d.length&&!v;var l=[],D,J=R(k),G=a.rotation;for(C&&(F=w.applyEllipsis(a,k,g,O));!C&&r&&(d.length||l.length);)a.rotation=0,D=w.getSpanWidth(a,k),g=D>O,void 0===F&&(F=g),
 70 g&&1!==d.length?(k.removeChild(k.firstChild),l.unshift(d.pop())):(d=l,l=[],d.length&&!v&&(k=m.createElementNS(N,"tspan"),f(k,{dy:J,x:z}),L&&f(k,"style",L),c.appendChild(k)),D>O&&(O=D)),d.length&&k.appendChild(m.createTextNode(d.join(" ").replace(/- /g,"-")));a.rotation=G}y++}}});t=t||c.childNodes.length}),F&&a.attr("title",q(a.textStr,["\x26lt;","\x26gt;"])),L&&L.removeChild(c),D&&a.applyTextOutline&&a.applyTextOutline(D)):c.appendChild(m.createTextNode(q(b)))}},getContrast:function(a){a=t(a).rgba;
 71 return 510<a[0]+a[1]+a[2]?"#000000":"#FFFFFF"},button:function(a,g,c,w,b,d,e,k,p){var y=this.label(a,g,c,p,null,null,null,null,"button"),x=0;y.attr(F({padding:8,r:2},b));var N,m,A,r;b=F({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1,style:{color:"#333333",cursor:"pointer",fontWeight:"normal"}},b);N=b.style;delete b.style;d=F(b,{fill:"#e6e6e6"},d);m=d.style;delete d.style;e=F(b,{fill:"#e6ebf5",style:{color:"#000000",fontWeight:"bold"}},e);A=e.style;delete e.style;k=F(b,{style:{color:"#cccccc"}},
 72 k);r=k.style;delete k.style;E(y.element,M?"mouseover":"mouseenter",function(){3!==x&&y.setState(1)});E(y.element,M?"mouseout":"mouseleave",function(){3!==x&&y.setState(x)});y.setState=function(a){1!==a&&(y.state=x=a);y.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][a||0]);y.attr([b,d,e,k][a||0]).css([N,m,A,r][a||0])};y.attr(b).css(h({cursor:"default"},N));return y.on("click",function(a){3!==x&&w.call(y,a)})},crispLine:function(a,
 73 g){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-g%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+g%2/2);return a},path:function(a){var g={fill:"none"};I(a)?g.d=a:D(a)&&h(g,a);return this.createElement("path").attr(g)},circle:function(a,g,c){a=D(a)?a:{x:a,y:g,r:c};g=this.createElement("circle");g.xSetter=g.ySetter=function(a,g,c){c.setAttribute("c"+g,a)};return g.attr(a)},arc:function(a,g,c,w,b,h){D(a)?(w=a,g=w.y,c=w.r,a=w.x):w={innerR:w,start:b,end:h};a=this.symbol("arc",a,g,c,c,w);a.r=c;return a},rect:function(a,
 74 g,c,w,b,h){b=D(a)?a.r:b;var d=this.createElement("rect");a=D(a)?a:void 0===a?{}:{x:a,y:g,width:Math.max(c,0),height:Math.max(w,0)};void 0!==h&&(a.strokeWidth=h,a=d.crisp(a));a.fill="none";b&&(a.r=b);d.rSetter=function(a,g,c){f(c,{rx:a,ry:a})};return d.attr(a)},setSize:function(a,g,c){var w=this.alignedObjects,b=w.length;this.width=a;this.height=g;for(this.boxWrapper.animate({width:a,height:g},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:G(c,!0)?
 75 void 0:0});b--;)w[b].align()},g:function(a){var g=this.createElement("g");return a?g.attr({"class":"highcharts-"+a}):g},image:function(a,g,c,w,b){var d={preserveAspectRatio:"none"};1<arguments.length&&h(d,{x:g,y:c,width:w,height:b});d=this.createElement("image").attr(d);d.element.setAttributeNS?d.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):d.element.setAttribute("hc-svg-href",a);return d},symbol:function(a,g,c,w,b,e){var k=this,p,y=/^url\((.*?)\)$/,x=y.test(a),N=!x&&(this.symbols[a]?
 76 a:"circle"),A=N&&this.symbols[N],F=u(g)&&A&&A.call(this.symbols,Math.round(g),Math.round(c),w,b,e),r,L;A?(p=this.path(F),p.attr("fill","none"),h(p,{symbolName:N,x:g,y:c,width:w,height:b}),e&&h(p,e)):x&&(r=a.match(y)[1],p=this.image(r),p.imgwidth=G(O[r]&&O[r].width,e&&e.width),p.imgheight=G(O[r]&&O[r].height,e&&e.height),L=function(){p.attr({width:p.width,height:p.height})},d(["width","height"],function(a){p[a+"Setter"]=function(a,g){var c={},w=this["img"+g],b="width"===g?"translateX":"translateY";
 77 this[g]=a;u(w)&&(this.element&&this.element.setAttribute(g,w),this.alignByTranslate||(c[b]=((this[g]||0)-w)/2,this.attr(c)))}}),u(g)&&p.attr({x:g,y:c}),p.isImg=!0,u(p.imgwidth)&&u(p.imgheight)?L():(p.attr({width:0,height:0}),v("img",{onload:function(){var a=l[k.chartIndex];0===this.width&&(n(this,{position:"absolute",top:"-999em"}),m.body.appendChild(this));O[r]={width:this.width,height:this.height};p.imgwidth=this.width;p.imgheight=this.height;p.element&&L();this.parentNode&&this.parentNode.removeChild(this);
 78 k.imgCount--;if(!k.imgCount&&a&&a.onload)a.onload()},src:r}),this.imgCount++));return p},symbols:{circle:function(a,g,c,w){return this.arc(a+c/2,g+w/2,c/2,w/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,g,c,w){return["M",a,g,"L",a+c,g,a+c,g+w,a,g+w,"Z"]},triangle:function(a,g,c,w){return["M",a+c/2,g,"L",a+c,g+w,a,g+w,"Z"]},"triangle-down":function(a,g,c,w){return["M",a,g,"L",a+c,g,a+c/2,g+w,"Z"]},diamond:function(a,g,c,w){return["M",a+c/2,g,"L",a+c,g+w/2,a+c/2,g+w,a,g+w/2,"Z"]},arc:function(a,
 79 g,c,w,b){var h=b.start,d=b.r||c,e=b.r||w||c,k=b.end-.001;c=b.innerR;w=G(b.open,.001>Math.abs(b.end-b.start-2*Math.PI));var p=Math.cos(h),y=Math.sin(h),x=Math.cos(k),k=Math.sin(k);b=.001>b.end-h-Math.PI?0:1;d=["M",a+d*p,g+e*y,"A",d,e,0,b,1,a+d*x,g+e*k];u(c)&&d.push(w?"M":"L",a+c*x,g+c*k,"A",c,c,0,b,0,a+c*p,g+c*y);d.push(w?"":"Z");return d},callout:function(a,g,c,w,b){var h=Math.min(b&&b.r||0,c,w),d=h+6,e=b&&b.anchorX;b=b&&b.anchorY;var k;k=["M",a+h,g,"L",a+c-h,g,"C",a+c,g,a+c,g,a+c,g+h,"L",a+c,g+w-
 80 h,"C",a+c,g+w,a+c,g+w,a+c-h,g+w,"L",a+h,g+w,"C",a,g+w,a,g+w,a,g+w-h,"L",a,g+h,"C",a,g,a,g,a+h,g];e&&e>c?b>g+d&&b<g+w-d?k.splice(13,3,"L",a+c,b-6,a+c+6,b,a+c,b+6,a+c,g+w-h):k.splice(13,3,"L",a+c,w/2,e,b,a+c,w/2,a+c,g+w-h):e&&0>e?b>g+d&&b<g+w-d?k.splice(33,3,"L",a,b+6,a-6,b,a,b-6,a,g+h):k.splice(33,3,"L",a,w/2,e,b,a,w/2,a,g+h):b&&b>w&&e>a+d&&e<a+c-d?k.splice(23,3,"L",e+6,g+w,e,g+w+6,e-6,g+w,a+h,g+w):b&&0>b&&e>a+d&&e<a+c-d&&k.splice(3,3,"L",e-6,g,e,g-6,e+6,g,c-h,g);return k}},clipRect:function(g,c,w,
 81 b){var h=a.uniqueKey(),d=this.createElement("clipPath").attr({id:h}).add(this.defs);g=this.rect(g,c,w,b,0).add(d);g.id=h;g.clipPath=d;g.count=0;return g},text:function(a,g,c,w){var b={};if(w&&(this.allowHTML||!this.forExport))return this.html(a,g,c);b.x=Math.round(g||0);c&&(b.y=Math.round(c));if(a||0===a)b.text=a;a=this.createElement("text").attr(b);w||(a.xSetter=function(a,g,c){var w=c.getElementsByTagName("tspan"),b,h=c.getAttribute(g),d;for(d=0;d<w.length;d++)b=w[d],b.getAttribute(g)===h&&b.setAttribute(g,
 82 a);c.setAttribute(g,a)});return a},fontMetrics:function(a,c){a=a||c&&c.style&&c.style.fontSize||this.style&&this.style.fontSize;a=/px/.test(a)?g(a):/em/.test(a)?parseFloat(a)*(c?this.fontMetrics(null,c.parentNode).f:16):12;c=24>a?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a,g,w){var b=a;g&&w&&(b=Math.max(b*Math.cos(g*c),4));return{x:-a/3*Math.sin(g*c),y:b}},label:function(g,c,b,e,k,p,x,N,m){var A=this,r=A.g("button"!==m&&"label"),y=r.text=A.text("",0,0,x).attr({zIndex:1}),
 83 L,P,z=0,O=3,l=0,n,D,f,J,C,G={},v,M,t=/^url\((.*?)\)$/.test(e),I=t,R,q,Q,T;m&&r.addClass("highcharts-"+m);I=t;R=function(){return(v||0)%2/2};q=function(){var a=y.element.style,g={};P=(void 0===n||void 0===D||C)&&u(y.textStr)&&y.getBBox();r.width=(n||P.width||0)+2*O+l;r.height=(D||P.height||0)+2*O;M=O+A.fontMetrics(a&&a.fontSize,y).b;I&&(L||(r.box=L=A.symbols[e]||t?A.symbol(e):A.rect(),L.addClass(("button"===m?"":"highcharts-label-box")+(m?" highcharts-"+m+"-box":"")),L.add(r),a=R(),g.x=a,g.y=(N?-M:
 84 0)+a),g.width=Math.round(r.width),g.height=Math.round(r.height),L.attr(h(g,G)),G={})};Q=function(){var a=l+O,g;g=N?0:M;u(n)&&P&&("center"===C||"right"===C)&&(a+={center:.5,right:1}[C]*(n-P.width));if(a!==y.x||g!==y.y)y.attr("x",a),void 0!==g&&y.attr("y",g);y.x=a;y.y=g};T=function(a,g){L?L.attr(a,g):G[a]=g};r.onAdd=function(){y.add(r);r.attr({text:g||0===g?g:"",x:c,y:b});L&&u(k)&&r.attr({anchorX:k,anchorY:p})};r.widthSetter=function(g){n=a.isNumber(g)?g:null};r.heightSetter=function(a){D=a};r["text-alignSetter"]=
 85 function(a){C=a};r.paddingSetter=function(a){u(a)&&a!==O&&(O=r.padding=a,Q())};r.paddingLeftSetter=function(a){u(a)&&a!==l&&(l=a,Q())};r.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,P&&r.attr({x:f}))};r.textSetter=function(a){void 0!==a&&y.textSetter(a);q();Q()};r["stroke-widthSetter"]=function(a,g){a&&(I=!0);v=this["stroke-width"]=a;T(g,a)};r.strokeSetter=r.fillSetter=r.rSetter=function(a,g){"r"!==g&&("fill"===g&&a&&(I=!0),r[g]=a);T(g,a)};r.anchorXSetter=function(a,g){k=r.anchorX=
 86 a;T(g,Math.round(a)-R()-f)};r.anchorYSetter=function(a,g){p=r.anchorY=a;T(g,a-J)};r.xSetter=function(a){r.x=a;z&&(a-=z*((n||P.width)+2*O));f=Math.round(a);r.attr("translateX",f)};r.ySetter=function(a){J=r.y=Math.round(a);r.attr("translateY",J)};var U=r.css;return h(r,{css:function(a){if(a){var g={};a=F(a);d(r.textProps,function(c){void 0!==a[c]&&(g[c]=a[c],delete a[c])});y.css(g)}return U.call(r,a)},getBBox:function(){return{width:P.width+2*O,height:P.height+2*O,x:P.x-O,y:P.y-O}},shadow:function(a){a&&
 87 (q(),L&&L.shadow(a));return r},destroy:function(){w(r.element,"mouseenter");w(r.element,"mouseleave");y&&(y=y.destroy());L&&(L=L.destroy());B.prototype.destroy.call(r);r=A=q=Q=T=null}})}});a.Renderer=H})(K);(function(a){var B=a.attr,H=a.createElement,E=a.css,q=a.defined,f=a.each,l=a.extend,t=a.isFirefox,n=a.isMS,v=a.isWebKit,u=a.pick,c=a.pInt,b=a.SVGRenderer,m=a.win,d=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var c=this.element;if(c=a&&"SPAN"===c.tagName&&a.width)delete a.width,this.textWidth=
 88 c,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);E(this.element,a);return this},htmlGetBBox:function(){var a=this.element;return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,d=this.translateX||0,p=this.translateY||0,r=this.x||0,m=this.y||0,z=this.textAlign||"left",l={left:0,center:.5,right:1}[z],n=this.styles,
 89 C=n&&n.whiteSpace;E(b,{marginLeft:d,marginTop:p});this.shadows&&f(this.shadows,function(a){E(a,{marginLeft:d+1,marginTop:p+1})});this.inverted&&f(b.childNodes,function(c){a.invertChild(c,b)});if("SPAN"===b.tagName){var n=this.rotation,x=this.textWidth&&c(this.textWidth),F=[n,z,b.innerHTML,this.textWidth,this.textAlign].join(),A;(A=x!==this.oldTextWidth)&&!(A=x>this.oldTextWidth)&&((A=this.textPxLength)||(E(b,{width:"",whiteSpace:C||"nowrap"}),A=b.offsetWidth),A=A>x);A&&/[ \-]/.test(b.textContent||
 90 b.innerText)&&(E(b,{width:x+"px",display:"block",whiteSpace:C||"normal"}),this.oldTextWidth=x);F!==this.cTT&&(C=a.fontMetrics(b.style.fontSize).b,q(n)&&n!==(this.oldRotation||0)&&this.setSpanRotation(n,l,C),this.getSpanCorrection(this.textPxLength||b.offsetWidth,C,l,n,z));E(b,{left:r+(this.xCorr||0)+"px",top:m+(this.yCorr||0)+"px"});this.cTT=F;this.oldRotation=n}}else this.alignOnAdd=!0},setSpanRotation:function(a,c,b){var d={},e=this.renderer.getTransformKey();d[e]=d.transform="rotate("+a+"deg)";
 91 d[e+(t?"Origin":"-origin")]=d.transformOrigin=100*c+"% "+b+"px";E(this.element,d)},getSpanCorrection:function(a,c,b){this.xCorr=-a*b;this.yCorr=-c}});l(b.prototype,{getTransformKey:function(){return n&&!/Edge/.test(m.navigator.userAgent)?"-ms-transform":v?"-webkit-transform":t?"MozTransform":m.opera?"-o-transform":""},html:function(a,c,b){var e=this.createElement("span"),h=e.element,k=e.renderer,m=k.isSVG,n=function(a,c){f(["opacity","visibility"],function(b){d(a,b+"Setter",function(a,b,e,d){a.call(this,
 92 b,e,d);c[e]=b})})};e.textSetter=function(a){a!==h.innerHTML&&delete this.bBox;this.textStr=a;h.innerHTML=u(a,"");e.doTransform=!0};m&&n(e,e.element.style);e.xSetter=e.ySetter=e.alignSetter=e.rotationSetter=function(a,c){"align"===c&&(c="textAlign");e[c]=a;e.doTransform=!0};e.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};e.attr({text:a,x:Math.round(c),y:Math.round(b)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});
 93 h.style.whiteSpace="nowrap";e.css=e.htmlCss;m&&(e.add=function(a){var c,b=k.box.parentNode,d=[];if(this.parentGroup=a){if(c=a.div,!c){for(;a;)d.push(a),a=a.parentGroup;f(d.reverse(),function(a){function h(g,c){a[c]=g;"translateX"===c?k.left=g+"px":k.top=g+"px";a.doTransform=!0}var k,g=B(a.element,"class");g&&(g={className:g});c=a.div=a.div||H("div",g,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},
 94 c||b);k=c.style;l(a,{classSetter:function(a){return function(g){this.element.setAttribute("class",g);a.className=g}}(c),on:function(){d[0].div&&e.on.apply({element:d[0].div},arguments);return a},translateXSetter:h,translateYSetter:h});n(a,k)})}}else c=b;c.appendChild(h);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e});return e}})})(K);(function(a){var B=a.defined,H=a.each,E=a.extend,q=a.merge,f=a.pick,l=a.timeUnits,t=a.win;a.Time=function(a){this.update(a,!1)};a.Time.prototype={defaultOptions:{},
 95 update:function(n){var l=f(n&&n.useUTC,!0),u=this;this.options=n=q(!0,this.options||{},n);this.Date=n.Date||t.Date;this.timezoneOffset=(this.useUTC=l)&&n.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();(this.variableTimezone=!(l&&!n.getTimezoneOffset&&!n.timezone))||this.timezoneOffset?(this.get=function(a,b){var c=b.getTime(),d=c-u.getTimezoneOffset(b);b.setTime(d);a=b["getUTC"+a]();b.setTime(c);return a},this.set=function(c,b,m){var d;if(-1!==a.inArray(c,["Milliseconds","Seconds",
 96 "Minutes"]))b["set"+c](m);else d=u.getTimezoneOffset(b),d=b.getTime()-d,b.setTime(d),b["setUTC"+c](m),c=u.getTimezoneOffset(b),d=b.getTime()+c,b.setTime(d)}):l?(this.get=function(a,b){return b["getUTC"+a]()},this.set=function(a,b,m){return b["setUTC"+a](m)}):(this.get=function(a,b){return b["get"+a]()},this.set=function(a,b,m){return b["set"+a](m)})},makeTime:function(l,v,u,c,b,m){var d,h,k;this.useUTC?(d=this.Date.UTC.apply(0,arguments),h=this.getTimezoneOffset(d),d+=h,k=this.getTimezoneOffset(d),
 97 h!==k?d+=k-h:h-36E5!==this.getTimezoneOffset(d-36E5)||a.isSafari||(d-=36E5)):d=(new this.Date(l,v,f(u,1),f(c,0),f(b,0),f(m,0))).getTime();return d},timezoneOffsetFunction:function(){var l=this,f=this.options,u=t.moment;if(!this.useUTC)return function(a){return 6E4*(new Date(a)).getTimezoneOffset()};if(f.timezone){if(u)return function(a){return 6E4*-u.tz(a,f.timezone).utcOffset()};a.error(25)}return this.useUTC&&f.getTimezoneOffset?function(a){return 6E4*f.getTimezoneOffset(a)}:function(){return 6E4*
 98 (l.timezoneOffset||0)}},dateFormat:function(l,f,u){if(!a.defined(f)||isNaN(f))return a.defaultOptions.lang.invalidDate||"";l=a.pick(l,"%Y-%m-%d %H:%M:%S");var c=this,b=new this.Date(f),m=this.get("Hours",b),d=this.get("Day",b),h=this.get("Date",b),k=this.get("Month",b),e=this.get("FullYear",b),p=a.defaultOptions.lang,r=p.weekdays,n=p.shortWeekdays,z=a.pad,b=a.extend({a:n?n[d]:r[d].substr(0,3),A:r[d],d:z(h),e:z(h,2," "),w:d,b:p.shortMonths[k],B:p.months[k],m:z(k+1),y:e.toString().substr(2,2),Y:e,H:z(m),
 99 k:m,I:z(m%12||12),l:m%12||12,M:z(c.get("Minutes",b)),p:12>m?"AM":"PM",P:12>m?"am":"pm",S:z(b.getSeconds()),L:z(Math.round(f%1E3),3)},a.dateFormats);a.objectEach(b,function(a,b){for(;-1!==l.indexOf("%"+b);)l=l.replace("%"+b,"function"===typeof a?a.call(c,f):a)});return u?l.substr(0,1).toUpperCase()+l.substr(1):l},getTimeTicks:function(a,v,u,c){var b=this,m=[],d={},h,k=new b.Date(v),e=a.unitRange,p=a.count||1,r;if(B(v)){b.set("Milliseconds",k,e>=l.second?0:p*Math.floor(b.get("Milliseconds",k)/p));e>=
100 l.second&&b.set("Seconds",k,e>=l.minute?0:p*Math.floor(b.get("Seconds",k)/p));e>=l.minute&&b.set("Minutes",k,e>=l.hour?0:p*Math.floor(b.get("Minutes",k)/p));e>=l.hour&&b.set("Hours",k,e>=l.day?0:p*Math.floor(b.get("Hours",k)/p));e>=l.day&&b.set("Date",k,e>=l.month?1:p*Math.floor(b.get("Date",k)/p));e>=l.month&&(b.set("Month",k,e>=l.year?0:p*Math.floor(b.get("Month",k)/p)),h=b.get("FullYear",k));e>=l.year&&b.set("FullYear",k,h-h%p);e===l.week&&b.set("Date",k,b.get("Date",k)-b.get("Day",k)+f(c,1));
101 h=b.get("FullYear",k);c=b.get("Month",k);var n=b.get("Date",k),z=b.get("Hours",k);v=k.getTime();b.variableTimezone&&(r=u-v>4*l.month||b.getTimezoneOffset(v)!==b.getTimezoneOffset(u));k=k.getTime();for(v=1;k<u;)m.push(k),k=e===l.year?b.makeTime(h+v*p,0):e===l.month?b.makeTime(h,c+v*p):!r||e!==l.day&&e!==l.week?r&&e===l.hour&&1<p?b.makeTime(h,c,n,z+v*p):k+e*p:b.makeTime(h,c,n+v*p*(e===l.day?1:7)),v++;m.push(k);e<=l.hour&&1E4>m.length&&H(m,function(a){0===a%18E5&&"000000000"===b.dateFormat("%H%M%S%L",
102 a)&&(d[a]="day")})}m.info=E(a,{higherRanks:d,totalRange:e*p});return m}}})(K);(function(a){var B=a.color,H=a.merge;a.defaultOptions={colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
103 weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:a.Time.prototype.defaultOptions,chart:{borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}},width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"},
104 title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},
105 shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",
106 day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",padding:8,snap:a.isTouchDevice?25:10,backgroundColor:B("#f7f7f7").setOpacity(.85).get(),borderWidth:1,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',shadow:!0,style:{color:"#333333",cursor:"default",fontSize:"12px",pointerEvents:"none",
107 whiteSpace:"nowrap"}},credits:{enabled:!0,href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};a.setOptions=function(B){a.defaultOptions=H(!0,a.defaultOptions,B);a.time.update(H(a.defaultOptions.global,a.defaultOptions.time),!1);return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;a.time=new a.Time(H(a.defaultOptions.global,
108 a.defaultOptions.time));a.dateFormat=function(B,q,f){return a.time.dateFormat(B,q,f)}})(K);(function(a){var B=a.correctFloat,H=a.defined,E=a.destroyObjectProperties,q=a.isNumber,f=a.merge,l=a.pick,t=a.deg2rad;a.Tick=function(a,l,f,c){this.axis=a;this.pos=l;this.type=f||"";this.isNewLabel=this.isNew=!0;f||c||this.addLabel()};a.Tick.prototype={addLabel:function(){var a=this.axis,v=a.options,u=a.chart,c=a.categories,b=a.names,m=this.pos,d=v.labels,h=a.tickPositions,k=m===h[0],e=m===h[h.length-1],b=c?
109 l(c[m],b[m],m):m,c=this.label,h=h.info,p;a.isDatetimeAxis&&h&&(p=v.dateTimeLabelFormats[h.higherRanks[m]||h.unitName]);this.isFirst=k;this.isLast=e;v=a.labelFormatter.call({axis:a,chart:u,isFirst:k,isLast:e,dateTimeLabelFormat:p,value:a.isLog?B(a.lin2log(b)):b,pos:m});if(H(c))c&&c.attr({text:v});else{if(this.label=c=H(v)&&d.enabled?u.renderer.text(v,0,0,d.useHTML).css(f(d.style)).add(a.labelGroup):null)c.textPxLength=c.getBBox().width;this.rotation=0}},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?
110 "height":"width"]:0},handleOverflow:function(a){var f=this.axis,n=f.options.labels,c=a.x,b=f.chart.chartWidth,m=f.chart.spacing,d=l(f.labelLeft,Math.min(f.pos,m[3])),m=l(f.labelRight,Math.max(f.isRadial?0:f.pos+f.len,b-m[1])),h=this.label,k=this.rotation,e={left:0,center:.5,right:1}[f.labelAlign||h.attr("align")],p=h.getBBox().width,r=f.getSlotWidth(),I=r,z=1,M,D={};if(k||!1===n.overflow)0>k&&c-e*p<d?M=Math.round(c/Math.cos(k*t)-d):0<k&&c+e*p>m&&(M=Math.round((b-c)/Math.cos(k*t)));else if(b=c+(1-
111 e)*p,c-e*p<d?I=a.x+I*(1-e)-d:b>m&&(I=m-a.x+I*e,z=-1),I=Math.min(r,I),I<r&&"center"===f.labelAlign&&(a.x+=z*(r-I-e*(r-Math.min(p,I)))),p>I||f.autoRotation&&(h.styles||{}).width)M=I;M&&(D.width=M,(n.style||{}).textOverflow||(D.textOverflow="ellipsis"),h.css(D))},getPosition:function(l,f,u,c){var b=this.axis,m=b.chart,d=c&&m.oldChartHeight||m.chartHeight;return{x:l?a.correctFloat(b.translate(f+u,null,null,c)+b.transB):b.left+b.offset+(b.opposite?(c&&m.oldChartWidth||m.chartWidth)-b.right-b.left:0),y:l?
112 d-b.bottom+b.offset-(b.opposite?b.height:0):a.correctFloat(d-b.translate(f+u,null,null,c)-b.transB)}},getLabelPosition:function(a,l,f,c,b,m,d,h){var k=this.axis,e=k.transA,p=k.reversed,r=k.staggerLines,n=k.tickRotCorr||{x:0,y:0},z=b.y,u=c||k.reserveSpaceDefault?0:-k.labelOffset*("center"===k.labelAlign?.5:1);H(z)||(z=0===k.side?f.rotation?-8:-f.getBBox().height:2===k.side?n.y+8:Math.cos(f.rotation*t)*(n.y-f.getBBox(!1,0).height/2));a=a+b.x+u+n.x-(m&&c?m*e*(p?-1:1):0);l=l+z-(m&&!c?m*e*(p?1:-1):0);
113 r&&(f=d/(h||1)%r,k.opposite&&(f=r-f-1),l+=k.labelOffset/r*f);return{x:a,y:Math.round(l)}},getMarkPath:function(a,l,f,c,b,m){return m.crispLine(["M",a,l,"L",a+(b?0:-f),l+(b?f:0)],c)},renderGridLine:function(a,l,f){var c=this.axis,b=c.options,m=this.gridLine,d={},h=this.pos,k=this.type,e=c.tickmarkOffset,p=c.chart.renderer,r=k?k+"Grid":"grid",n=b[r+"LineWidth"],z=b[r+"LineColor"],b=b[r+"LineDashStyle"];m||(d.stroke=z,d["stroke-width"]=n,b&&(d.dashstyle=b),k||(d.zIndex=1),a&&(d.opacity=0),this.gridLine=
114 m=p.path().attr(d).addClass("highcharts-"+(k?k+"-":"")+"grid-line").add(c.gridGroup));if(!a&&m&&(a=c.getPlotLinePath(h+e,m.strokeWidth()*f,a,!0)))m[this.isNew?"attr":"animate"]({d:a,opacity:l})},renderMark:function(a,f,u){var c=this.axis,b=c.options,m=c.chart.renderer,d=this.type,h=d?d+"Tick":"tick",k=c.tickSize(h),e=this.mark,p=!e,r=a.x;a=a.y;var n=l(b[h+"Width"],!d&&c.isXAxis?1:0),b=b[h+"Color"];k&&(c.opposite&&(k[0]=-k[0]),p&&(this.mark=e=m.path().addClass("highcharts-"+(d?d+"-":"")+"tick").add(c.axisGroup),
115 e.attr({stroke:b,"stroke-width":n})),e[p?"attr":"animate"]({d:this.getMarkPath(r,a,k[0],e.strokeWidth()*u,c.horiz,m),opacity:f}))},renderLabel:function(a,f,u,c){var b=this.axis,m=b.horiz,d=b.options,h=this.label,k=d.labels,e=k.step,b=b.tickmarkOffset,p=!0,r=a.x;a=a.y;h&&q(r)&&(h.xy=a=this.getLabelPosition(r,a,h,m,k,b,c,e),this.isFirst&&!this.isLast&&!l(d.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(d.showLastLabel,1)?p=!1:!m||k.step||k.rotation||f||0===u||this.handleOverflow(a),e&&c%e&&(p=!1),
116 p&&q(a.y)?(a.opacity=u,h[this.isNewLabel?"attr":"animate"](a),this.isNewLabel=!1):(h.attr("y",-9999),this.isNewLabel=!0))},render:function(f,t,u){var c=this.axis,b=c.horiz,m=this.getPosition(b,this.pos,c.tickmarkOffset,t),d=m.x,h=m.y,c=b&&d===c.pos+c.len||!b&&h===c.pos?-1:1;u=l(u,1);this.isActive=!0;this.renderGridLine(t,u,c);this.renderMark(m,u,c);this.renderLabel(m,t,u,f);this.isNew=!1;a.fireEvent(this,"afterRender")},destroy:function(){E(this,this.axis)}}})(K);var V=function(a){var B=a.addEvent,
117 H=a.animObject,E=a.arrayMax,q=a.arrayMin,f=a.color,l=a.correctFloat,t=a.defaultOptions,n=a.defined,v=a.deg2rad,u=a.destroyObjectProperties,c=a.each,b=a.extend,m=a.fireEvent,d=a.format,h=a.getMagnitude,k=a.grep,e=a.inArray,p=a.isArray,r=a.isNumber,I=a.isString,z=a.merge,M=a.normalizeTickInterval,D=a.objectEach,C=a.pick,x=a.removeEvent,F=a.splat,A=a.syncTimeout,J=a.Tick,G=function(){this.init.apply(this,arguments)};a.extend(G.prototype,{defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",
118 second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",minPadding:.01,startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",
119 lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{allowOverlap:!1,enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},
120 defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var g=c.isX,b=this;b.chart=a;b.horiz=a.inverted&&!b.isZAxis?!g:g;b.isXAxis=g;b.coll=b.coll||(g?"xAxis":"yAxis");b.opposite=c.opposite;b.side=c.side||(b.horiz?b.opposite?0:2:b.opposite?1:3);b.setOptions(c);var w=this.options,d=w.type;b.labelFormatter=w.labels.formatter||
121 b.defaultLabelFormatter;b.userOptions=c;b.minPixelPadding=0;b.reversed=w.reversed;b.visible=!1!==w.visible;b.zoomEnabled=!1!==w.zoomEnabled;b.hasNames="category"===d||!0===w.categories;b.categories=w.categories||b.hasNames;b.names||(b.names=[],b.names.keys={});b.plotLinesAndBandsGroups={};b.isLog="logarithmic"===d;b.isDatetimeAxis="datetime"===d;b.positiveValuesOnly=b.isLog&&!b.allowNegativeLog;b.isLinked=n(w.linkedTo);b.ticks={};b.labelEdge=[];b.minorTicks={};b.plotLinesAndBands=[];b.alternateBands=
122 {};b.len=0;b.minRange=b.userMinRange=w.minRange||w.maxZoom;b.range=w.range;b.offset=w.offset||0;b.stacks={};b.oldStacks={};b.stacksTouched=0;b.max=null;b.min=null;b.crosshair=C(w.crosshair,F(a.options.tooltip.crosshairs)[g?0:1],!1);c=b.options.events;-1===e(b,a.axes)&&(g?a.axes.splice(a.xAxis.length,0,b):a.axes.push(b),a[b.coll].push(b));b.series=b.series||[];a.inverted&&!b.isZAxis&&g&&void 0===b.reversed&&(b.reversed=!0);D(c,function(a,g){B(b,g,a)});b.lin2log=w.linearToLogConverter||b.lin2log;b.isLog&&
123 (b.val2lin=b.log2lin,b.lin2val=b.lin2log)},setOptions:function(a){this.options=z(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],z(t[this.coll],a))},defaultLabelFormatter:function(){var g=this.axis,c=this.value,b=g.chart.time,e=g.categories,h=this.dateTimeLabelFormat,k=t.lang,p=k.numericSymbols,k=k.numericSymbolMagnitude||1E3,x=p&&p.length,r,m=g.options.labels.format,
124 g=g.isLog?Math.abs(c):g.tickInterval;if(m)r=d(m,this,b);else if(e)r=c;else if(h)r=b.dateFormat(h,c);else if(x&&1E3<=g)for(;x--&&void 0===r;)b=Math.pow(k,x+1),g>=b&&0===10*c%b&&null!==p[x]&&0!==c&&(r=a.numberFormat(c/b,-1)+p[x]);void 0===r&&(r=1E4<=Math.abs(c)?a.numberFormat(c,-1):a.numberFormat(c,-1,void 0,""));return r},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();c(a.series,
125 function(g){if(g.visible||!b.options.chart.ignoreHiddenSeries){var c=g.options,w=c.threshold,d;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=w&&(w=null);if(a.isXAxis)c=g.xData,c.length&&(g=q(c),d=E(c),r(g)||g instanceof Date||(c=k(c,r),g=q(c),d=E(c)),c.length&&(a.dataMin=Math.min(C(a.dataMin,c[0],g),g),a.dataMax=Math.max(C(a.dataMax,c[0],d),d)));else if(g.getExtremes(),d=g.dataMax,g=g.dataMin,n(g)&&n(d)&&(a.dataMin=Math.min(C(a.dataMin,g),g),a.dataMax=Math.max(C(a.dataMax,d),d)),n(w)&&(a.threshold=
126 w),!c.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})},translate:function(a,c,b,d,e,h){var g=this.linkedParent||this,w=1,k=0,p=d?g.oldTransA:g.transA;d=d?g.oldMin:g.min;var x=g.minPixelPadding;e=(g.isOrdinal||g.isBroken||g.isLog&&e)&&g.lin2val;p||(p=g.transA);b&&(w*=-1,k=g.len);g.reversed&&(w*=-1,k-=w*(g.sector||g.len));c?(a=(a*w+k-x)/p+d,e&&(a=g.lin2val(a))):(e&&(a=g.val2lin(a)),a=r(d)?w*(a-d)*p+k+w*x+(r(h)?p*h:0):void 0);return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,
127 null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a-(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,c,b,d,e){var g=this.chart,w=this.left,h=this.top,k,p,x=b&&g.oldChartHeight||g.chartHeight,m=b&&g.oldChartWidth||g.chartWidth,N;k=this.transB;var A=function(a,g,c){if(a<g||a>c)d?a=Math.min(Math.max(g,a),c):N=!0;return a};e=C(e,this.translate(a,null,null,b));e=Math.min(Math.max(-1E5,e),1E5);a=b=Math.round(e+k);k=p=Math.round(x-e-k);r(e)?this.horiz?(k=h,p=x-this.bottom,
128 a=b=A(a,w,w+this.width)):(a=w,b=m-this.right,k=p=A(k,h,h+this.height)):(N=!0,d=!1);return N&&!d?null:g.renderer.crispLine(["M",a,k,"L",b,p],c||1)},getLinearTickPositions:function(a,c,b){var g,w=l(Math.floor(c/a)*a);b=l(Math.ceil(b/a)*a);var d=[],e;l(w+a)===w&&(e=20);if(this.single)return[c];for(c=w;c<=b;){d.push(c);c=l(c+a,e);if(c===g)break;g=c}return d},getMinorTickInterval:function(){var a=this.options;return!0===a.minorTicks?C(a.minorTickInterval,"auto"):!1===a.minorTicks?null:a.minorTickInterval},
129 getMinorTickPositions:function(){var a=this,b=a.options,d=a.tickPositions,e=a.minorTickInterval,h=[],k=a.pointRangePadding||0,p=a.min-k,k=a.max+k,x=k-p;if(x&&x/e<a.len/3)if(a.isLog)c(this.paddedTicks,function(g,c,b){c&&h.push.apply(h,a.getLogTickPositions(e,b[c-1],b[c],!0))});else if(a.isDatetimeAxis&&"auto"===this.getMinorTickInterval())h=h.concat(a.getTimeTicks(a.normalizeTimeTickInterval(e),p,k,b.startOfWeek));else for(b=p+(d[0]-p)%e;b<=k&&b!==h[0];b+=e)h.push(b);0!==h.length&&a.trimTicks(h);return h},
130 adjustForMinRange:function(){var a=this.options,b=this.min,d=this.max,e,h,k,p,x,r,m,A;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(n(a.min)||n(a.max)?this.minRange=null:(c(this.series,function(a){r=a.xData;for(p=m=a.xIncrement?1:r.length-1;0<p;p--)if(x=r[p]-r[p-1],void 0===k||x<k)k=x}),this.minRange=Math.min(5*k,this.dataMax-this.dataMin)));d-b<this.minRange&&(h=this.dataMax-this.dataMin>=this.minRange,A=this.minRange,e=(A-d+b)/2,e=[b-e,C(a.min,b-e)],h&&(e[2]=this.isLog?this.log2lin(this.dataMin):
131 this.dataMin),b=E(e),d=[b+A,C(a.max,b+A)],h&&(d[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),d=q(d),d-b<A&&(e[0]=d-A,e[1]=C(a.min,d-A),b=E(e)));this.min=b;this.max=d},getClosest:function(){var a;this.categories?a=1:c(this.series,function(g){var c=g.closestPointRange,b=g.visible||!g.chart.options.chart.ignoreHiddenSeries;!g.noSharedTooltip&&n(c)&&b&&(a=n(a)?Math.min(a,c):c)});return a},nameToX:function(a){var g=p(this.categories),c=g?this.categories:this.names,b=a.options.x,d;a.series.requireSorting=
132 !1;n(b)||(b=!1===this.options.uniqueNames?a.series.autoIncrement():g?e(a.name,c):C(c.keys[a.name],-1));-1===b?g||(d=c.length):d=b;void 0!==d&&(this.names[d]=a.name,this.names.keys[a.name]=d);return d},updateNames:function(){var g=this,b=this.names;0<b.length&&(c(a.keys(b.keys),function(a){delete b.keys[a]}),b.length=0,this.minRange=this.userMinRange,c(this.series||[],function(a){a.xIncrement=null;if(!a.points||a.isDirtyData)a.processData(),a.generatePoints();c(a.points,function(c,b){var d;c.options&&
133 (d=g.nameToX(c),void 0!==d&&d!==c.x&&(c.x=d,a.xData[b]=d))})}))},setAxisTranslation:function(a){var g=this,b=g.max-g.min,d=g.axisPointRange||0,e,h=0,k=0,p=g.linkedParent,x=!!g.categories,r=g.transA,m=g.isXAxis;if(m||x||d)e=g.getClosest(),p?(h=p.minPointOffset,k=p.pointRangePadding):c(g.series,function(a){var c=x?1:m?C(a.options.pointRange,e,0):g.axisPointRange||0;a=a.options.pointPlacement;d=Math.max(d,c);g.single||(h=Math.max(h,I(a)?0:c/2),k=Math.max(k,"on"===a?0:c))}),p=g.ordinalSlope&&e?g.ordinalSlope/
134 e:1,g.minPointOffset=h*=p,g.pointRangePadding=k*=p,g.pointRange=Math.min(d,b),m&&(g.closestPointRange=e);a&&(g.oldTransA=r);g.translationSlope=g.transA=r=g.options.staticScale||g.len/(b+k||1);g.transB=g.horiz?g.left:g.bottom;g.minPixelPadding=r*h},minFromRange:function(){return this.max-this.range},setTickInterval:function(g){var b=this,d=b.chart,e=b.options,k=b.isLog,p=b.log2lin,x=b.isDatetimeAxis,A=b.isXAxis,F=b.isLinked,f=e.maxPadding,z=e.minPadding,D=e.tickInterval,J=e.tickPixelInterval,G=b.categories,
135 u=b.threshold,t=b.softThreshold,v,q,I,B;x||G||F||this.getTickAmount();I=C(b.userMin,e.min);B=C(b.userMax,e.max);F?(b.linkedParent=d[b.coll][e.linkedTo],d=b.linkedParent.getExtremes(),b.min=C(d.min,d.dataMin),b.max=C(d.max,d.dataMax),e.type!==b.linkedParent.options.type&&a.error(11,1)):(!t&&n(u)&&(b.dataMin>=u?(v=u,z=0):b.dataMax<=u&&(q=u,f=0)),b.min=C(I,v,b.dataMin),b.max=C(B,q,b.dataMax));k&&(b.positiveValuesOnly&&!g&&0>=Math.min(b.min,C(b.dataMin,b.min))&&a.error(10,1),b.min=l(p(b.min),15),b.max=
136 l(p(b.max),15));b.range&&n(b.max)&&(b.userMin=b.min=I=Math.max(b.dataMin,b.minFromRange()),b.userMax=B=b.max,b.range=null);m(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(G||b.axisPointRange||b.usePercentage||F)&&n(b.min)&&n(b.max)&&(p=b.max-b.min)&&(!n(I)&&z&&(b.min-=p*z),!n(B)&&f&&(b.max+=p*f));r(e.softMin)&&!r(b.userMin)&&(b.min=Math.min(b.min,e.softMin));r(e.softMax)&&!r(b.userMax)&&(b.max=Math.max(b.max,e.softMax));r(e.floor)&&(b.min=Math.max(b.min,e.floor));r(e.ceiling)&&
137 (b.max=Math.min(b.max,e.ceiling));t&&n(b.dataMin)&&(u=u||0,!n(I)&&b.min<u&&b.dataMin>=u?b.min=u:!n(B)&&b.max>u&&b.dataMax<=u&&(b.max=u));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:F&&!D&&J===b.linkedParent.options.tickPixelInterval?D=b.linkedParent.tickInterval:C(D,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,G?1:(b.max-b.min)*J/Math.max(b.len,J));A&&!g&&c(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&
138 b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!D&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));g=C(e.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!D&&b.tickInterval<g&&(b.tickInterval=g);x||k||D||(b.tickInterval=M(b.tickInterval,null,h(b.tickInterval),C(e.allowDecimals,!(.5<b.tickInterval&&5>b.tickInterval&&1E3<b.max&&9999>b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval=b.unsquish());
139 this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions;b=this.getMinorTickInterval();var d=a.tickPositioner,e=a.startOnTick,h=a.endOnTick;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===b&&this.tickInterval?this.tickInterval/5:b;this.single=this.min===this.max&&n(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==a.allowDecimals);this.tickPositions=b=c&&c.slice();
140 !b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()],b[0]===b[1]&&(b.length=1)),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.paddedTicks=b.slice(0);
141 this.trimTicks(b,e,h);this.isLinked||(this.single&&2>b.length&&(this.min-=.5,this.max+=.5),c||d||this.adjustTickAmount())},trimTicks:function(a,b,c){var g=a[0],d=a[a.length-1],e=this.minPointOffset||0;if(!this.isLinked){if(b&&-Infinity!==g)this.min=g;else for(;this.min-e>a[0];)a.shift();if(c)this.max=d;else for(;this.max+e<a[a.length-1];)a.pop();0===a.length&&n(g)&&!this.options.tickPositions&&a.push((d+g)/2)}},alignToOthers:function(){var a={},b,d=this.options;!1===this.chart.options.chart.alignTicks||
142 !1===d.alignTicks||this.isLog||c(this.chart[this.coll],function(g){var c=g.options,c=[g.horiz?c.left:c.top,c.width,c.height,c.pane].join();g.series.length&&(a[c]?b=!0:a[c]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,c=a.tickPixelInterval;!n(a.tickInterval)&&this.len<c&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/c)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=
143 this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,e=b&&b.length,h=C(this.threshold,this.softThreshold?0:null);if(this.hasData()){if(e<c){for(;b.length<c;)b.length%2||this.min===h?b.push(l(b[b.length-1]+a)):b.unshift(l(b[0]-a));this.transA*=(e-1)/(c-1);this.min=b[0];this.max=b[b.length-1]}else e>c&&(this.tickInterval*=2,this.setTickPositions());if(n(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0<a&&a<c-1)&&b.splice(a,1);this.finalTickAmt=void 0}}},setScale:function(){var a,
144 b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;c(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||
145 (this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks();m(this,"afterSetScale")},setExtremes:function(a,d,e,h,k){var g=this,p=g.chart;e=C(e,!0);c(g.series,function(a){delete a.kdTree});k=b(k,{min:a,max:d});m(g,"setExtremes",k,function(){g.userMin=a;g.userMax=d;g.eventArgs=k;e&&p.redraw(h)})},zoom:function(a,b){var g=this.dataMin,c=this.dataMax,d=this.options,e=Math.min(g,C(d.min,g)),d=Math.max(c,C(d.max,c));if(a!==this.min||b!==this.max)this.allowZoomOutside||
146 (n(g)&&(a<e&&(a=e),a>d&&(a=d)),n(c)&&(b<e&&(b=e),b>d&&(b=d))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var b=this.chart,c=this.options,d=c.offsets||[0,0,0,0],e=this.horiz,h=this.width=Math.round(a.relativeLength(C(c.width,b.plotWidth-d[3]+d[1]),b.plotWidth)),k=this.height=Math.round(a.relativeLength(C(c.height,b.plotHeight-d[0]+d[2]),b.plotHeight)),p=this.top=Math.round(a.relativeLength(C(c.top,b.plotTop+d[0]),b.plotHeight,
147 b.plotTop)),c=this.left=Math.round(a.relativeLength(C(c.left,b.plotLeft+d[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-k-p;this.right=b.chartWidth-h-c;this.len=Math.max(e?h:k,0);this.pos=e?c:p},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?l(b(this.min)):this.min,max:a?l(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log,g=b?c(this.min):this.min,b=b?c(this.max):
148 this.max;null===a?a=g:g>a?a=g:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(C(a,0)-90*this.side+720)%360;return 15<a&&165>a?"right":195<a&&345>a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],g=C(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(g&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,g]},labelMetrics:function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,
149 this.ticks[a]&&this.ticks[a].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,d=this.tickInterval,e=d,h=this.len/(((this.categories?1:0)+this.max-this.min)/d),k,p=a.rotation,x=this.labelMetrics(),r,m=Number.MAX_VALUE,A,F=function(a){a/=h||1;a=1<a?Math.ceil(a):1;return a*d};b?(A=!a.staggerLines&&!a.step&&(n(p)?[p]:h<C(a.autoRotationLimit,80)&&a.autoRotation))&&c(A,function(a){var b;if(a===p||a&&-90<=a&&90>=a)r=F(Math.abs(x.h/Math.sin(v*a))),b=r+Math.abs(a/360),b<m&&(m=b,k=a,e=r)}):
150 a.step||(e=F(x.h));this.autoRotation=A;this.labelRotation=C(k,p);return e},getSlotWidth:function(){var a=this.chart,b=this.horiz,c=this.options.labels,d=Math.max(this.tickPositions.length-(this.categories?0:1),1),e=a.margin[3];return b&&2>(c.step||0)&&!c.rotation&&(this.staggerLines||1)*this.len/d||!b&&(c.style&&parseInt(c.style.width,10)||e&&e-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,d=this.tickPositions,e=this.ticks,h=this.options.labels,k=this.horiz,
151 p=this.getSlotWidth(),x=Math.max(1,Math.round(p-2*(h.padding||5))),r={},m=this.labelMetrics(),A=h.style&&h.style.textOverflow,F,l,f=0,z;I(h.rotation)||(r.rotation=h.rotation||0);c(d,function(a){(a=e[a])&&a.label&&a.label.textPxLength>f&&(f=a.label.textPxLength)});this.maxLabelLength=f;if(this.autoRotation)f>x&&f>m.h?r.rotation=this.labelRotation:this.labelRotation=0;else if(p&&(F=x,!A))for(l="clip",x=d.length;!k&&x--;)if(z=d[x],z=e[z].label)z.styles&&"ellipsis"===z.styles.textOverflow?z.css({textOverflow:"clip"}):
152 z.textPxLength>p&&z.css({width:p+"px"}),z.getBBox().height>this.len/d.length-(m.h-m.f)&&(z.specificTextOverflow="ellipsis");r.rotation&&(F=f>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight,A||(l="ellipsis"));if(this.labelAlign=h.align||this.autoLabelAlign(this.labelRotation))r.align=this.labelAlign;c(d,function(a){var b=(a=e[a])&&a.label;b&&(b.attr(r),!F||h.style&&h.style.width||!(F<b.textPxLength||"SPAN"===b.element.tagName)||b.css({width:F,textOverflow:b.specificTextOverflow||l}),delete b.specificTextOverflow,
153 a.rotation=r.rotation)});this.tickRotCorr=b.rotCorr(m.b,this.labelRotation||0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||n(this.min)&&n(this.max)&&this.tickPositions&&0<this.tickPositions.length},addTitle:function(a){var b=this.chart.renderer,c=this.horiz,g=this.opposite,d=this.options.title,e;this.axisTitle||((e=d.textAlign)||(e=(c?{low:"left",middle:"center",high:"right"}:{low:g?"right":"left",middle:"center",high:g?"left":"right"})[d.align]),this.axisTitle=b.text(d.text,0,
154 0,d.useHTML).attr({zIndex:7,rotation:d.rotation||0,align:e}).addClass("highcharts-axis-title").css(z(d.style)).add(this.axisGroup),this.axisTitle.isNew=!0);d.style.width||this.isRadial||this.axisTitle.css({width:this.len});this.axisTitle[a?"show":"hide"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new J(this,a)},getOffset:function(){var a=this,b=a.chart,d=b.renderer,e=a.options,h=a.tickPositions,k=a.ticks,p=a.horiz,x=a.side,r=b.inverted&&!a.isZAxis?[1,0,3,2][x]:x,m,A,
155 F=0,l,f=0,z=e.title,J=e.labels,G=0,u=b.axisOffset,b=b.clipOffset,t=[-1,1,1,-1][x],v=e.className,M=a.axisParent,q=this.tickSize("tick");m=a.hasData();a.showAxis=A=m||C(e.showEmpty,!0);a.staggerLines=a.horiz&&J.staggerLines;a.axisGroup||(a.gridGroup=d.g("grid").attr({zIndex:e.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(v||"")).add(M),a.axisGroup=d.g("axis").attr({zIndex:e.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(v||"")).add(M),a.labelGroup=d.g("axis-labels").attr({zIndex:J.zIndex||
156 7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(v||"")).add(M));m||a.isLinked?(c(h,function(b,c){a.generateTick(b,c)}),a.renderUnsquish(),a.reserveSpaceDefault=0===x||2===x||{1:"left",3:"right"}[x]===a.labelAlign,C(J.reserveSpace,"center"===a.labelAlign?!0:null,a.reserveSpaceDefault)&&c(h,function(a){G=Math.max(k[a].getLabelSize(),G)}),a.staggerLines&&(G*=a.staggerLines),a.labelOffset=G*(a.opposite?-1:1)):D(k,function(a,b){a.destroy();delete k[b]});z&&z.text&&!1!==z.enabled&&(a.addTitle(A),
157 A&&!1!==z.reserveSpace&&(a.titleOffset=F=a.axisTitle.getBBox()[p?"height":"width"],l=z.offset,f=n(l)?0:C(z.margin,p?5:10)));a.renderLine();a.offset=t*C(e.offset,u[x]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};d=0===x?-a.labelMetrics().h:2===x?a.tickRotCorr.y:0;f=Math.abs(G)+f;G&&(f=f-d+t*(p?C(J.y,a.tickRotCorr.y+8*t):J.x));a.axisTitleMargin=C(l,f);u[x]=Math.max(u[x],a.axisTitleMargin+F+t*a.offset,f,m&&h.length&&q?q[0]+t*a.offset:0);e=e.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[r]=Math.max(b[r],
158 e)},getLinePath:function(a){var b=this.chart,c=this.opposite,g=this.offset,d=this.horiz,e=this.left+(c?this.width:0)+g,g=b.chartHeight-this.bottom-(c?this.height:0)+g;c&&(a*=-1);return b.renderer.crispLine(["M",d?this.left:e,d?g:this.top,"L",d?b.chartWidth-this.right:e,d?g:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,
159 zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,h=a?b:c,k=this.opposite,p=this.offset,x=e.x||0,r=e.y||0,m=this.axisTitle,A=this.chart.renderer.fontMetrics(e.style&&e.style.fontSize,m),m=Math.max(m.getBBox(null,0).height-A.h-1,0),d={low:h+(a?0:d),middle:h+d/2,high:h+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(k?-1:1)*this.axisTitleMargin+[-m,m,A.f,-m][this.side];return{x:a?d+x:b+(k?this.width:0)+p+x,y:a?b+r-(k?this.height:0)+p:
160 d+r}},renderMinorTick:function(a){var b=this.chart.hasRendered&&r(this.oldMin),c=this.minorTicks;c[a]||(c[a]=new J(this,a,"minor"));b&&c[a].isNew&&c[a].render(null,!0);c[a].render(null,!1,1)},renderTick:function(a,b){var c=this.isLinked,g=this.ticks,d=this.chart.hasRendered&&r(this.oldMin);if(!c||a>=this.min&&a<=this.max)g[a]||(g[a]=new J(this,a)),d&&g[a].isNew&&g[a].render(b,!0,.1),g[a].render(b)},render:function(){var b=this,d=b.chart,e=b.options,h=b.isLog,k=b.lin2log,p=b.isLinked,x=b.tickPositions,
161 m=b.axisTitle,F=b.ticks,l=b.minorTicks,f=b.alternateBands,z=e.stackLabels,G=e.alternateGridColor,n=b.tickmarkOffset,u=b.axisLine,C=b.showAxis,t=H(d.renderer.globalAnimation),v,M;b.labelEdge.length=0;b.overlap=!1;c([F,l,f],function(a){D(a,function(a){a.isActive=!1})});if(b.hasData()||p)b.minorTickInterval&&!b.categories&&c(b.getMinorTickPositions(),function(a){b.renderMinorTick(a)}),x.length&&(c(x,function(a,c){b.renderTick(a,c)}),n&&(0===b.min||b.single)&&(F[-1]||(F[-1]=new J(b,-1,null,!0)),F[-1].render(-1))),
162 G&&c(x,function(c,e){M=void 0!==x[e+1]?x[e+1]+n:b.max-n;0===e%2&&c<b.max&&M<=b.max+(d.polar?-n:n)&&(f[c]||(f[c]=new a.PlotLineOrBand(b)),v=c+n,f[c].options={from:h?k(v):v,to:h?k(M):M,color:G},f[c].render(),f[c].isActive=!0)}),b._addedPlotLB||(c((e.plotLines||[]).concat(e.plotBands||[]),function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=!0);c([F,l,f],function(a){var b,c=[],e=t.duration;D(a,function(a,b){a.isActive||(a.render(b,!1,0),a.isActive=!1,c.push(b))});A(function(){for(b=c.length;b--;)a[c[b]]&&
163 !a[c[b]].isActive&&(a[c[b]].destroy(),delete a[c[b]])},a!==f&&d.hasRendered&&e?e:0)});u&&(u[u.isPlaced?"animate":"attr"]({d:this.getLinePath(u.strokeWidth())}),u.isPlaced=!0,u[C?"show":"hide"](!0));m&&C&&(e=b.getTitlePosition(),r(e.y)?(m[m.isNew?"attr":"animate"](e),m.isNew=!1):(m.attr("y",-9999),m.isNew=!0));z&&z.enabled&&b.renderStackTotals();b.isDirty=!1},redraw:function(){this.visible&&(this.render(),c(this.plotLinesAndBands,function(a){a.render()}));c(this.series,function(a){a.isDirty=!0})},
164 keepProps:"extKey hcEvents names series userMax userMin".split(" "),destroy:function(a){var b=this,d=b.stacks,g=b.plotLinesAndBands,h;a||x(b);D(d,function(a,b){u(a);d[b]=null});c([b.ticks,b.minorTicks,b.alternateBands],function(a){u(a)});if(g)for(a=g.length;a--;)g[a].destroy();c("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "),function(a){b[a]&&(b[a]=b[a].destroy())});for(h in b.plotLinesAndBandsGroups)b.plotLinesAndBandsGroups[h]=b.plotLinesAndBandsGroups[h].destroy();
165 D(b,function(a,c){-1===e(c,b.keepProps)&&delete b[c]})},drawCrosshair:function(a,b){var c,d=this.crosshair,e=C(d.snap,!0),g,h=this.cross;a||(a=this.cross&&this.cross.e);this.crosshair&&!1!==(n(b)||!e)?(e?n(b)&&(g=this.isXAxis?b.plotX:this.len-b.plotY):g=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos),n(g)&&(c=this.getPlotLinePath(b&&(this.isXAxis?b.x:C(b.stackY,b.y)),null,null,null,g)||null),n(c)?(b=this.categories&&!this.isRadial,h||(this.cross=h=this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+
166 (b?"category ":"thin ")+d.className).attr({zIndex:C(d.zIndex,2)}).add(),h.attr({stroke:d.color||(b?f("#ccd6eb").setOpacity(.25).get():"#cccccc"),"stroke-width":C(d.width,1)}).css({"pointer-events":"none"}),d.dashStyle&&h.attr({dashstyle:d.dashStyle})),h.show().attr({d:c}),b&&!d.width&&h.attr({"stroke-width":this.transA}),this.cross.e=a):this.hideCrosshair()):this.hideCrosshair()},hideCrosshair:function(){this.cross&&this.cross.hide()}});return a.Axis=G}(K);(function(a){var B=a.Axis,H=a.getMagnitude,
167 E=a.normalizeTickInterval,q=a.timeUnits;B.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};B.prototype.normalizeTimeTickInterval=function(a,l){var f=l||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]];l=f[f.length-1];var n=q[l[0]],v=l[1],u;for(u=0;u<f.length&&!(l=f[u],n=q[l[0]],v=l[1],f[u+1]&&a<=(n*
168 v[v.length-1]+q[f[u+1][0]])/2);u++);n===q.year&&a<5*n&&(v=[1,2,5]);a=E(a/n,v,"year"===l[0]?Math.max(H(a/n),1):1);return{unitRange:n,count:a,unitName:l[0]}}})(K);(function(a){var B=a.Axis,H=a.getMagnitude,E=a.map,q=a.normalizeTickInterval,f=a.pick;B.prototype.getLogTickPositions=function(a,t,n,v){var l=this.options,c=this.len,b=this.lin2log,m=this.log2lin,d=[];v||(this._minorAutoInterval=null);if(.5<=a)a=Math.round(a),d=this.getLinearTickPositions(a,t,n);else if(.08<=a)for(var c=Math.floor(t),h,k,
169 e,p,r,l=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];c<n+1&&!r;c++)for(k=l.length,h=0;h<k&&!r;h++)e=m(b(c)*l[h]),e>t&&(!v||p<=n)&&void 0!==p&&d.push(p),p>n&&(r=!0),p=e;else t=b(t),n=b(n),a=v?this.getMinorTickInterval():l.tickInterval,a=f("auto"===a?null:a,this._minorAutoInterval,l.tickPixelInterval/(v?5:1)*(n-t)/((v?c/this.tickPositions.length:c)||1)),a=q(a,null,H(a)),d=E(this.getLinearTickPositions(a,t,n),m),v||(this._minorAutoInterval=a/5);v||(this.tickInterval=a);return d};B.prototype.log2lin=
170 function(a){return Math.log(a)/Math.LN10};B.prototype.lin2log=function(a){return Math.pow(10,a)}})(K);(function(a,B){var H=a.arrayMax,E=a.arrayMin,q=a.defined,f=a.destroyObjectProperties,l=a.each,t=a.erase,n=a.merge,v=a.pick;a.PlotLineOrBand=function(a,c){this.axis=a;c&&(this.options=c,this.id=c.id)};a.PlotLineOrBand.prototype={render:function(){var f=this,c=f.axis,b=c.horiz,m=f.options,d=m.label,h=f.label,k=m.to,e=m.from,p=m.value,r=q(e)&&q(k),l=q(p),z=f.svgElem,t=!z,D=[],C=m.color,x=v(m.zIndex,
171 0),F=m.events,D={"class":"highcharts-plot-"+(r?"band ":"line ")+(m.className||"")},A={},J=c.chart.renderer,G=r?"bands":"lines",g=c.log2lin;c.isLog&&(e=g(e),k=g(k),p=g(p));l?(D={stroke:C,"stroke-width":m.width},m.dashStyle&&(D.dashstyle=m.dashStyle)):r&&(C&&(D.fill=C),m.borderWidth&&(D.stroke=m.borderColor,D["stroke-width"]=m.borderWidth));A.zIndex=x;G+="-"+x;(C=c.plotLinesAndBandsGroups[G])||(c.plotLinesAndBandsGroups[G]=C=J.g("plot-"+G).attr(A).add());t&&(f.svgElem=z=J.path().attr(D).add(C));if(l)D=
172 c.getPlotLinePath(p,z.strokeWidth());else if(r)D=c.getPlotBandPath(e,k,m);else return;t&&D&&D.length?(z.attr({d:D}),F&&a.objectEach(F,function(a,b){z.on(b,function(a){F[b].apply(f,[a])})})):z&&(D?(z.show(),z.animate({d:D})):(z.hide(),h&&(f.label=h=h.destroy())));d&&q(d.text)&&D&&D.length&&0<c.width&&0<c.height&&!D.flat?(d=n({align:b&&r&&"center",x:b?!r&&4:10,verticalAlign:!b&&r&&"middle",y:b?r?16:10:r?6:-4,rotation:b&&!r&&90},d),this.renderLabel(d,D,r,x)):h&&h.hide();return f},renderLabel:function(a,
173 c,b,m){var d=this.label,h=this.axis.chart.renderer;d||(d={align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(b?"band":"line")+"-label "+(a.className||"")},d.zIndex=m,this.label=d=h.text(a.text,0,0,a.useHTML).attr(d).add(),d.css(a.style));m=c.xBounds||[c[1],c[4],b?c[6]:c[1]];c=c.yBounds||[c[2],c[5],b?c[7]:c[2]];b=E(m);h=E(c);d.align(a,!1,{x:b,y:h,width:H(m)-b,height:H(c)-h});d.show()},destroy:function(){t(this.axis.plotLinesAndBands,this);delete this.axis;f(this)}};a.extend(B.prototype,
174 {getPlotBandPath:function(a,c){var b=this.getPlotLinePath(c,null,null,!0),m=this.getPlotLinePath(a,null,null,!0),d=[],h=this.horiz,k=1,e;a=a<this.min&&c<this.min||a>this.max&&c>this.max;if(m&&b)for(a&&(e=m.toString()===b.toString(),k=0),a=0;a<m.length;a+=6)h&&b[a+1]===m[a+1]?(b[a+1]+=k,b[a+4]+=k):h||b[a+2]!==m[a+2]||(b[a+2]+=k,b[a+5]+=k),d.push("M",m[a+1],m[a+2],"L",m[a+4],m[a+5],b[a+4],b[a+5],b[a+1],b[a+2],"z"),d.flat=e;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},
175 addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(f,c){var b=(new a.PlotLineOrBand(this,f)).render(),m=this.userOptions;b&&(c&&(m[c]=m[c]||[],m[c].push(f)),this.plotLinesAndBands.push(b));return b},removePlotBandOrLine:function(a){for(var c=this.plotLinesAndBands,b=this.options,m=this.userOptions,d=c.length;d--;)c[d].id===a&&c[d].destroy();l([b.plotLines||[],m.plotLines||[],b.plotBands||[],m.plotBands||[]],function(b){for(d=b.length;d--;)b[d].id===a&&
176 t(b,b[d])})},removePlotBand:function(a){this.removePlotBandOrLine(a)},removePlotLine:function(a){this.removePlotBandOrLine(a)}})})(K,V);(function(a){var B=a.each,H=a.extend,E=a.format,q=a.isNumber,f=a.map,l=a.merge,t=a.pick,n=a.splat,v=a.syncTimeout,u=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,b){this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=b.split&&!a.inverted;this.shared=b.shared||this.split},
177 cleanSplit:function(a){B(this.chart.series,function(b){var c=b&&b.tt;c&&(!c.isActive||a?b.tt=c.destroy():c.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,b=this.options;this.label||(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:b.padding,r:b.borderRadius}),this.label.attr({fill:b.backgroundColor,"stroke-width":b.borderWidth}).css(b.style).shadow(b.shadow)),this.label.attr({zIndex:8}).add());return this.label},
178 update:function(a){this.destroy();l(!0,this.chart.options.tooltip.userOptions,a);this.init(this.chart,l(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,m,d){var c=this,k=c.now,e=!1!==c.options.animation&&!c.isHidden&&(1<Math.abs(a-k.x)||1<Math.abs(b-k.y)),p=c.followPointer||1<c.len;H(k,{x:e?(2*k.x+a)/
179 3:a,y:e?(k.y+b)/2:b,anchorX:p?void 0:e?(2*k.anchorX+m)/3:m,anchorY:p?void 0:e?(k.anchorY+d)/2:d});c.getLabel().attr(k);e&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){c&&c.move(a,b,m,d)},32))},hide:function(a){var b=this;clearTimeout(this.hideTimer);a=t(a,this.options.hideDelay,500);this.isHidden||(this.hideTimer=v(function(){b.getLabel()[a?"fadeOut":"hide"]();b.isHidden=!0},a))},getAnchor:function(a,b){var c,d=this.chart,h=d.inverted,k=d.plotTop,e=d.plotLeft,p=0,r=
180 0,l,z;a=n(a);c=a[0].tooltipPos;this.followPointer&&b&&(void 0===b.chartX&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-k]);c||(B(a,function(a){l=a.series.yAxis;z=a.series.xAxis;p+=a.plotX+(!h&&z?z.left-e:0);r+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!h&&l?l.top-k:0)}),p/=a.length,r/=a.length,c=[h?d.plotWidth-r:p,this.shared&&!h&&1<a.length&&b?b.chartY-k:h?d.plotHeight-p:r]);return f(c,Math.round)},getPosition:function(a,b,m){var c=this.chart,h=this.distance,k={},e=c.inverted&&
181 m.h||0,p,r=["y",c.chartHeight,b,m.plotY+c.plotTop,c.plotTop,c.plotTop+c.plotHeight],f=["x",c.chartWidth,a,m.plotX+c.plotLeft,c.plotLeft,c.plotLeft+c.plotWidth],l=!this.followPointer&&t(m.ttBelow,!c.inverted===!!m.negative),n=function(a,b,c,d,g,p){var x=c<d-h,r=d+h+c<b,m=d-h-c;d+=h;if(l&&r)k[a]=d;else if(!l&&x)k[a]=m;else if(x)k[a]=Math.min(p-c,0>m-e?m:m-e);else if(r)k[a]=Math.max(g,d+e+c>b?d:d+e);else return!1},D=function(a,b,c,d){var e;d<h||d>b-h?e=!1:k[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2;return e},C=
182 function(a){var b=r;r=f;f=b;p=a},x=function(){!1!==n.apply(0,r)?!1!==D.apply(0,f)||p||(C(!0),x()):p?k.x=k.y=0:(C(!0),x())};(c.inverted||1<this.len)&&C();x();return k},defaultFormatter:function(a){var b=this.points||n(this),c;c=[a.tooltipFooterHeaderFormatter(b[0])];c=c.concat(a.bodyFormatter(b));c.push(a.tooltipFooterHeaderFormatter(b[0],!0));return c},refresh:function(a,b){var c,d=this.options,h,k=a,e,p={},r=[];c=d.formatter||this.defaultFormatter;var p=this.shared,f;d.enabled&&(clearTimeout(this.hideTimer),
183 this.followPointer=n(k)[0].series.tooltipOptions.followPointer,e=this.getAnchor(k,b),b=e[0],h=e[1],!p||k.series&&k.series.noSharedTooltip?p=k.getLabelConfig():(B(k,function(a){a.setState("hover");r.push(a.getLabelConfig())}),p={x:k[0].category,y:k[0].y},p.points=r,k=k[0]),this.len=r.length,p=c.call(p,this),f=k.series,this.distance=t(f.tooltipOptions.distance,16),!1===p?this.hide():(c=this.getLabel(),this.isHidden&&c.attr({opacity:1}).show(),this.split?this.renderSplit(p,n(a)):(d.style.width||c.css({width:this.chart.spacingBox.width}),
184 c.attr({text:p&&p.join?p.join(""):p}),c.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+t(k.colorIndex,f.colorIndex)),c.attr({stroke:d.borderColor||k.color||f.color||"#666666"}),this.updatePosition({plotX:b,plotY:h,negative:k.negative,ttBelow:k.ttBelow,h:e[2]||0})),this.isHidden=!1))},renderSplit:function(c,b){var m=this,d=[],h=this.chart,k=h.renderer,e=!0,p=this.options,r=0,f=this.getLabel();a.isString(c)&&(c=[!1,c]);B(c.slice(0,b.length+1),function(a,c){if(!1!==a){c=b[c-1]||
185 {isHeader:!0,plotX:b[0].plotX};var l=c.series||m,z=l.tt,x=c.series||{},F="highcharts-color-"+t(c.colorIndex,x.colorIndex,"none");z||(l.tt=z=k.label(null,null,null,"callout",null,null,p.useHTML).addClass("highcharts-tooltip-box "+F).attr({padding:p.padding,r:p.borderRadius,fill:p.backgroundColor,stroke:p.borderColor||c.color||x.color||"#333333","stroke-width":p.borderWidth}).add(f));z.isActive=!0;z.attr({text:a});z.css(p.style).shadow(p.shadow);a=z.getBBox();x=a.width+z.strokeWidth();c.isHeader?(r=
186 a.height,x=Math.max(0,Math.min(c.plotX+h.plotLeft-x/2,h.chartWidth-x))):x=c.plotX+h.plotLeft-t(p.distance,16)-x;0>x&&(e=!1);a=(c.series&&c.series.yAxis&&c.series.yAxis.pos)+(c.plotY||0);a-=h.plotTop;d.push({target:c.isHeader?h.plotHeight+r:a,rank:c.isHeader?1:0,size:l.tt.getBBox().height+1,point:c,x:x,tt:z})}});this.cleanSplit();a.distribute(d,h.plotHeight+r);B(d,function(a){var b=a.point,c=b.series;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:e||b.isHeader?a.x:b.plotX+h.plotLeft+t(p.distance,
187 16),y:a.pos+h.plotTop,anchorX:b.isHeader?b.plotX+h.plotLeft:b.plotX+c.xAxis.pos,anchorY:b.isHeader?a.pos+h.plotTop-15:b.plotY+c.yAxis.pos})})},updatePosition:function(a){var b=this.chart,c=this.getLabel(),c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(Math.round(c.x),Math.round(c.y||0),a.plotX+b.plotLeft,a.plotY+b.plotTop)},getDateFormat:function(a,b,m,d){var c=this.chart.time,k=c.dateFormat("%m-%d %H:%M:%S.%L",b),e,p,r={millisecond:15,second:12,minute:9,hour:6,
188 day:3},f="millisecond";for(p in u){if(a===u.week&&+c.dateFormat("%w",b)===m&&"00:00:00.000"===k.substr(6)){p="week";break}if(u[p]>a){p=f;break}if(r[p]&&k.substr(r[p])!=="01-01 00:00:00.000".substr(r[p]))break;"week"!==p&&(f=p)}p&&(e=d[p]);return e},getXDateFormat:function(a,b,m){b=b.dateTimeLabelFormats;var c=m&&m.closestPointRange;return(c?this.getDateFormat(c,a.x,m.options.startOfWeek,b):b.day)||b.year},tooltipFooterHeaderFormatter:function(a,b){b=b?"footer":"header";var c=a.series,d=c.tooltipOptions,
189 h=d.xDateFormat,k=c.xAxis,e=k&&"datetime"===k.options.type&&q(a.key),p=d[b+"Format"];e&&!h&&(h=this.getXDateFormat(a,d,k));e&&h&&B(a.point&&a.point.tooltipDateKeys||["key"],function(a){p=p.replace("{point."+a+"}","{point."+a+":"+h+"}")});return E(p,{point:a,series:c},this.chart.time)},bodyFormatter:function(a){return f(a,function(a){var b=a.series.tooltipOptions;return(b[(a.point.formatPrefix||"point")+"Formatter"]||a.point.tooltipFormatter).call(a.point,b[(a.point.formatPrefix||"point")+"Format"])})}}})(K);
190 (function(a){var B=a.addEvent,H=a.attr,E=a.charts,q=a.color,f=a.css,l=a.defined,t=a.each,n=a.extend,v=a.find,u=a.fireEvent,c=a.isNumber,b=a.isObject,m=a.offset,d=a.pick,h=a.splat,k=a.Tooltip;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};k&&(a.tooltip=new k(a,b.tooltip),this.followTouchMove=d(b.tooltip.followTouchMove,!0));this.setDOMEvents()},
191 zoomOption:function(a){var b=this.chart,c=b.options.chart,e=c.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(e=d(c.pinchType,e));this.zoomX=a=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=a&&!b||e&&b;this.zoomVert=e&&!b||a&&b;this.hasZoom=a||e},normalize:function(a,b){var c;c=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));return n(a,{chartX:Math.round(c.pageX-b.left),chartY:Math.round(c.pageY-b.top)})},getCoordinates:function(a){var b=
192 {xAxis:[],yAxis:[]};t(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},findNearestKDPoint:function(a,c,d){var e;t(a,function(a){var h=!(a.noSharedTooltip&&c)&&0>a.options.findNearestPointBy.indexOf("y");a=a.searchPoint(d,h);if((h=b(a,!0))&&!(h=!b(e,!0)))var h=e.distX-a.distX,k=e.dist-a.dist,p=(a.series.group&&a.series.group.zIndex)-(e.series.group&&e.series.group.zIndex),h=0<(0!==h&&c?h:0!==k?k:0!==p?p:e.series.index>
193 a.series.index?-1:1);h&&(e=a)});return e},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=a.parentNode;return b},getChartCoordinatesFromPoint:function(a,b){var c=a.series,e=c.xAxis,c=c.yAxis,h=d(a.clientX,a.plotX);if(e&&c)return b?{chartX:e.len+e.pos-h,chartY:c.len+c.pos-a.plotY}:{chartX:h+e.pos,chartY:a.plotY+c.pos}},getHoverData:function(c,h,k,f,m,l,n){var e,x=[],p=n&&n.isBoosting;f=!(!f||!c);n=h&&!h.stickyTracking?[h]:a.grep(k,function(a){return a.visible&&!(!m&&a.directTouch)&&
194 d(a.options.enableMouseTracking,!0)&&a.stickyTracking});h=(e=f?c:this.findNearestKDPoint(n,m,l))&&e.series;e&&(m&&!h.noSharedTooltip?(n=a.grep(k,function(a){return a.visible&&!(!m&&a.directTouch)&&d(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),t(n,function(a){var c=v(a.points,function(a){return a.x===e.x&&!a.isNull});b(c)&&(p&&(c=a.getPoint(c)),x.push(c))})):x.push(e));return{hoverPoint:e,hoverSeries:h,hoverPoints:x}},runPointActions:function(b,c){var e=this.chart,h=e.tooltip&&e.tooltip.options.enabled?
195 e.tooltip:void 0,k=h?h.shared:!1,p=c||e.hoverPoint,f=p&&p.series||e.hoverSeries,f=this.getHoverData(p,f,e.series,!!c||f&&f.directTouch&&this.isDirectTouch,k,b,{isBoosting:e.isBoosting}),m,p=f.hoverPoint;m=f.hoverPoints;c=(f=f.hoverSeries)&&f.tooltipOptions.followPointer;k=k&&f&&!f.noSharedTooltip;if(p&&(p!==e.hoverPoint||h&&h.isHidden)){t(e.hoverPoints||[],function(b){-1===a.inArray(b,m)&&b.setState()});t(m||[],function(a){a.setState("hover")});if(e.hoverSeries!==f)f.onMouseOver();e.hoverPoint&&e.hoverPoint.firePointEvent("mouseOut");
196 if(!p.series)return;p.firePointEvent("mouseOver");e.hoverPoints=m;e.hoverPoint=p;h&&h.refresh(k?m:p,b)}else c&&h&&!h.isHidden&&(p=h.getAnchor([{}],b),h.updatePosition({plotX:p[0],plotY:p[1]}));this.unDocMouseMove||(this.unDocMouseMove=B(e.container.ownerDocument,"mousemove",function(b){var c=E[a.hoverChartIndex];if(c)c.pointer.onDocumentMouseMove(b)}));t(e.axes,function(c){var e=d(c.crosshair.snap,!0),h=e?a.find(m,function(a){return a.series[c.coll]===c}):void 0;h||!e?c.drawCrosshair(b,h):c.hideCrosshair()})},
197 reset:function(a,b){var c=this.chart,d=c.hoverSeries,e=c.hoverPoint,k=c.hoverPoints,p=c.tooltip,f=p&&p.shared?k:e;a&&f&&t(h(f),function(b){b.series.isCartesian&&void 0===b.plotX&&(a=!1)});if(a)p&&f&&(p.refresh(f),e&&(e.setState(e.state,!0),t(c.axes,function(a){a.crosshair&&a.drawCrosshair(null,e)})));else{if(e)e.onMouseOut();k&&t(k,function(a){a.setState()});if(d)d.onMouseOut();p&&p.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());t(c.axes,function(a){a.hideCrosshair()});this.hoverX=
198 c.hoverPoints=c.hoverPoint=null}},scaleGroups:function(a,b){var c=this.chart,d;t(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&e.group&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=
199 this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,h=this.zoomHor,k=this.zoomVert,f=b.plotLeft,x=b.plotTop,m=b.plotWidth,A=b.plotHeight,l,n=this.selectionMarker,g=this.mouseDownX,w=this.mouseDownY,t=c.panKey&&a[c.panKey+"Key"];n&&n.touch||(d<f?d=f:d>f+m&&(d=f+m),e<x?e=x:e>x+A&&(e=x+A),this.hasDragged=Math.sqrt(Math.pow(g-d,2)+Math.pow(w-e,2)),10<this.hasDragged&&(l=b.isInsidePlot(g-f,w-x),b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!t&&!n&&(this.selectionMarker=n=b.renderer.rect(f,x,h?1:m,
200 k?1:A,0).attr({fill:c.selectionMarkerFill||q("#335cad").setOpacity(.25).get(),"class":"highcharts-selection-marker",zIndex:7}).add()),n&&h&&(d-=g,n.attr({width:Math.abs(d),x:(0<d?0:d)+g})),n&&k&&(d=e-w,n.attr({height:Math.abs(d),y:(0<d?0:d)+w})),l&&!n&&c.panning&&b.pan(a,c.panning)))},drop:function(a){var b=this,d=this.chart,e=this.hasPinched;if(this.selectionMarker){var h={originalEvent:a,xAxis:[],yAxis:[]},k=this.selectionMarker,m=k.attr?k.attr("x"):k.x,C=k.attr?k.attr("y"):k.y,x=k.attr?k.attr("width"):
201 k.width,F=k.attr?k.attr("height"):k.height,A;if(this.hasDragged||e)t(d.axes,function(c){if(c.zoomEnabled&&l(c.min)&&(e||b[{xAxis:"zoomX",yAxis:"zoomY"}[c.coll]])){var d=c.horiz,g="touchend"===a.type?c.minPixelPadding:0,k=c.toValue((d?m:C)+g),d=c.toValue((d?m+x:C+F)-g);h[c.coll].push({axis:c,min:Math.min(k,d),max:Math.max(k,d)});A=!0}}),A&&u(d,"selection",h,function(a){d.zoom(n(a,e?{animation:!1}:null))});c(d.index)&&(this.selectionMarker=this.selectionMarker.destroy());e&&this.scaleGroups()}d&&c(d.index)&&
202 (f(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);2!==a.button&&(this.zoomOption(a),a.preventDefault&&a.preventDefault(),this.dragStart(a))},onDocumentMouseUp:function(b){E[a.hoverChartIndex]&&E[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition;a=this.normalize(a,c);!c||this.inClass(a.target,"highcharts-tracker")||
203 b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var c=E[a.hoverChartIndex];c&&(b.relatedTarget||b.toElement)&&(c.pointer.reset(),c.pointer.chartPosition=null)},onContainerMouseMove:function(b){var c=this.chart;l(a.hoverChartIndex)&&E[a.hoverChartIndex]&&E[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=c.index);b=this.normalize(b);b.returnValue=!1;"mousedown"===c.mouseIsDown&&this.drag(b);!this.inClass(b.target,"highcharts-tracker")&&!c.isInsidePlot(b.chartX-
204 c.plotLeft,b.chartY-c.plotTop)||c.openMenu||this.runPointActions(b)},inClass:function(a,b){for(var c;a;){if(c=H(a,"class")){if(-1!==c.indexOf(b))return!0;if(-1!==c.indexOf("highcharts-container"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;this.isDirectTouch=!1;if(!(!b||!a||b.stickyTracking||this.inClass(a,"highcharts-tooltip")||this.inClass(a,"highcharts-series-"+b.index)&&this.inClass(a,"highcharts-tracker")))b.onMouseOut()},
205 onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop;a=this.normalize(a);b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(u(c.series,"click",n(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(n(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&u(b,"click",a)))},setDOMEvents:function(){var b=this,c=b.chart.container,d=c.ownerDocument;c.onmousedown=function(a){b.onContainerMouseDown(a)};c.onmousemove=function(a){b.onContainerMouseMove(a)};
206 c.onclick=function(a){b.onContainerClick(a)};this.unbindContainerMouseLeave=B(c,"mouseleave",b.onContainerMouseLeave);a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=B(d,"mouseup",b.onDocumentMouseUp));a.hasTouch&&(c.ontouchstart=function(a){b.onContainerTouchStart(a)},c.ontouchmove=function(a){b.onContainerTouchMove(a)},a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=B(d,"touchend",b.onDocumentTouchEnd)))},destroy:function(){var b=this;b.unDocMouseMove&&b.unDocMouseMove();this.unbindContainerMouseLeave();
207 a.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=a.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(b.tooltipTimeout);a.objectEach(b,function(a,c){b[c]=null})}}})(K);(function(a){var B=a.charts,H=a.each,E=a.extend,q=a.map,f=a.noop,l=a.pick;E(a.Pointer.prototype,{pinchTranslate:function(a,f,l,q,c,b){this.zoomHor&&this.pinchTranslateDirection(!0,a,f,l,q,c,b);this.zoomVert&&this.pinchTranslateDirection(!1,a,f,l,q,
208 c,b)},pinchTranslateDirection:function(a,f,l,q,c,b,m,d){var h=this.chart,k=a?"x":"y",e=a?"X":"Y",p="chart"+e,r=a?"width":"height",n=h["plot"+(a?"Left":"Top")],z,t,D=d||1,C=h.inverted,x=h.bounds[a?"h":"v"],F=1===f.length,A=f[0][p],J=l[0][p],G=!F&&f[1][p],g=!F&&l[1][p],w;l=function(){!F&&20<Math.abs(A-G)&&(D=d||Math.abs(J-g)/Math.abs(A-G));t=(n-J)/D+A;z=h["plot"+(a?"Width":"Height")]/D};l();f=t;f<x.min?(f=x.min,w=!0):f+z>x.max&&(f=x.max-z,w=!0);w?(J-=.8*(J-m[k][0]),F||(g-=.8*(g-m[k][1])),l()):m[k]=
209 [J,g];C||(b[k]=t-n,b[r]=z);b=C?1/D:D;c[r]=z;c[k]=f;q[C?a?"scaleY":"scaleX":"scale"+e]=D;q["translate"+e]=b*n+(J-b*A)},pinch:function(a){var n=this,t=n.chart,u=n.pinchDown,c=a.touches,b=c.length,m=n.lastValidTouch,d=n.hasZoom,h=n.selectionMarker,k={},e=1===b&&(n.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||n.runChartClick),p={};1<b&&(n.initiated=!0);d&&n.initiated&&!e&&a.preventDefault();q(c,function(a){return n.normalize(a)});"touchstart"===a.type?(H(c,function(a,b){u[b]={chartX:a.chartX,
210 chartY:a.chartY}}),m.x=[u[0].chartX,u[1]&&u[1].chartX],m.y=[u[0].chartY,u[1]&&u[1].chartY],H(t.axes,function(a){if(a.zoomEnabled){var b=t.bounds[a.horiz?"h":"v"],c=a.minPixelPadding,d=a.toPixels(l(a.options.min,a.dataMin)),e=a.toPixels(l(a.options.max,a.dataMax)),h=Math.max(d,e);b.min=Math.min(a.pos,Math.min(d,e)-c);b.max=Math.max(a.pos+a.len,h+c)}}),n.res=!0):n.followTouchMove&&1===b?this.runPointActions(n.normalize(a)):u.length&&(h||(n.selectionMarker=h=E({destroy:f,touch:!0},t.plotBox)),n.pinchTranslate(u,
211 c,k,h,p,m),n.hasPinched=d,n.scaleGroups(k,p),n.res&&(n.res=!1,this.reset(!1,0)))},touch:function(f,n){var t=this.chart,q,c;if(t.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=t.index;1===f.touches.length?(f=this.normalize(f),(c=t.isInsidePlot(f.chartX-t.plotLeft,f.chartY-t.plotTop))&&!t.openMenu?(n&&this.runPointActions(f),"touchmove"===f.type&&(n=this.pinchDown,q=n[0]?4<=Math.sqrt(Math.pow(n[0].chartX-f.chartX,2)+Math.pow(n[0].chartY-f.chartY,2)):!1),l(q,
212 !0)&&this.pinch(f)):n&&this.reset()):2===f.touches.length&&this.pinch(f)},onContainerTouchStart:function(a){this.zoomOption(a);this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(f){B[a.hoverChartIndex]&&B[a.hoverChartIndex].pointer.drop(f)}})})(K);(function(a){var B=a.addEvent,H=a.charts,E=a.css,q=a.doc,f=a.extend,l=a.noop,t=a.Pointer,n=a.removeEvent,v=a.win,u=a.wrap;if(!a.hasTouch&&(v.PointerEvent||v.MSPointerEvent)){var c={},b=!!v.PointerEvent,m=function(){var b=
213 [];b.item=function(a){return this[a]};a.objectEach(c,function(a){b.push({pageX:a.pageX,pageY:a.pageY,target:a.target})});return b},d=function(b,c,d,f){"touch"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!H[a.hoverChartIndex]||(f(b),f=H[a.hoverChartIndex].pointer,f[c]({type:d,target:b.currentTarget,preventDefault:l,touches:m()}))};f(t.prototype,{onContainerPointerDown:function(a){d(a,"onContainerTouchStart","touchstart",function(a){c[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},
214 onContainerPointerMove:function(a){d(a,"onContainerTouchMove","touchmove",function(a){c[a.pointerId]={pageX:a.pageX,pageY:a.pageY};c[a.pointerId].target||(c[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){d(a,"onDocumentTouchEnd","touchend",function(a){delete c[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,b?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,b?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(q,b?
215 "pointerup":"MSPointerUp",this.onDocumentPointerUp)}});u(t.prototype,"init",function(a,b,c){a.call(this,b,c);this.hasZoom&&E(b.container,{"-ms-touch-action":"none","touch-action":"none"})});u(t.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(B)});u(t.prototype,"destroy",function(a){this.batchMSEvents(n);a.call(this)})}})(K);(function(a){var B=a.addEvent,H=a.css,E=a.discardElement,q=a.defined,f=a.each,l=a.isFirefox,t=a.marginNames,n=a.merge,
216 v=a.pick,u=a.setAnimation,c=a.stableSort,b=a.win,m=a.wrap;a.Legend=function(a,b){this.init(a,b)};a.Legend.prototype={init:function(a,b){this.chart=a;this.setOptions(b);b.enabled&&(this.render(),B(this.chart,"endResize",function(){this.legend.positionCheckboxes()}))},setOptions:function(a){var b=v(a.padding,8);this.options=a;this.itemStyle=a.itemStyle;this.itemHiddenStyle=n(this.itemStyle,a.itemHiddenStyle);this.itemMarginTop=a.itemMarginTop||0;this.padding=b;this.initialItemY=b-5;this.itemHeight=
217 this.maxItemWidth=0;this.symbolWidth=v(a.symbolWidth,16);this.pages=[]},update:function(a,b){var c=this.chart;this.setOptions(n(!0,this.options,a));this.destroy();c.isDirtyLegend=c.isDirtyBox=!0;v(b,!0)&&c.redraw()},colorizeItem:function(a,b){a.legendGroup[b?"removeClass":"addClass"]("highcharts-legend-item-hidden");var c=this.options,d=a.legendItem,h=a.legendLine,f=a.legendSymbol,m=this.itemHiddenStyle.color,c=b?c.itemStyle.color:m,l=b?a.color||m:m,n=a.options&&a.options.marker,D={fill:l};d&&d.css({fill:c,
218 color:c});h&&h.attr({stroke:l});f&&(n&&f.isMarker&&(D=a.pointAttribs(),b||(D.stroke=D.fill=m)),f.attr(D))},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,f=d[0],d=d[1],m=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?f:this.legendWidth-f-2*c-4,d);m&&(m.x=f,m.y=d)},destroyItem:function(a){var b=a.checkbox;f(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&
219 (this[a]=this[a].destroy())}f(this.getAllItems(),function(b){f(["legendItem","legendGroup"],a,b)});f("clipRect up down pager nav box title group".split(" "),a,this);this.display=null},positionCheckboxes:function(){var a=this.group&&this.group.alignAttr,b,c=this.clipHeight||this.legendHeight,e=this.titleHeight;a&&(b=a.translateY,f(this.allItems,function(d){var h=d.checkbox,k;h&&(k=b+e+h.y+(this.scrollOffset||0)+3,H(h,{left:a.translateX+d.checkboxOffset+h.x-20+"px",top:k+"px",display:k>b-6&&k<b+c-6?
220 "":"none"}))},this))},renderTitle:function(){var a=this.options,b=this.padding,c=a.title,e=0;c.text&&(this.title||(this.title=this.chart.renderer.label(c.text,b-3,b-4,null,null,null,a.useHTML,null,"legend-title").attr({zIndex:1}).css(c.style).add(this.group)),a=this.title.getBBox(),e=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:e}));this.titleHeight=e},setText:function(b){var c=this.options;b.legendItem.attr({text:c.labelFormat?a.format(c.labelFormat,b,this.chart.time):c.labelFormatter.call(b)})},
221 renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,f="horizontal"===d.layout,m=this.symbolWidth,l=d.symbolPadding,z=this.itemStyle,q=this.itemHiddenStyle,D=this.padding,C=f?v(d.itemDistance,20):0,x=!d.rtl,F=d.width,A=d.itemMarginBottom||0,J=this.itemMarginTop,G=a.legendItem,g=!a.series,w=!g&&a.series.drawLegendSymbol?a.series:a,t=w.options,u=this.createCheckboxForItem&&t&&t.showCheckbox,t=m+l+C+(u?20:0),N=d.useHTML,O=a.options.className;G||(a.legendGroup=c.g("legend-item").addClass("highcharts-"+
222 w.type+"-series highcharts-color-"+a.colorIndex+(O?" "+O:"")+(g?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=G=c.text("",x?m+l:-l,this.baseline||0,N).css(n(a.visible?z:q)).attr({align:x?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(m=z.fontSize,this.fontMetrics=c.fontMetrics(m,G),this.baseline=this.fontMetrics.f+3+J,G.attr("y",this.baseline)),this.symbolHeight=d.symbolHeight||this.fontMetrics.f,w.drawLegendSymbol(this,a),this.setItemEvents&&
223 this.setItemEvents(a,G,N),u&&this.createCheckboxForItem(a));this.colorizeItem(a,a.visible);z.width||G.css({width:(d.itemWidth||d.width||b.spacingBox.width)-t});this.setText(a);c=G.getBBox();z=a.checkboxOffset=d.itemWidth||a.legendItemWidth||c.width+t;this.itemHeight=c=Math.round(a.legendItemHeight||c.height||this.symbolHeight);f&&this.itemX-D+z>(F||b.spacingBox.width-2*D-d.x)&&(this.itemX=D,this.itemY+=J+this.lastLineHeight+A,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,z);
224 this.lastItemY=J+this.itemY+A;this.lastLineHeight=Math.max(c,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=z:(this.itemY+=J+c+A,this.lastLineHeight=c);this.offsetWidth=F||Math.max((f?this.itemX-D-(a.checkbox?0:C):z)+D,this.offsetWidth)},getAllItems:function(){var a=[];f(this.chart.series,function(b){var c=b&&b.options;b&&v(c.showInLegend,q(c.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===c.legendType?b.data:b)))});return a},getAlignment:function(){var a=
225 this.options;return a.floating?"":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)},adjustMargins:function(a,b){var c=this.chart,d=this.options,h=this.getAlignment();h&&f([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(e,k){e.test(h)&&!q(a[k])&&(c[t[k]]=Math.max(c[t[k]],c.legend[(k+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][k]*d[k%2?"x":"y"]+v(d.margin,12)+b[k]+(0===k?c.titleOffset+c.options.title.margin:0)))})},render:function(){var a=this,b=a.chart,k=b.renderer,
226 e=a.group,m,l,t,z,q=a.box,D=a.options,C=a.padding;a.itemX=C;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=k.g("legend").attr({zIndex:7}).add(),a.contentGroup=k.g().attr({zIndex:1}).add(e),a.scrollGroup=k.g().add(a.contentGroup));a.renderTitle();m=a.getAllItems();c(m,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});D.reversed&&m.reverse();a.allItems=m;a.display=l=!!m.length;a.lastLineHeight=0;f(m,function(b){a.renderItem(b)});t=
227 (D.width||a.offsetWidth)+C;z=a.lastItemY+a.lastLineHeight+a.titleHeight;z=a.handleOverflow(z);z+=C;q||(a.box=q=k.rect().addClass("highcharts-legend-box").attr({r:D.borderRadius}).add(e),q.isNew=!0);q.attr({stroke:D.borderColor,"stroke-width":D.borderWidth||0,fill:D.backgroundColor||"none"}).shadow(D.shadow);0<t&&0<z&&(q[q.isNew?"attr":"animate"](q.crisp.call({},{x:0,y:0,width:t,height:z},q.strokeWidth())),q.isNew=!1);q[l?"show":"hide"]();a.legendWidth=t;a.legendHeight=z;f(m,function(b){a.positionItem(b)});
228 l&&(k=b.spacingBox,/(lth|ct|rth)/.test(a.getAlignment())&&(k=n(k,{y:k.y+b.titleOffset+b.options.title.margin})),e.align(n(D,{width:t,height:z}),!0,k));b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,m=this.options,l=m.y,n=this.padding,c=c.spacingBox.height+("top"===m.verticalAlign?-l:l)-n,l=m.maxHeight,z,q=this.clipRect,D=m.navigation,t=v(D.animation,!0),x=D.arrowSize||12,F=this.nav,A=this.pages,J,G=this.allItems,g=function(a){"number"===typeof a?
229 q.attr({height:a}):q&&(b.clipRect=q.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+n+"px,9999px,"+(n+a)+"px,0)":"auto")};"horizontal"!==m.layout||"middle"===m.verticalAlign||m.floating||(c/=2);l&&(c=Math.min(c,l));A.length=0;a>c&&!1!==D.enabled?(this.clipHeight=z=Math.max(c-20-this.titleHeight-n,0),this.currentPage=v(this.currentPage,1),this.fullHeight=a,f(G,function(a,b){var c=a._legendItemPos[1],d=Math.round(a.legendItem.getBBox().height),g=A.length;
230 if(!g||c-A[g-1]>z&&(J||c)!==A[g-1])A.push(J||c),g++;a.pageIx=g-1;J&&(G[b-1].pageIx=g-1);b===G.length-1&&c+d-A[g-1]>z&&(A.push(c),a.pageIx=g);c!==J&&(J=c)}),q||(q=b.clipRect=d.clipRect(0,n,9999,0),b.contentGroup.clip(q)),g(z),F||(this.nav=F=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,x,x).on("click",function(){b.scroll(-1,t)}).add(F),this.pager=d.text("",15,10).addClass("highcharts-legend-navigation").css(D.style).add(F),this.down=d.symbol("triangle-down",0,0,x,x).on("click",
231 function(){b.scroll(1,t)}).add(F)),b.scroll(0),a=c):F&&(g(),this.nav=F.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,b){var c=this.pages,d=c.length;a=this.currentPage+a;var h=this.clipHeight,f=this.options.navigation,m=this.pager,l=this.padding;a>d&&(a=d);0<a&&(void 0!==b&&u(b,this.chart),this.nav.attr({translateX:l,translateY:h+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({"class":1===a?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),
232 m.attr({text:a+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,"class":a===d?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),this.up.attr({fill:1===a?f.inactiveColor:f.activeColor}).css({cursor:1===a?"default":"pointer"}),this.down.attr({fill:a===d?f.inactiveColor:f.activeColor}).css({cursor:a===d?"default":"pointer"}),this.scrollOffset=-c[a-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=a,this.positionCheckboxes())}};a.LegendSymbolMixin=
233 {drawRectangle:function(a,b){var c=a.symbolHeight,d=a.options.squareSymbol;b.legendSymbol=this.chart.renderer.rect(d?(a.symbolWidth-c)/2:0,a.baseline-c+1,d?c:a.symbolWidth,c,v(a.options.symbolRadius,c/2)).addClass("highcharts-point").attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d=a.symbolWidth,f=a.symbolHeight,m=f/2,l=this.chart.renderer,z=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var q;q={"stroke-width":b.lineWidth||0};b.dashStyle&&
234 (q.dashstyle=b.dashStyle);this.legendLine=l.path(["M",0,a,"L",d,a]).addClass("highcharts-graph").attr(q).add(z);c&&!1!==c.enabled&&(b=Math.min(v(c.radius,m),m),0===this.symbol.indexOf("url")&&(c=n(c,{width:f,height:f}),b=0),this.legendSymbol=c=l.symbol(this.symbol,d/2-b,a-b,2*b,2*b,c).addClass("highcharts-point").add(z),c.isMarker=!0)}};(/Trident\/7\.0/.test(b.navigator.userAgent)||l)&&m(a.Legend.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)})})(K);
235 (function(a){var B=a.addEvent,H=a.animate,E=a.animObject,q=a.attr,f=a.doc,l=a.Axis,t=a.createElement,n=a.defaultOptions,v=a.discardElement,u=a.charts,c=a.css,b=a.defined,m=a.each,d=a.extend,h=a.find,k=a.fireEvent,e=a.grep,p=a.isNumber,r=a.isObject,I=a.isString,z=a.Legend,M=a.marginNames,D=a.merge,C=a.objectEach,x=a.Pointer,F=a.pick,A=a.pInt,J=a.removeEvent,G=a.seriesTypes,g=a.splat,w=a.syncTimeout,L=a.win,P=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,c){return new P(a,
236 b,c)};d(P.prototype,{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(I(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(b,c){var g,d,e=b.series,h=b.plotOptions||{};b.series=null;g=D(n,b);for(d in g.plotOptions)g.plotOptions[d].tooltip=h[d]&&D(h[d].tooltip)||void 0;g.tooltip.userOptions=b.chart&&b.chart.forExport&&b.tooltip.userOptions||b.tooltip;g.series=b.series=e;this.userOptions=b;d=g.chart;e=d.events;this.margin=[];this.spacing=[];this.bounds=
237 {h:{},v:{}};this.labelCollectors=[];this.callback=c;this.isResizing=0;this.options=g;this.axes=[];this.series=[];this.time=b.time&&a.keys(b.time).length?new a.Time(b.time):a.time;this.hasCartesianSeries=d.showAxes;var k=this;k.index=u.length;u.push(k);a.chartCount++;e&&C(e,function(a,b){B(k,b,a)});k.xAxis=[];k.yAxis=[];k.pointCount=k.colorCounter=k.symbolCounter=0;k.firstRender()},initSeries:function(b){var c=this.options.chart;(c=G[b.type||c.type||c.defaultSeriesType])||a.error(17,!0);c=new c;c.init(this,
238 b);return c},orderSeries:function(a){var b=this.series;for(a=a||0;a<b.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].getName())},isInsidePlot:function(a,b,c){var g=c?b:a;a=c?a:b;return 0<=g&&g<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(b){var c=this.axes,g=this.series,e=this.pointer,h=this.legend,f=this.isDirtyLegend,x,l,p=this.hasCartesianSeries,A=this.isDirtyBox,F,n=this.renderer,w=n.isHidden(),r=[];this.setResponsive&&this.setResponsive(!1);a.setAnimation(b,this);w&&this.temporaryDisplay();
239 this.layOutTitles();for(b=g.length;b--;)if(F=g[b],F.options.stacking&&(x=!0,F.isDirty)){l=!0;break}if(l)for(b=g.length;b--;)F=g[b],F.options.stacking&&(F.isDirty=!0);m(g,function(a){a.isDirty&&"point"===a.options.legendType&&(a.updateTotals&&a.updateTotals(),f=!0);a.isDirtyData&&k(a,"updatedData")});f&&h.options.enabled&&(h.render(),this.isDirtyLegend=!1);x&&this.getStacks();p&&m(c,function(a){a.updateNames();a.setScale()});this.getMargins();p&&(m(c,function(a){a.isDirty&&(A=!0)}),m(c,function(a){var b=
240 a.min+","+a.max;a.extKey!==b&&(a.extKey=b,r.push(function(){k(a,"afterSetExtremes",d(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(A||x)&&a.redraw()}));A&&this.drawChartBox();k(this,"predraw");m(g,function(a){(A||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});e&&e.reset(!0);n.draw();k(this,"redraw");k(this,"render");w&&this.temporaryDisplay(!0);m(r,function(a){a.call()})},get:function(a){function b(b){return b.id===a||b.options&&b.options.id===a}var c,g=this.series,d;c=h(this.axes,b)||
241 h(this.series,b);for(d=0;!c&&d<g.length;d++)c=h(g[d].points||[],b);return c},getAxes:function(){var a=this,b=this.options,c=b.xAxis=g(b.xAxis||{}),b=b.yAxis=g(b.yAxis||{});k(this,"beforeGetAxes");m(c,function(a,b){a.index=b;a.isX=!0});m(b,function(a,b){a.index=b});c=c.concat(b);m(c,function(b){new l(a,b)})},getSelectedPoints:function(){var a=[];m(this.series,function(b){a=a.concat(e(b.data||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return e(this.series,function(a){return a.selected})},
242 setTitle:function(a,b,c){var g=this,d=g.options,e;e=d.title=D({style:{color:"#333333",fontSize:d.isStock?"16px":"18px"}},d.title,a);d=d.subtitle=D({style:{color:"#666666"}},d.subtitle,b);m([["title",a,e],["subtitle",b,d]],function(a,b){var c=a[0],d=g[c],e=a[1];a=a[2];d&&e&&(g[c]=d=d.destroy());a&&!d&&(g[c]=g.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+c,zIndex:a.zIndex||4}).add(),g[c].update=function(a){g.setTitle(!b&&a,b&&a)},g[c].css(a.style))});g.layOutTitles(c)},
243 layOutTitles:function(a){var b=0,c,g=this.renderer,e=this.spacingBox;m(["title","subtitle"],function(a){var c=this[a],h=this.options[a];a="title"===a?-3:h.verticalAlign?0:b+2;var k;c&&(k=h.style.fontSize,k=g.fontMetrics(k,c).b,c.css({width:(h.width||e.width+h.widthAdjust)+"px"}).align(d({y:a+k},h),!1,"spacingBox"),h.floating||h.verticalAlign||(b=Math.ceil(b+c.getBBox(h.useHTML).height)))},this);c=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&c&&(this.isDirtyBox=c,this.hasRendered&&F(a,
244 !0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var c=this.options.chart,g=c.width,c=c.height,d=this.renderTo;b(g)||(this.containerWidth=a.getStyle(d,"width"));b(c)||(this.containerHeight=a.getStyle(d,"height"));this.chartWidth=Math.max(0,g||this.containerWidth||600);this.chartHeight=Math.max(0,a.relativeLength(c,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))},temporaryDisplay:function(b){var c=this.renderTo;if(b)for(;c&&c.style;)c.hcOrigStyle&&(a.css(c,c.hcOrigStyle),
245 delete c.hcOrigStyle),c.hcOrigDetached&&(f.body.removeChild(c),c.hcOrigDetached=!1),c=c.parentNode;else for(;c&&c.style;){f.body.contains(c)||c.parentNode||(c.hcOrigDetached=!0,f.body.appendChild(c));if("none"===a.getStyle(c,"display",!1)||c.hcOricDetached)c.hcOrigStyle={display:c.style.display,height:c.style.height,overflow:c.style.overflow},b={display:"block",overflow:"hidden"},c!==this.renderTo&&(b.height=0),a.css(c,b),c.offsetWidth||c.style.setProperty("display","block","important");c=c.parentNode;
246 if(c===f.body)break}},setClassName:function(a){this.container.className="highcharts-container "+(a||"")},getContainer:function(){var b,c=this.options,g=c.chart,e,h;b=this.renderTo;var k=a.uniqueKey(),x;b||(this.renderTo=b=g.renderTo);I(b)&&(this.renderTo=b=f.getElementById(b));b||a.error(13,!0);e=A(q(b,"data-highcharts-chart"));p(e)&&u[e]&&u[e].hasRendered&&u[e].destroy();q(b,"data-highcharts-chart",this.index);b.innerHTML="";g.skipClone||b.offsetWidth||this.temporaryDisplay();this.getChartSize();
247 e=this.chartWidth;h=this.chartHeight;x=d({position:"relative",overflow:"hidden",width:e+"px",height:h+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},g.style);this.container=b=t("div",{id:k},x,b);this._cursor=b.style.cursor;this.renderer=new (a[g.renderer]||a.Renderer)(b,e,h,null,g.forExport,c.exporting&&c.exporting.allowHTML);this.setClassName(g.className);this.renderer.setStyle(g.style);this.renderer.chartIndex=this.index},getMargins:function(a){var c=
248 this.spacing,g=this.margin,d=this.titleOffset;this.resetMargins();d&&!b(g[0])&&(this.plotTop=Math.max(this.plotTop,d+this.options.title.margin+c[0]));this.legend&&this.legend.display&&this.legend.adjustMargins(g,c);this.extraMargin&&(this[this.extraMargin.type]=(this[this.extraMargin.type]||0)+this.extraMargin.value);this.adjustPlotArea&&this.adjustPlotArea();a||this.getAxisMargins()},getAxisMargins:function(){var a=this,c=a.axisOffset=[0,0,0,0],g=a.margin;a.hasCartesianSeries&&m(a.axes,function(a){a.visible&&
249 a.getOffset()});m(M,function(d,e){b(g[e])||(a[d]+=c[e])});a.setChartSize()},reflow:function(c){var g=this,d=g.options.chart,e=g.renderTo,h=b(d.width)&&b(d.height),k=d.width||a.getStyle(e,"width"),d=d.height||a.getStyle(e,"height"),e=c?c.target:L;if(!h&&!g.isPrinting&&k&&d&&(e===L||e===f)){if(k!==g.containerWidth||d!==g.containerHeight)clearTimeout(g.reflowTimeout),g.reflowTimeout=w(function(){g.container&&g.setSize(void 0,void 0,!1)},c?100:0);g.containerWidth=k;g.containerHeight=d}},initReflow:function(){var a=
250 this,b;b=B(L,"resize",function(b){a.reflow(b)});B(a,"destroy",b)},setSize:function(b,g,d){var e=this,h=e.renderer;e.isResizing+=1;a.setAnimation(d,e);e.oldChartHeight=e.chartHeight;e.oldChartWidth=e.chartWidth;void 0!==b&&(e.options.chart.width=b);void 0!==g&&(e.options.chart.height=g);e.getChartSize();b=h.globalAnimation;(b?H:c)(e.container,{width:e.chartWidth+"px",height:e.chartHeight+"px"},b);e.setChartSize(!0);h.setSize(e.chartWidth,e.chartHeight,d);m(e.axes,function(a){a.isDirty=!0;a.setScale()});
251 e.isDirtyLegend=!0;e.isDirtyBox=!0;e.layOutTitles();e.getMargins();e.redraw(d);e.oldChartHeight=null;k(e,"resize");w(function(){e&&k(e,"endResize",null,function(){--e.isResizing})},E(b).duration)},setChartSize:function(a){var b=this.inverted,c=this.renderer,g=this.chartWidth,d=this.chartHeight,e=this.options.chart,h=this.spacing,k=this.clipOffset,f,x,l,p;this.plotLeft=f=Math.round(this.plotLeft);this.plotTop=x=Math.round(this.plotTop);this.plotWidth=l=Math.max(0,Math.round(g-f-this.marginRight));
252 this.plotHeight=p=Math.max(0,Math.round(d-x-this.marginBottom));this.plotSizeX=b?p:l;this.plotSizeY=b?l:p;this.plotBorderWidth=e.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:h[3],y:h[0],width:g-h[3]-h[1],height:d-h[0]-h[2]};this.plotBox=c.plotBox={x:f,y:x,width:l,height:p};g=2*Math.floor(this.plotBorderWidth/2);b=Math.ceil(Math.max(g,k[3])/2);c=Math.ceil(Math.max(g,k[0])/2);this.clipBox={x:b,y:c,width:Math.floor(this.plotSizeX-Math.max(g,k[1])/2-b),height:Math.max(0,Math.floor(this.plotSizeY-
253 Math.max(g,k[2])/2-c))};a||m(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this,b=a.options.chart;m(["margin","spacing"],function(c){var g=b[c],d=r(g)?g:[g,g,g,g];m(["Top","Right","Bottom","Left"],function(g,e){a[c][e]=F(b[c+g],d[e])})});m(M,function(b,c){a[b]=F(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,g=this.chartHeight,d=this.chartBackground,
254 e=this.plotBackground,h=this.plotBorder,f,x=this.plotBGImage,m=a.backgroundColor,l=a.plotBackgroundColor,p=a.plotBackgroundImage,A,F=this.plotLeft,n=this.plotTop,w=this.plotWidth,r=this.plotHeight,z=this.plotBox,G=this.clipRect,J=this.clipBox,q="animate";d||(this.chartBackground=d=b.rect().addClass("highcharts-background").add(),q="attr");f=a.borderWidth||0;A=f+(a.shadow?8:0);m={fill:m||"none"};if(f||d["stroke-width"])m.stroke=a.borderColor,m["stroke-width"]=f;d.attr(m).shadow(a.shadow);d[q]({x:A/
255 2,y:A/2,width:c-A-f%2,height:g-A-f%2,r:a.borderRadius});q="animate";e||(q="attr",this.plotBackground=e=b.rect().addClass("highcharts-plot-background").add());e[q](z);e.attr({fill:l||"none"}).shadow(a.plotShadow);p&&(x?x.animate(z):this.plotBGImage=b.image(p,F,n,w,r).add());G?G.animate({width:J.width,height:J.height}):this.clipRect=b.clipRect(J);q="animate";h||(q="attr",this.plotBorder=h=b.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());h.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||
256 0,fill:"none"});h[q](h.crisp({x:F,y:n,width:w,height:r},-h.strokeWidth()));this.isDirtyBox=!1;k(this,"afterDrawChartBox")},propFromSeries:function(){var a=this,b=a.options.chart,c,g=a.options.series,d,e;m(["inverted","angular","polar"],function(h){c=G[b.type||b.defaultSeriesType];e=b[h]||c&&c.prototype[h];for(d=g&&g.length;!e&&d--;)(c=G[g[d].type])&&c.prototype[h]&&(e=!0);a[h]=e})},linkSeries:function(){var a=this,b=a.series;m(b,function(a){a.linkedSeries.length=0});m(b,function(b){var c=b.options.linkedTo;
257 I(c)&&(c=":previous"===c?a.series[b.index-1]:a.get(c))&&c.linkedParent!==b&&(c.linkedSeries.push(b),b.linkedParent=c,b.visible=F(b.options.visible,c.options.visible,b.visible))})},renderSeries:function(){m(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&m(b.items,function(c){var g=d(b.style,c.style),e=A(g.left)+a.plotLeft,h=A(g.top)+a.plotTop+12;delete g.left;delete g.top;a.renderer.text(c.html,e,h).attr({zIndex:2}).css(g).add()})},
258 render:function(){var a=this.axes,b=this.renderer,c=this.options,g,d,e;this.setTitle();this.legend=new z(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();c=this.plotWidth;g=this.plotHeight=Math.max(this.plotHeight-21,0);m(a,function(a){a.setScale()});this.getAxisMargins();d=1.1<c/this.plotWidth;e=1.05<g/this.plotHeight;if(d||e)m(a,function(a){(a.horiz&&d||!a.horiz&&e)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&m(a,
259 function(a){a.visible&&a.render()});this.seriesGroup||(this.seriesGroup=b.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},addCredits:function(a){var b=this;a=D(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){a.href&&(L.location.href=a.href)}).attr({align:a.position.align,
260 zIndex:8}).css(a.style).add().align(a.position),this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var b=this,c=b.axes,g=b.series,d=b.container,e,h=d&&d.parentNode;k(b,"destroy");b.renderer.forExport?a.erase(u,b):u[b.index]=void 0;a.chartCount--;b.renderTo.removeAttribute("data-highcharts-chart");J(b);for(e=c.length;e--;)c[e]=c[e].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(e=g.length;e--;)g[e]=g[e].destroy();m("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "),
261 function(a){var c=b[a];c&&c.destroy&&(b[a]=c.destroy())});d&&(d.innerHTML="",J(d),h&&v(d));C(b,function(a,c){delete b[c]})},firstRender:function(){var a=this,b=a.options;if(!a.isReadyToRender||a.isReadyToRender()){a.getContainer();k(a,"init");a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();m(b.series||[],function(b){a.initSeries(b)});a.linkSeries();k(a,"beforeRender");x&&(a.pointer=new x(a,b));a.render();if(!a.renderer.imgCount&&a.onload)a.onload();a.temporaryDisplay(!0)}},onload:function(){m([this.callback].concat(this.callbacks),
262 function(a){a&&void 0!==this.index&&a.apply(this,[this])},this);k(this,"load");k(this,"render");b(this.index)&&!1!==this.options.chart.reflow&&this.initReflow();this.onload=null}})})(K);(function(a){var B,H=a.each,E=a.extend,q=a.erase,f=a.fireEvent,l=a.format,t=a.isArray,n=a.isNumber,v=a.pick,u=a.removeEvent;a.Point=B=function(){};a.Point.prototype={init:function(a,b,m){this.series=a;this.color=a.color;this.applyOptions(b,m);a.options.colorByPoint?(b=a.options.colors||a.chart.options.colors,this.color=
263 this.color||b[a.colorCounter],b=b.length,m=a.colorCounter,a.colorCounter++,a.colorCounter===b&&(a.colorCounter=0)):m=a.colorIndex;this.colorIndex=v(this.colorIndex,m);a.chart.pointCount++;f(this,"afterInit");return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey;a=B.prototype.optionsToObject.call(this,a);E(this,a);this.options=this.options?E(this.options,a):a;a.group&&delete this.group;d&&(this.y=this[d]);this.isNull=v(this.isValid&&!this.isValid(),null===
264 this.x||!n(this.y,!0));this.selected&&(this.state="select");"name"in this&&void 0===b&&c.xAxis&&c.xAxis.hasNames&&(this.x=c.xAxis.nameToX(this));void 0===this.x&&c&&(this.x=void 0===b?c.autoIncrement(this):b);return this},optionsToObject:function(a){var b={},c=this.series,d=c.options.keys,h=d||c.pointArrayMap||["y"],k=h.length,e=0,f=0;if(n(a)||null===a)b[h[0]]=a;else if(t(a))for(!d&&a.length>k&&(c=typeof a[0],"string"===c?b.name=a[0]:"number"===c&&(b.x=a[0]),e++);f<k;)d&&void 0===a[e]||(b[h[f]]=a[e]),
265 e++,f++;else"object"===typeof a&&(b=a,a.dataLabels&&(c._hasPointLabels=!0),a.marker&&(c._hasPointMarkers=!0));return b},getClassName:function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",
266 ""):"")},getZone:function(){var a=this.series,b=a.zones,a=a.zoneAxis||"y",f=0,d;for(d=b[f];this[a]>=d.value;)d=b[++f];d&&d.color&&!this.options.color&&(this.color=d.color);return d},destroy:function(){var a=this.series.chart,b=a.hoverPoints,f;a.pointCount--;b&&(this.setState(),q(b,this),b.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)u(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(f in this)this[f]=null},destroyElements:function(){for(var a=
267 ["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],b,f=6;f--;)b=a[f],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=v(c.valueDecimals,""),h=c.valuePrefix||"",k=c.valueSuffix||"";H(b.pointArrayMap||["y"],
268 function(b){b="{point."+b;if(h||k)a=a.replace(b+"}",h+b+"}"+k);a=a.replace(b+"}",b+":,."+d+"f}")});return l(a,{point:this,series:this.series},b.chart.time)},firePointEvent:function(a,b,m){var c=this,h=this.series.options;(h.point.events[a]||c.options&&c.options.events&&c.options.events[a])&&this.importEvents();"click"===a&&h.allowPointSelect&&(m=function(a){c.select&&c.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});f(this,a,b,m)},visible:!0}})(K);(function(a){var B=a.addEvent,H=a.animObject,E=a.arrayMax,
269 q=a.arrayMin,f=a.correctFloat,l=a.defaultOptions,t=a.defaultPlotOptions,n=a.defined,v=a.each,u=a.erase,c=a.extend,b=a.fireEvent,m=a.grep,d=a.isArray,h=a.isNumber,k=a.isString,e=a.merge,p=a.objectEach,r=a.pick,I=a.removeEvent,z=a.splat,M=a.SVGElement,D=a.syncTimeout,C=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:"#ffffff",enabledThreshold:2,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},
270 enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},
271 select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var d=this,e,h=a.series,g;d.chart=a;d.options=b=d.setOptions(b);d.linkedSeries=[];d.bindAxes();c(d,{name:b.name,state:"",visible:!1!==b.visible,selected:!0===b.selected});e=b.events;p(e,function(a,b){B(d,b,a)});if(e&&e.click||b.point&&b.point.events&&
272 b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();v(d.parallelArrays,function(a){d[a+"Data"]=[]});d.setData(b.data,!1);d.isCartesian&&(a.hasCartesianSeries=!0);h.length&&(g=h[h.length-1]);d._i=r(g&&g._i,-1)+1;a.orderSeries(this.insert(h))},insert:function(a){var b=this.options.index,c;if(h(b)){for(c=a.length;c--;)if(b>=r(a[c].options.index,a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return r(c,a.length-1)},bindAxes:function(){var b=
273 this,c=b.options,d=b.chart,e;v(b.axisTypes||[],function(h){v(d[h],function(a){e=a.options;if(c[h]===e.index||void 0!==c[h]&&c[h]===e.id||void 0===c[h]&&0===e.index)b.insert(a.series),b[h]=a,a.isDirty=!0});b[h]||b.optionalAxis===h||a.error(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments,e=h(b)?function(g){var d="y"===g&&c.toYData?c.toYData(a):a[g];c[g+"Data"][b]=d}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))};v(c.parallelArrays,e)},autoIncrement:function(){var a=
274 this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,e=this.chart.time,b=r(b,a.pointStart,0);this.pointInterval=c=r(this.pointInterval,a.pointInterval,1);d&&(a=new e.Date(b),"day"===d?e.set("Date",a,e.get("Date",a)+c):"month"===d?e.set("Month",a,e.get("Month",a)+c):"year"===d&&e.set("FullYear",a,e.get("FullYear",a)+c),c=a.getTime()-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options,d=c.plotOptions,h=(b.userOptions||{}).plotOptions||{},g=d[this.type];this.userOptions=
275 a;b=e(g,d.series,a);this.tooltipOptions=e(l.tooltip,l.plotOptions.series&&l.plotOptions.series.tooltip,l.plotOptions[this.type].tooltip,c.tooltip.userOptions,d.series&&d.series.tooltip,d[this.type].tooltip,a.tooltip);this.stickyTracking=r(a.stickyTracking,h[this.type]&&h[this.type].stickyTracking,h.series&&h.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:b.stickyTracking);null===g.marker&&delete b.marker;this.zoneAxis=b.zoneAxis;a=this.zones=(b.zones||[]).slice();!b.negativeColor&&
276 !b.negativeFillColor||b.zones||a.push({value:b[this.zoneAxis+"Threshold"]||b.threshold||0,className:"highcharts-negative",color:b.negativeColor,fillColor:b.negativeFillColor});a.length&&n(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});return b},getName:function(){return this.name||"Series "+(this.index+1)},getCyclic:function(a,b,c){var d,e=this.chart,g=this.userOptions,h=a+"Index",k=a+"Counter",f=c?c.length:r(e.options.chart[a+"Count"],e[a+"Count"]);b||(d=r(g[h],g["_"+h]),
277 n(d)||(e.series.length||(e[k]=0),g["_"+h]=d=e[k]%f,e[k]+=1),c&&(b=c[d]));void 0!==d&&(this[h]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||t[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(b,c,e,f){var m=this,g=m.points,l=g&&g.length||0,x,p=m.options,F=
278 m.chart,n=null,A=m.xAxis,z=p.turboThreshold,q=this.xData,D=this.yData,t=(x=m.pointArrayMap)&&x.length;b=b||[];x=b.length;c=r(c,!0);if(!1!==f&&x&&l===x&&!m.cropped&&!m.hasGroupedData&&m.visible)v(b,function(a,b){g[b].update&&a!==p.data[b]&&g[b].update(a,!1,null,!1)});else{m.xIncrement=null;m.colorCounter=0;v(this.parallelArrays,function(a){m[a+"Data"].length=0});if(z&&x>z){for(e=0;null===n&&e<x;)n=b[e],e++;if(h(n))for(e=0;e<x;e++)q[e]=this.autoIncrement(),D[e]=b[e];else if(d(n))if(t)for(e=0;e<x;e++)n=
279 b[e],q[e]=n[0],D[e]=n.slice(1,t+1);else for(e=0;e<x;e++)n=b[e],q[e]=n[0],D[e]=n[1];else a.error(12)}else for(e=0;e<x;e++)void 0!==b[e]&&(n={series:m},m.pointClass.prototype.applyOptions.apply(n,[b[e]]),m.updateParallelArrays(n,e));D&&k(D[0])&&a.error(14,!0);m.data=[];m.options.data=m.userOptions.data=b;for(e=l;e--;)g[e]&&g[e].destroy&&g[e].destroy();A&&(A.minRange=A.userMinRange);m.isDirty=F.isDirtyBox=!0;m.isDirtyData=!!g;e=!1}"point"===p.legendType&&(this.processData(),this.generatePoints());c&&
280 F.redraw(e)},processData:function(b){var c=this.xData,d=this.yData,e=c.length,h;h=0;var g,k,f=this.xAxis,m,l=this.options;m=l.cropThreshold;var x=this.getExtremesFromAll||l.getExtremesFromAll,p=this.isCartesian,l=f&&f.val2lin,n=f&&f.isLog,r=this.requireSorting,z,q;if(p&&!this.isDirty&&!f.isDirty&&!this.yAxis.isDirty&&!b)return!1;f&&(b=f.getExtremes(),z=b.min,q=b.max);if(p&&this.sorted&&!x&&(!m||e>m||this.forceCrop))if(c[e-1]<z||c[0]>q)c=[],d=[];else if(c[0]<z||c[e-1]>q)h=this.cropData(this.xData,
281 this.yData,z,q),c=h.xData,d=h.yData,h=h.start,g=!0;for(m=c.length||1;--m;)e=n?l(c[m])-l(c[m-1]):c[m]-c[m-1],0<e&&(void 0===k||e<k)?k=e:0>e&&r&&(a.error(15),r=!1);this.cropped=g;this.cropStart=h;this.processedXData=c;this.processedYData=d;this.closestPointRange=k},cropData:function(a,b,c,d){var e=a.length,g=0,h=e,k=r(this.cropShoulder,1),f;for(f=0;f<e;f++)if(a[f]>=c){g=Math.max(0,f-k);break}for(c=f;c<e;c++)if(a[c]>d){h=c+k;break}return{xData:a.slice(g,h),yData:b.slice(g,h),start:g,end:h}},generatePoints:function(){var a=
282 this.options,b=a.data,c=this.data,d,e=this.processedXData,g=this.processedYData,h=this.pointClass,k=e.length,f=this.cropStart||0,m,l=this.hasGroupedData,a=a.keys,p,n=[],r;c||l||(c=[],c.length=b.length,c=this.data=c);a&&l&&(this.options.keys=!1);for(r=0;r<k;r++)m=f+r,l?(p=(new h).init(this,[e[r]].concat(z(g[r]))),p.dataGroup=this.groupMap[r]):(p=c[m])||void 0===b[m]||(c[m]=p=(new h).init(this,b[m],e[r])),p&&(p.index=m,n[r]=p);this.options.keys=a;if(c&&(k!==(d=c.length)||l))for(r=0;r<d;r++)r!==f||l||
283 (r+=k),c[r]&&(c[r].destroyElements(),c[r].plotX=void 0);this.data=c;this.points=n},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,e,k=[],g=0;e=this.xAxis.getExtremes();var f=e.min,m=e.max,l,p,x,n;a=a||this.stackedYData||this.processedYData||[];e=a.length;for(n=0;n<e;n++)if(p=c[n],x=a[n],l=(h(x,!0)||d(x))&&(!b.positiveValuesOnly||x.length||0<x),p=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(c[n+1]||p)>=f&&(c[n-1]||p)<=m,l&&p)if(l=x.length)for(;l--;)"number"===
284 typeof x[l]&&(k[g++]=x[l]);else k[g++]=x;this.dataMin=q(k);this.dataMax=E(k)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,c=a.stacking,e=this.xAxis,d=e.categories,k=this.yAxis,g=this.points,m=g.length,l=!!this.modifyValue,p=a.pointPlacement,z="between"===p||h(p),q=a.threshold,D=a.startFromThreshold?q:0,t,C,v,u,M=Number.MAX_VALUE;"between"===p&&(p=.5);h(p)&&(p*=r(a.pointRange||e.pointRange));for(a=0;a<m;a++){var I=g[a],B=I.x,E=I.y;C=I.low;var H=
285 c&&k.stacks[(this.negStacks&&E<(D?0:q)?"-":"")+this.stackKey],K;k.positiveValuesOnly&&null!==E&&0>=E&&(I.isNull=!0);I.plotX=t=f(Math.min(Math.max(-1E5,e.translate(B,0,0,0,1,p,"flags"===this.type)),1E5));c&&this.visible&&!I.isNull&&H&&H[B]&&(u=this.getStackIndicator(u,B,this.index),K=H[B],E=K.points[u.key],C=E[0],E=E[1],C===D&&u.key===H[B].base&&(C=r(q,k.min)),k.positiveValuesOnly&&0>=C&&(C=null),I.total=I.stackTotal=K.total,I.percentage=K.total&&I.y/K.total*100,I.stackY=E,K.setOffset(this.pointXOffset||
286 0,this.barW||0));I.yBottom=n(C)?Math.min(Math.max(-1E5,k.translate(C,0,1,0,1)),1E5):null;l&&(E=this.modifyValue(E,I));I.plotY=C="number"===typeof E&&Infinity!==E?Math.min(Math.max(-1E5,k.translate(E,0,1,0,1)),1E5):void 0;I.isInside=void 0!==C&&0<=C&&C<=k.len&&0<=t&&t<=e.len;I.clientX=z?f(e.translate(B,0,0,0,1,p)):t;I.negative=I.y<(q||0);I.category=d&&void 0!==d[I.x]?d[I.x]:I.x;I.isNull||(void 0!==v&&(M=Math.min(M,Math.abs(t-v))),v=t);I.zone=this.zones.length&&I.getZone()}this.closestPointRangePx=
287 M;b(this,"afterTranslate")},getValidPoints:function(a,b){var c=this.chart;return m(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,e=b.renderer,d=b.inverted,g=this.clipBox,h=g||b.clipBox,k=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,h.height,c.xAxis,c.yAxis].join(),f=b[k],m=b[k+"m"];f||(a&&(h.width=0,d&&(h.x=b.plotSizeX),b[k+"m"]=m=e.clipRect(d?b.plotSizeX+99:-99,d?-b.plotLeft:
288 -b.plotTop,99,d?b.chartWidth:b.chartHeight)),b[k]=f=e.clipRect(h),f.count={length:0});a&&!f.count[this.index]&&(f.count[this.index]=!0,f.count.length+=1);!1!==c.clip&&(this.group.clip(a||g?f:b.clipRect),this.markerGroup.clip(m),this.sharedClipKey=k);a||(f.count[this.index]&&(delete f.count[this.index],--f.count.length),0===f.count.length&&k&&b[k]&&(g||(b[k]=b[k].destroy()),b[k+"m"]&&(b[k+"m"]=b[k+"m"].destroy())))},animate:function(a){var b=this.chart,c=H(this.options.animation),e;a?this.setClip(c):
289 (e=this.sharedClipKey,(a=b[e])&&a.animate({width:b.plotSizeX,x:0},c),b[e+"m"]&&b[e+"m"].animate({width:b.plotSizeX+99,x:0},c),this.animate=null)},afterAnimate:function(){this.setClip();b(this,"afterAnimate");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,c,e,d,g,h=this.options.marker,k,f,m,l=this[this.specialGroup]||this.markerGroup,p,n=r(h.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>=h.enabledThreshold*h.radius);if(!1!==h.enabled||this._hasPointMarkers)for(c=
290 0;c<a.length;c++)e=a[c],g=e.graphic,k=e.marker||{},f=!!e.marker,d=n&&void 0===k.enabled||k.enabled,m=e.isInside,d&&!e.isNull?(d=r(k.symbol,this.symbol),p=this.markerAttribs(e,e.selected&&"select"),g?g[m?"show":"hide"](!0).animate(p):m&&(0<p.width||e.hasImage)&&(e.graphic=g=b.renderer.symbol(d,p.x,p.y,p.width,p.height,f?k:h).add(l)),g&&g.attr(this.pointAttribs(e,e.selected&&"select")),g&&g.addClass(e.getClassName(),!0)):g&&(e.graphic=g.destroy())},markerAttribs:function(a,b){var c=this.options.marker,
291 e=a.marker||{},d=e.symbol||c.symbol,g=r(e.radius,c.radius);b&&(c=c.states[b],b=e.states&&e.states[b],g=r(b&&b.radius,c&&c.radius,g+(c&&c.radiusPlus||0)));a.hasImage=d&&0===d.indexOf("url");a.hasImage&&(g=0);a={x:Math.floor(a.plotX)-g,y:a.plotY-g};g&&(a.width=a.height=2*g);return a},pointAttribs:function(a,b){var c=this.options.marker,e=a&&a.options,d=e&&e.marker||{},g=this.color,h=e&&e.color,k=a&&a.color,e=r(d.lineWidth,c.lineWidth);a=a&&a.zone&&a.zone.color;g=h||a||k||g;a=d.fillColor||c.fillColor||
292 g;g=d.lineColor||c.lineColor||g;b&&(c=c.states[b],b=d.states&&d.states[b]||{},e=r(b.lineWidth,c.lineWidth,e+r(b.lineWidthPlus,c.lineWidthPlus,0)),a=b.fillColor||c.fillColor||a,g=b.lineColor||c.lineColor||g);return{stroke:g,"stroke-width":e,fill:a}},destroy:function(){var a=this,c=a.chart,e=/AppleWebKit\/533/.test(C.navigator.userAgent),d,h,g=a.data||[],k,f;b(a,"destroy");I(a);v(a.axisTypes||[],function(b){(f=a[b])&&f.series&&(u(f.series,a),f.isDirty=f.forceRedraw=!0)});a.legendItem&&a.chart.legend.destroyItem(a);
293 for(h=g.length;h--;)(k=g[h])&&k.destroy&&k.destroy();a.points=null;clearTimeout(a.animationTimeout);p(a,function(a,b){a instanceof M&&!a.survive&&(d=e&&"group"===b?"hide":"destroy",a[d]())});c.hoverSeries===a&&(c.hoverSeries=null);u(c.series,a);c.orderSeries();p(a,function(b,c){delete a[c]})},getGraphPath:function(a,b,c){var e=this,d=e.options,g=d.step,h,k=[],f=[],m;a=a||e.points;(h=a.reversed)&&a.reverse();(g={right:1,center:2}[g]||g&&3)&&h&&(g=4-g);!d.connectNulls||b||c||(a=this.getValidPoints(a));
294 v(a,function(h,l){var p=h.plotX,x=h.plotY,r=a[l-1];(h.leftCliff||r&&r.rightCliff)&&!c&&(m=!0);h.isNull&&!n(b)&&0<l?m=!d.connectNulls:h.isNull&&!b?m=!0:(0===l||m?l=["M",h.plotX,h.plotY]:e.getPointSpline?l=e.getPointSpline(a,h,l):g?(l=1===g?["L",r.plotX,x]:2===g?["L",(r.plotX+p)/2,r.plotY,"L",(r.plotX+p)/2,x]:["L",p,r.plotY],l.push("L",p,x)):l=["L",p,x],f.push(h.x),g&&f.push(h.x),k.push.apply(k,l),m=!1)});k.xMap=f;return e.graphPath=k},drawGraph:function(){var a=this,b=this.options,c=(this.gappedPath||
295 this.getGraphPath).call(this),e=[["graph","highcharts-graph",b.lineColor||this.color,b.dashStyle]];v(this.zones,function(c,d){e.push(["zone-graph-"+d,"highcharts-graph highcharts-zone-graph-"+d+" "+(c.className||""),c.color||a.color,c.dashStyle||b.dashStyle])});v(e,function(e,d){var g=e[0],h=a[g];h?(h.endX=a.preventGraphAnimation?null:c.xMap,h.animate({d:c})):c.length&&(a[g]=a.chart.renderer.path(c).addClass(e[1]).attr({zIndex:1}).add(a.group),h={stroke:e[2],"stroke-width":b.lineWidth,fill:a.fillGraph&&
296 a.color||"none"},e[3]?h.dashstyle=e[3]:"square"!==b.linecap&&(h["stroke-linecap"]=h["stroke-linejoin"]="round"),h=a[g].attr(h).shadow(2>d&&b.shadow));h&&(h.startX=c.xMap,h.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,e=this.zones,d,g,h=this.clips||[],k,f=this.graph,m=this.area,l=Math.max(b.chartWidth,b.chartHeight),p=this[(this.zoneAxis||"y")+"Axis"],n,z,q=b.inverted,D,t,C,u,M=!1;e.length&&(f||m)&&p&&void 0!==p.min&&(z=p.reversed,D=p.horiz,f&&f.hide(),m&&m.hide(),
297 n=p.getExtremes(),v(e,function(e,x){d=z?D?b.plotWidth:0:D?0:p.toPixels(n.min);d=Math.min(Math.max(r(g,d),0),l);g=Math.min(Math.max(Math.round(p.toPixels(r(e.value,n.max),!0)),0),l);M&&(d=g=p.toPixels(n.max));t=Math.abs(d-g);C=Math.min(d,g);u=Math.max(d,g);p.isXAxis?(k={x:q?u:C,y:0,width:t,height:l},D||(k.x=b.plotHeight-k.x)):(k={x:0,y:q?u:C,width:l,height:t},D&&(k.y=b.plotWidth-k.y));q&&c.isVML&&(k=p.isXAxis?{x:0,y:z?C:u,height:k.width,width:b.chartWidth}:{x:k.y-b.plotLeft-b.spacingBox.x,y:0,width:k.height,
298 height:b.chartHeight});h[x]?h[x].animate(k):(h[x]=c.clipRect(k),f&&a["zone-graph-"+x].clip(h[x]),m&&a["zone-area-"+x].clip(h[x]));M=e.value>n.max}),this.clips=h)},invertGroups:function(a){function b(){v(["group","markerGroup"],function(b){c[b]&&(e.renderer.isVML&&c[b].attr({width:c.yAxis.len,height:c.xAxis.len}),c[b].width=c.yAxis.len,c[b].height=c.xAxis.len,c[b].invert(a))})}var c=this,e=c.chart,d;c.xAxis&&(d=B(e,"resize",b),B(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,e,d){var g=
299 this[a],h=!g;h&&(this[a]=g=this.chart.renderer.g().attr({zIndex:e||.1}).add(d));g.addClass("highcharts-"+b+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(n(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(g.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);g.attr({visibility:c})[h?"attr":"animate"](this.getPlotBox());return g},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);
300 return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,c=a.chart,e,d=a.options,h=!!a.animate&&c.renderer.isSVG&&H(d.animation).duration,g=a.visible?"inherit":"hidden",k=d.zIndex,f=a.hasRendered,m=c.seriesGroup,l=c.inverted;e=a.plotGroup("group","series",g,k,m);a.markerGroup=a.plotGroup("markerGroup","markers",g,k,m);h&&a.animate(!0);e.inverted=a.isCartesian?l:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();
301 a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(l);!1===d.clip||a.sharedClipKey||f||e.clip(c.clipRect);h&&a.animate();f||(a.animationTimeout=D(function(){a.afterAnimate()},h));a.isDirty=!1;a.hasRendered=!0;b(a,"afterRender")},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,c=this.group,e=this.xAxis,d=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:r(e&&e.left,a.plotLeft),
302 translateY:r(d&&d.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,e=this.yAxis,d=this.chart.inverted;return this.searchKDTree({clientX:d?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:d?e.len-a.chartX+e.pos:a.chartY-e.pos},b)},buildKDTree:function(){function a(c,e,d){var g,h;if(h=c&&c.length)return g=b.kdAxisArray[e%d],c.sort(function(a,b){return a[g]-b[g]}),h=Math.floor(h/2),{point:c[h],left:a(c.slice(0,
303 h),e+1,d),right:a(c.slice(h+1),e+1,d)}}this.buildingKdTree=!0;var b=this,c=-1<b.options.findNearestPointBy.indexOf("y")?2:1;delete b.kdTree;D(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c);b.buildingKdTree=!1},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,k,f){var m=b.point,l=e.kdAxisArray[k%f],p,r,z=m;r=n(a[d])&&n(m[d])?Math.pow(a[d]-m[d],2):null;p=n(a[g])&&n(m[g])?Math.pow(a[g]-m[g],2):null;p=(r||0)+(p||0);m.dist=n(p)?Math.sqrt(p):Number.MAX_VALUE;m.distX=n(r)?
304 Math.sqrt(r):Number.MAX_VALUE;l=a[l]-m[l];p=0>l?"left":"right";r=0>l?"right":"left";b[p]&&(p=c(a,b[p],k+1,f),z=p[h]<z[h]?p:m);b[r]&&Math.sqrt(l*l)<z[h]&&(a=c(a,b[r],k+1,f),z=a[h]<z[h]?a:z);return z}var e=this,d=this.kdAxisArray[0],g=this.kdAxisArray[1],h=b?"distX":"dist";b=-1<e.options.findNearestPointBy.indexOf("y")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree();if(this.kdTree)return c(a,this.kdTree,b,b)}})})(K);(function(a){var B=a.Axis,H=a.Chart,E=a.correctFloat,q=a.defined,f=a.destroyObjectProperties,
305 l=a.each,t=a.format,n=a.objectEach,v=a.pick,u=a.Series;a.StackItem=function(a,b,f,d,h){var c=a.chart.inverted;this.axis=a;this.isNegative=f;this.options=b;this.x=d;this.total=null;this.points={};this.stack=h;this.rightCliff=this.leftCliff=0;this.alignOptions={align:b.align||(c?f?"left":"right":"center"),verticalAlign:b.verticalAlign||(c?"middle":f?"bottom":"top"),y:v(b.y,c?4:f?14:-6),x:v(b.x,c?f?-6:6:0)};this.textAlign=b.textAlign||(c?f?"right":"left":"center")};a.StackItem.prototype={destroy:function(){f(this,
306 this.axis)},render:function(a){var b=this.axis.chart,c=this.options,d=c.format,d=d?t(d,this,b.time):c.formatter.call(this);this.label?this.label.attr({text:d,visibility:"hidden"}):this.label=b.renderer.text(d,null,null,c.useHTML).css(c.style).attr({align:this.textAlign,rotation:c.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,h=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=Math.abs(h-c);a=d.xAxis[0].translate(this.x)+a;h=this.getStackBox(d,
307 this,a,h,b,c);if(b=this.label)b.align(this.alignOptions,null,h),h=b.alignAttr,b[!1===this.options.crop||d.isInsidePlot(h.x,h.y)?"show":"hide"](!0)},getStackBox:function(a,b,f,d,h,k){var c=b.axis.reversed,m=a.inverted;a=a.plotHeight;b=b.isNegative&&!c||!b.isNegative&&c;return{x:m?b?d:d-k:f,y:m?a-f-h:b?a-d-k:a-d,width:m?k:h,height:m?h:k}}};H.prototype.getStacks=function(){var a=this;l(a.yAxis,function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});l(a.series,function(b){!b.options.stacking||
308 !0!==b.visible&&!1!==a.options.chart.ignoreHiddenSeries||(b.stackKey=b.type+v(b.options.stack,""))})};B.prototype.buildStacks=function(){var a=this.series,b=v(this.options.reversedStacks,!0),f=a.length,d;if(!this.isXAxis){this.usePercentage=!1;for(d=f;d--;)a[b?d:f-d-1].setStackedPoints();for(d=0;d<f;d++)a[d].modifyStacks()}};B.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,f=this.stacks,d=this.stackTotalGroup;d||(this.stackTotalGroup=d=b.g("stack-labels").attr({visibility:"visible",
309 zIndex:6}).add());d.translate(a.plotLeft,a.plotTop);n(f,function(a){n(a,function(a){a.render(d)})})};B.prototype.resetStacks=function(){var a=this,b=a.stacks;a.isXAxis||n(b,function(b){n(b,function(c,h){c.touched<a.stacksTouched?(c.destroy(),delete b[h]):(c.total=null,c.cumulative=null)})})};B.prototype.cleanStacks=function(){var a;this.isXAxis||(this.oldStacks&&(a=this.stacks=this.oldStacks),n(a,function(a){n(a,function(a){a.cumulative=a.total})}))};u.prototype.setStackedPoints=function(){if(this.options.stacking&&
310 (!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var c=this.processedXData,b=this.processedYData,f=[],d=b.length,h=this.options,k=h.threshold,e=v(h.startFromThreshold&&k,0),l=h.stack,h=h.stacking,n=this.stackKey,t="-"+n,z=this.negStacks,u=this.yAxis,D=u.stacks,C=u.oldStacks,x,F,A,J,G,g,w;u.stacksTouched+=1;for(G=0;G<d;G++)g=c[G],w=b[G],x=this.getStackIndicator(x,g,this.index),J=x.key,A=(F=z&&w<(e?0:k))?t:n,D[A]||(D[A]={}),D[A][g]||(C[A]&&C[A][g]?(D[A][g]=C[A][g],D[A][g].total=
311 null):D[A][g]=new a.StackItem(u,u.options.stackLabels,F,g,l)),A=D[A][g],null!==w?(A.points[J]=A.points[this.index]=[v(A.cumulative,e)],q(A.cumulative)||(A.base=J),A.touched=u.stacksTouched,0<x.index&&!1===this.singleStacks&&(A.points[J][0]=A.points[this.index+","+g+",0"][0])):A.points[J]=A.points[this.index]=null,"percent"===h?(F=F?n:t,z&&D[F]&&D[F][g]?(F=D[F][g],A.total=F.total=Math.max(F.total,A.total)+Math.abs(w)||0):A.total=E(A.total+(Math.abs(w)||0))):A.total=E(A.total+(w||0)),A.cumulative=v(A.cumulative,
312 e)+(w||0),null!==w&&(A.points[J].push(A.cumulative),f[G]=A.cumulative);"percent"===h&&(u.usePercentage=!0);this.stackedYData=f;u.oldStacks={}}};u.prototype.modifyStacks=function(){var a=this,b=a.stackKey,f=a.yAxis.stacks,d=a.processedXData,h,k=a.options.stacking;a[k+"Stacker"]&&l([b,"-"+b],function(b){for(var c=d.length,e,l;c--;)if(e=d[c],h=a.getStackIndicator(h,e,a.index,b),l=(e=f[b]&&f[b][e])&&e.points[h.key])a[k+"Stacker"](l,e,c)})};u.prototype.percentStacker=function(a,b,f){b=b.total?100/b.total:
313 0;a[0]=E(a[0]*b);a[1]=E(a[1]*b);this.stackedYData[f]=a[1]};u.prototype.getStackIndicator=function(a,b,f,d){!q(a)||a.x!==b||d&&a.key!==d?a={x:b,index:0,key:d}:a.index++;a.key=[f,b,a.index].join();return a}})(K);(function(a){var B=a.addEvent,H=a.animate,E=a.Axis,q=a.createElement,f=a.css,l=a.defined,t=a.each,n=a.erase,v=a.extend,u=a.fireEvent,c=a.inArray,b=a.isNumber,m=a.isObject,d=a.isArray,h=a.merge,k=a.objectEach,e=a.pick,p=a.Point,r=a.Series,I=a.seriesTypes,z=a.setAnimation,M=a.splat;v(a.Chart.prototype,
314 {addSeries:function(a,b,c){var d,h=this;a&&(b=e(b,!0),u(h,"addSeries",{options:a},function(){d=h.initSeries(a);h.isDirtyLegend=!0;h.linkSeries();b&&h.redraw(c)}));return d},addAxis:function(a,b,c,d){var k=b?"xAxis":"yAxis",f=this.options;a=h(a,{index:this[k].length,isX:b});b=new E(this,a);f[k]=M(f[k]||{});f[k].push(a);e(c,!0)&&this.redraw(d);return b},showLoading:function(a){var b=this,c=b.options,e=b.loadingDiv,d=c.loading,h=function(){e&&f(e,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+
315 "px",height:b.plotHeight+"px"})};e||(b.loadingDiv=e=q("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container),b.loadingSpan=q("span",{className:"highcharts-loading-inner"},null,e),B(b,"redraw",h));e.className="highcharts-loading";b.loadingSpan.innerHTML=a||c.lang.loading;f(e,v(d.style,{zIndex:10}));f(b.loadingSpan,d.labelStyle);b.loadingShown||(f(e,{opacity:0,display:""}),H(e,{opacity:d.style.opacity||.5},{duration:d.showDuration||0}));b.loadingShown=!0;h()},hideLoading:function(){var a=
316 this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",H(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){f(b,{display:"none"})}}));this.loadingShown=!1},propsRequireDirtyBox:"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
317 propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "),update:function(a,d,f){var p=this,m={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle"},n=a.chart,r,g,z=[];if(n){h(!0,p.options.chart,n);"className"in n&&p.setClassName(n.className);if("inverted"in n||"polar"in n)p.propFromSeries(),r=!0;"alignTicks"in n&&(r=!0);k(n,function(a,b){-1!==c("chart."+b,p.propsRequireUpdateSeries)&&(g=!0);-1!==c(b,p.propsRequireDirtyBox)&&
318 (p.isDirtyBox=!0)});"style"in n&&p.renderer.setStyle(n.style)}a.colors&&(this.options.colors=a.colors);a.plotOptions&&h(!0,this.options.plotOptions,a.plotOptions);k(a,function(a,b){if(p[b]&&"function"===typeof p[b].update)p[b].update(a,!1);else if("function"===typeof p[m[b]])p[m[b]](a);"chart"!==b&&-1!==c(b,p.propsRequireUpdateSeries)&&(g=!0)});t("xAxis yAxis zAxis series colorAxis pane".split(" "),function(b){a[b]&&(t(M(a[b]),function(a,c){(c=l(a.id)&&p.get(a.id)||p[b][c])&&c.coll===b&&(c.update(a,
319 !1),f&&(c.touched=!0));if(!c&&f)if("series"===b)p.addSeries(a,!1).touched=!0;else if("xAxis"===b||"yAxis"===b)p.addAxis(a,"xAxis"===b,!1).touched=!0}),f&&t(p[b],function(a){a.touched?delete a.touched:z.push(a)}))});t(z,function(a){a.remove(!1)});r&&t(p.axes,function(a){a.update({},!1)});g&&t(p.series,function(a){a.update({},!1)});a.loading&&h(!0,p.options.loading,a.loading);r=n&&n.width;n=n&&n.height;b(r)&&r!==p.chartWidth||b(n)&&n!==p.chartHeight?p.setSize(r,n):e(d,!0)&&p.redraw()},setSubtitle:function(a){this.setTitle(void 0,
320 a)}});v(p.prototype,{update:function(a,b,c,d){function h(){k.applyOptions(a);null===k.y&&g&&(k.graphic=g.destroy());m(a,!0)&&(g&&g.element&&a&&a.marker&&void 0!==a.marker.symbol&&(k.graphic=g.destroy()),a&&a.dataLabels&&k.dataLabel&&(k.dataLabel=k.dataLabel.destroy()),k.connector&&(k.connector=k.connector.destroy()));p=k.index;f.updateParallelArrays(k,p);n.data[p]=m(n.data[p],!0)||m(a,!0)?k.options:a;f.isDirty=f.isDirtyData=!0;!f.fixedBox&&f.hasCartesianSeries&&(l.isDirtyBox=!0);"point"===n.legendType&&
321 (l.isDirtyLegend=!0);b&&l.redraw(c)}var k=this,f=k.series,g=k.graphic,p,l=f.chart,n=f.options;b=e(b,!0);!1===d?h():k.firePointEvent("update",{options:a},h)},remove:function(a,b){this.series.removePoint(c(this,this.series.data),a,b)}});v(r.prototype,{addPoint:function(a,b,c,d){var h=this.options,k=this.data,f=this.chart,g=this.xAxis,g=g&&g.hasNames&&g.names,p=h.data,l,m,n=this.xData,r,z;b=e(b,!0);l={series:this};this.pointClass.prototype.applyOptions.apply(l,[a]);z=l.x;r=n.length;if(this.requireSorting&&
322 z<n[r-1])for(m=!0;r&&n[r-1]>z;)r--;this.updateParallelArrays(l,"splice",r,0,0);this.updateParallelArrays(l,r);g&&l.name&&(g[z]=l.name);p.splice(r,0,a);m&&(this.data.splice(r,0,null),this.processData());"point"===h.legendType&&this.generatePoints();c&&(k[0]&&k[0].remove?k[0].remove(!1):(k.shift(),this.updateParallelArrays(l,"shift"),p.shift()));this.isDirtyData=this.isDirty=!0;b&&f.redraw(d)},removePoint:function(a,b,c){var d=this,h=d.data,k=h[a],f=d.points,g=d.chart,p=function(){f&&f.length===h.length&&
323 f.splice(a,1);h.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(k||{series:d},"splice",a,1);k&&k.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&g.redraw()};z(c,g);b=e(b,!0);k?k.firePointEvent("remove",null,p):p()},remove:function(a,b,c){function d(){h.destroy();k.isDirtyLegend=k.isDirtyBox=!0;k.linkSeries();e(a,!0)&&k.redraw(b)}var h=this,k=h.chart;!1!==c?u(h,"remove",null,d):d()},update:function(a,b){var c=this,d=c.chart,k=c.userOptions,f=c.oldType||c.type,p=a.type||k.type||d.options.chart.type,
324 g=I[f].prototype,l,m=["group","markerGroup","dataLabelsGroup"],n=["navigatorSeries","baseSeries"],r=c.finishedAnimating&&{animation:!1};if(Object.keys&&"data"===Object.keys(a).toString())return this.setData(a.data,b);n=m.concat(n);t(n,function(a){n[a]=c[a];delete c[a]});a=h(k,r,{index:c.index,pointStart:c.xData[0]},{data:c.options.data},a);c.remove(!1,null,!1);for(l in g)c[l]=void 0;v(c,I[p||f].prototype);t(n,function(a){c[a]=n[a]});c.init(d,a);a.zIndex!==k.zIndex&&t(m,function(b){c[b]&&c[b].attr({zIndex:a.zIndex})});
325 c.oldType=f;d.linkSeries();e(b,!0)&&d.redraw(!1)}});v(E.prototype,{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,v(a,{events:void 0}));c.isDirtyBox=!0;e(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,h=this.series,k=h.length;k--;)h[k]&&h[k].remove(!1);n(b.axes,this);n(b[c],this);d(b.options[c])?b.options[c].splice(this.options.index,1):delete b.options[c];t(b[c],function(a,b){a.options.index=
326 b});this.destroy();b.isDirtyBox=!0;e(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(K);(function(a){var B=a.color,H=a.each,E=a.map,q=a.pick,f=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(f){var l=[],t=[],u=this.xAxis,c=this.yAxis,b=c.stacks[this.stackKey],m={},d=this.index,h=c.series,k=h.length,e,p=q(c.options.reversedStacks,!0)?1:-1,r;f=f||this.points;
327 if(this.options.stacking){for(r=0;r<f.length;r++)f[r].leftNull=f[r].rightNull=null,m[f[r].x]=f[r];a.objectEach(b,function(a,b){null!==a.total&&t.push(b)});t.sort(function(a,b){return a-b});e=E(h,function(){return this.visible});H(t,function(a,h){var f=0,n,z;if(m[a]&&!m[a].isNull)l.push(m[a]),H([-1,1],function(c){var f=1===c?"rightNull":"leftNull",l=0,q=b[t[h+c]];if(q)for(r=d;0<=r&&r<k;)n=q.points[r],n||(r===d?m[a][f]=!0:e[r]&&(z=b[a].points[r])&&(l-=z[1]-z[0])),r+=p;m[a][1===c?"rightCliff":"leftCliff"]=
328 l});else{for(r=d;0<=r&&r<k;){if(n=b[a].points[r]){f=n[1];break}r+=p}f=c.translate(f,0,1,0,1);l.push({isNull:!0,plotX:u.translate(a,0,0,0,1),x:a,plotY:f,yBottom:f})}})}return l},getGraphPath:function(a){var l=f.prototype.getGraphPath,t=this.options,u=t.stacking,c=this.yAxis,b,m,d=[],h=[],k=this.index,e,p=c.stacks[this.stackKey],r=t.threshold,I=c.getThreshold(t.threshold),z,t=t.connectNulls||"percent"===u,M=function(b,f,l){var m=a[b];b=u&&p[m.x].points[k];var n=m[l+"Null"]||0;l=m[l+"Cliff"]||0;var z,
329 q,m=!0;l||n?(z=(n?b[0]:b[1])+l,q=b[0]+l,m=!!n):!u&&a[f]&&a[f].isNull&&(z=q=r);void 0!==z&&(h.push({plotX:e,plotY:null===z?I:c.getThreshold(z),isNull:m,isCliff:!0}),d.push({plotX:e,plotY:null===q?I:c.getThreshold(q),doCurve:!1}))};a=a||this.points;u&&(a=this.getStackPoints(a));for(b=0;b<a.length;b++)if(m=a[b].isNull,e=q(a[b].rectPlotX,a[b].plotX),z=q(a[b].yBottom,I),!m||t)t||M(b,b-1,"left"),m&&!u&&t||(h.push(a[b]),d.push({x:b,plotX:e,plotY:z})),t||M(b,b+1,"right");b=l.call(this,h,!0,!0);d.reversed=
330 !0;m=l.call(this,d,!0,!0);m.length&&(m[0]="L");m=b.concat(m);l=l.call(this,h,!1,t);m.xMap=b.xMap;this.areaPath=m;return l},drawGraph:function(){this.areaPath=[];f.prototype.drawGraph.apply(this);var a=this,l=this.areaPath,v=this.options,u=[["area","highcharts-area",this.color,v.fillColor]];H(this.zones,function(c,b){u.push(["zone-area-"+b,"highcharts-area highcharts-zone-area-"+b+" "+c.className,c.color||a.color,c.fillColor||v.fillColor])});H(u,function(c){var b=c[0],f=a[b];f?(f.endX=a.preventGraphAnimation?
331 null:l.xMap,f.animate({d:l})):(f=a[b]=a.chart.renderer.path(l).addClass(c[1]).attr({fill:q(c[3],B(c[2]).setOpacity(q(v.fillOpacity,.75)).get()),zIndex:0}).add(a.group),f.isArea=!0);f.startX=l.xMap;f.shiftUnit=v.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(K);(function(a){var B=a.pick;a=a.seriesType;a("spline","line",{},{getPointSpline:function(a,E,q){var f=E.plotX,l=E.plotY,t=a[q-1];q=a[q+1];var n,v,u,c;if(t&&!t.isNull&&!1!==t.doCurve&&!E.isCliff&&q&&!q.isNull&&!1!==q.doCurve&&
332 !E.isCliff){a=t.plotY;u=q.plotX;q=q.plotY;var b=0;n=(1.5*f+t.plotX)/2.5;v=(1.5*l+a)/2.5;u=(1.5*f+u)/2.5;c=(1.5*l+q)/2.5;u!==n&&(b=(c-v)*(u-f)/(u-n)+l-c);v+=b;c+=b;v>a&&v>l?(v=Math.max(a,l),c=2*l-v):v<a&&v<l&&(v=Math.min(a,l),c=2*l-v);c>q&&c>l?(c=Math.max(q,l),v=2*l-c):c<q&&c<l&&(c=Math.min(q,l),v=2*l-c);E.rightContX=u;E.rightContY=c}E=["C",B(t.rightContX,t.plotX),B(t.rightContY,t.plotY),B(n,f),B(v,l),f,l];t.rightContX=t.rightContY=null;return E}})})(K);(function(a){var B=a.seriesTypes.area.prototype,
333 H=a.seriesType;H("areaspline","spline",a.defaultPlotOptions.area,{getStackPoints:B.getStackPoints,getGraphPath:B.getGraphPath,drawGraph:B.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(K);(function(a){var B=a.animObject,H=a.color,E=a.each,q=a.extend,f=a.isNumber,l=a.merge,t=a.pick,n=a.Series,v=a.seriesType,u=a.svg;v("column","line",{borderRadius:0,crisp:!0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},
334 select:{color:"#cccccc",borderColor:"#000000"}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"},{cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){n.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&E(b.series,function(b){b.type===a.type&&(b.isDirty=!0)})},getColumnMetrics:function(){var a=this,b=a.options,f=a.xAxis,
335 d=a.yAxis,h=f.reversed,k,e={},l=0;!1===b.grouping?l=1:E(a.chart.series,function(b){var c=b.options,h=b.yAxis,f;b.type!==a.type||!b.visible&&a.chart.options.chart.ignoreHiddenSeries||d.len!==h.len||d.pos!==h.pos||(c.stacking?(k=b.stackKey,void 0===e[k]&&(e[k]=l++),f=e[k]):!1!==c.grouping&&(f=l++),b.columnIndex=f)});var n=Math.min(Math.abs(f.transA)*(f.ordinalSlope||b.pointRange||f.closestPointRange||f.tickInterval||1),f.len),q=n*b.groupPadding,z=(n-2*q)/(l||1),b=Math.min(b.maxPointWidth||f.len,t(b.pointWidth,
336 z*(1-2*b.pointPadding)));a.columnMetrics={width:b,offset:(z-b)/2+(q+((a.columnIndex||0)+(h?1:0))*z-n/2)*(h?-1:1)};return a.columnMetrics},crispCol:function(a,b,f,d){var c=this.chart,k=this.borderWidth,e=-(k%2?.5:0),k=k%2?.5:1;c.inverted&&c.renderer.isVML&&(k+=1);this.options.crisp&&(f=Math.round(a+f)+e,a=Math.round(a)+e,f-=a);d=Math.round(b+d)+k;e=.5>=Math.abs(b)&&.5<d;b=Math.round(b)+k;d-=b;e&&d&&(--b,d+=1);return{x:a,y:b,width:f,height:d}},translate:function(){var a=this,b=a.chart,f=a.options,d=
337 a.dense=2>a.closestPointRange*a.xAxis.transA,d=a.borderWidth=t(f.borderWidth,d?0:1),h=a.yAxis,k=f.threshold,e=a.translatedThreshold=h.getThreshold(k),l=t(f.minPointLength,5),r=a.getColumnMetrics(),q=r.width,z=a.barW=Math.max(q,1+2*d),u=a.pointXOffset=r.offset;b.inverted&&(e-=.5);f.pointPadding&&(z=Math.ceil(z));n.prototype.translate.apply(a);E(a.points,function(c){var d=t(c.yBottom,e),f=999+Math.abs(d),f=Math.min(Math.max(-f,c.plotY),h.len+f),p=c.plotX+u,m=z,n=Math.min(f,d),r,g=Math.max(f,d)-n;l&&
338 Math.abs(g)<l&&(g=l,r=!h.reversed&&!c.negative||h.reversed&&c.negative,c.y===k&&a.dataMax<=k&&h.min<k&&(r=!r),n=Math.abs(n-e)>l?d-l:e-(r?l:0));c.barX=p;c.pointWidth=q;c.tooltipPos=b.inverted?[h.len+h.pos-b.plotLeft-f,a.xAxis.len-p-m/2,g]:[p+m/2,f+h.pos-b.plotTop,g];c.shapeType="rect";c.shapeArgs=a.crispCol.apply(a,c.isNull?[p,e,m,0]:[p,n,m,g])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},
339 pointAttribs:function(a,b){var c=this.options,d,h=this.pointAttrToOptions||{};d=h.stroke||"borderColor";var f=h["stroke-width"]||"borderWidth",e=a&&a.color||this.color,p=a&&a[d]||c[d]||this.color||e,n=a&&a[f]||c[f]||this[f]||0,h=c.dashStyle;a&&this.zones.length&&(e=a.getZone(),e=a.options.color||e&&e.color||this.color);b&&(a=l(c.states[b],a.options.states&&a.options.states[b]||{}),b=a.brightness,e=a.color||void 0!==b&&H(e).brighten(a.brightness).get()||e,p=a[d]||p,n=a[f]||n,h=a.dashStyle||h);d={fill:e,
340 stroke:p,"stroke-width":n};h&&(d.dashstyle=h);return d},drawPoints:function(){var a=this,b=this.chart,m=a.options,d=b.renderer,h=m.animationLimit||250,k;E(a.points,function(c){var e=c.graphic;if(f(c.plotY)&&null!==c.y){k=c.shapeArgs;if(e)e[b.pointCount<h?"animate":"attr"](l(k));else c.graphic=e=d[c.shapeType](k).add(c.group||a.group);m.borderRadius&&e.attr({r:m.borderRadius});e.attr(a.pointAttribs(c,c.selected&&"select")).shadow(m.shadow,null,m.stacking&&!m.borderRadius);e.addClass(c.getClassName(),
341 !0)}else e&&(c.graphic=e.destroy())})},animate:function(a){var b=this,c=this.yAxis,d=b.options,h=this.chart.inverted,f={},e=h?"translateX":"translateY",l;u&&(a?(f.scaleY=.001,a=Math.min(c.pos+c.len,Math.max(c.pos,c.toPixels(d.threshold))),h?f.translateX=a-c.len:f.translateY=a,b.group.attr(f)):(l=b.group.attr(e),b.group.animate({scaleY:1},q(B(b.options.animation),{step:function(a,d){f[e]=l+d.pos*(c.pos-l);b.group.attr(f)}})),b.animate=null))},remove:function(){var a=this,b=a.chart;b.hasRendered&&E(b.series,
342 function(b){b.type===a.type&&(b.isDirty=!0)});n.prototype.remove.apply(a,arguments)}})})(K);(function(a){a=a.seriesType;a("bar","column",null,{inverted:!0})})(K);(function(a){var B=a.Series;a=a.seriesType;a("scatter","line",{lineWidth:0,findNearestPointBy:"xy",marker:{enabled:!0},tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"}},
343 {sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&B.prototype.drawGraph.call(this)}})})(K);(function(a){var B=a.deg2rad,H=a.isNumber,E=a.pick,q=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,l=this.chart,t=2*(a.slicedOffset||0),n=l.plotWidth-2*t,l=l.plotHeight-2*t,v=a.center,v=[E(v[0],"50%"),E(v[1],"50%"),a.size||"100%",a.innerSize||0],u=Math.min(n,
344 l),c,b;for(c=0;4>c;++c)b=v[c],a=2>c||2===c&&/%$/.test(b),v[c]=q(b,[n,l,u,v[2]][c])+(a?t:0);v[3]>v[2]&&(v[3]=v[2]);return v},getStartAndEndRadians:function(a,l){a=H(a)?a:0;l=H(l)&&l>a&&360>l-a?l:a+360;return{start:B*(a+-90),end:B*(l+-90)}}}})(K);(function(a){var B=a.addEvent,H=a.CenteredSeriesMixin,E=a.defined,q=a.each,f=a.extend,l=H.getStartAndEndRadians,t=a.inArray,n=a.noop,v=a.pick,u=a.Point,c=a.Series,b=a.seriesType,m=a.setAnimation;b("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,
345 enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var b=this,
346 c=b.points,d=b.startAngleRad;a||(q(c,function(a){var c=a.graphic,e=a.shapeArgs;c&&(c.attr({r:a.startR||b.center[3]/2,start:d,end:d}),c.animate({r:e.r,start:e.start,end:e.end},b.options.animation))}),b.animate=null)},updateTotals:function(){var a,b=0,c=this.points,e=c.length,f,l=this.options.ignoreHiddenPoint;for(a=0;a<e;a++)f=c[a],b+=l&&!f.visible?0:f.isNull?0:f.y;this.total=b;for(a=0;a<e;a++)f=c[a],f.percentage=0<b&&(f.visible||!l)?f.y/b*100:0,f.total=b},generatePoints:function(){c.prototype.generatePoints.call(this);
347 this.updateTotals()},translate:function(a){this.generatePoints();var b=0,c=this.options,e=c.slicedOffset,d=e+(c.borderWidth||0),f,m,n,q=l(c.startAngle,c.endAngle),t=this.startAngleRad=q.start,q=(this.endAngleRad=q.end)-t,u=this.points,x,F=c.dataLabels.distance,c=c.ignoreHiddenPoint,A,B=u.length,G;a||(this.center=a=this.getCenter());this.getX=function(b,c,e){n=Math.asin(Math.min((b-a[1])/(a[2]/2+e.labelDistance),1));return a[0]+(c?-1:1)*Math.cos(n)*(a[2]/2+e.labelDistance)};for(A=0;A<B;A++){G=u[A];
348 G.labelDistance=v(G.options.dataLabels&&G.options.dataLabels.distance,F);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,G.labelDistance);f=t+b*q;if(!c||G.visible)b+=G.percentage/100;m=t+b*q;G.shapeType="arc";G.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*f)/1E3,end:Math.round(1E3*m)/1E3};n=(m+f)/2;n>1.5*Math.PI?n-=2*Math.PI:n<-Math.PI/2&&(n+=2*Math.PI);G.slicedTranslation={translateX:Math.round(Math.cos(n)*e),translateY:Math.round(Math.sin(n)*e)};m=Math.cos(n)*a[2]/
349 2;x=Math.sin(n)*a[2]/2;G.tooltipPos=[a[0]+.7*m,a[1]+.7*x];G.half=n<-Math.PI/2||n>Math.PI/2?1:0;G.angle=n;f=Math.min(d,G.labelDistance/5);G.labelPos=[a[0]+m+Math.cos(n)*G.labelDistance,a[1]+x+Math.sin(n)*G.labelDistance,a[0]+m+Math.cos(n)*f,a[1]+x+Math.sin(n)*f,a[0]+m,a[1]+x,0>G.labelDistance?"center":G.half?"right":"left",n]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,e,l,m,n=a.options.shadow;n&&!a.shadowGroup&&(a.shadowGroup=b.g("shadow").add(a.group));q(a.points,function(d){e=
350 d.graphic;if(d.isNull)e&&(d.graphic=e.destroy());else{m=d.shapeArgs;c=d.getTranslate();var h=d.shadowGroup;n&&!h&&(h=d.shadowGroup=b.g("shadow").add(a.shadowGroup));h&&h.attr(c);l=a.pointAttribs(d,d.selected&&"select");e?e.setRadialReference(a.center).attr(l).animate(f(m,c)):(d.graphic=e=b[d.shapeType](m).setRadialReference(a.center).attr(c).add(a.group),d.visible||e.attr({visibility:"hidden"}),e.attr(l).attr({"stroke-linejoin":"round"}).shadow(n,h));e.addClass(d.getClassName())}})},searchPoint:n,
351 sortByAngle:function(a,b){a.sort(function(a,c){return void 0!==a.angle&&(c.angle-a.angle)*b})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:H.getCenter,getSymbol:n},{init:function(){u.prototype.init.apply(this,arguments);var a=this,b;a.name=v(a.name,"Slice");b=function(b){a.slice("select"===b.type)};B(a,"select",b);B(a,"unselect",b);return a},isValid:function(){return a.isNumber(this.y,!0)&&0<=this.y},setVisible:function(a,b){var c=this,e=c.series,d=e.chart,h=e.options.ignoreHiddenPoint;
352 b=v(b,h);a!==c.visible&&(c.visible=c.options.visible=a=void 0===a?!c.visible:a,e.options.data[t(c,e.data)]=c.options,q(["graphic","dataLabel","connector","shadowGroup"],function(b){if(c[b])c[b][a?"show":"hide"](!0)}),c.legendItem&&d.legend.colorizeItem(c,a),a||"hover"!==c.state||c.setState(""),h&&(e.isDirty=!0),b&&d.redraw())},slice:function(a,b,c){var e=this.series;m(c,e.chart);v(b,!0);this.sliced=this.options.sliced=E(a)?a:!this.sliced;e.options.data[t(this,e.data)]=this.options;this.graphic.animate(this.getTranslate());
353 this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var b=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(b.x,b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r-1,start:b.start,end:b.end})}})})(K);(function(a){var B=a.addEvent,H=a.arrayMax,E=a.defined,q=a.each,f=a.extend,l=a.format,t=a.map,n=a.merge,v=a.noop,u=a.pick,c=a.relativeLength,b=
354 a.Series,m=a.seriesTypes,d=a.stableSort;a.distribute=function(a,b){function c(a,b){return a.target-b.target}var f,h=!0,k=a,l=[],m;m=0;for(f=a.length;f--;)m+=a[f].size;if(m>b){d(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(m=f=0;m<=b;)m+=a[f].size,f++;l=a.splice(f-1,a.length)}d(a,c);for(a=t(a,function(a){return{size:a.size,targets:[a.target],align:u(a.align,.5)}});h;){for(f=a.length;f--;)h=a[f],m=(Math.min.apply(0,h.targets)+Math.max.apply(0,h.targets))/2,h.pos=Math.min(Math.max(0,m-h.size*
355 h.align),b-h.size);f=a.length;for(h=!1;f--;)0<f&&a[f-1].pos+a[f-1].size>a[f].pos&&(a[f-1].size+=a[f].size,a[f-1].targets=a[f-1].targets.concat(a[f].targets),a[f-1].align=.5,a[f-1].pos+a[f-1].size>b&&(a[f-1].pos=b-a[f-1].size),a.splice(f,1),h=!0)}f=0;q(a,function(a){var b=0;q(a.targets,function(){k[f].pos=a.pos+b;b+=k[f].size;f++})});k.push.apply(k,l);d(k,c)};b.prototype.drawDataLabels=function(){function b(a,b){var c=b.filter;return c?(b=c.operator,a=a[c.property],c=c.value,"\x3e"===b&&a>c||"\x3c"===
356 b&&a<c||"\x3e\x3d"===b&&a>=c||"\x3c\x3d"===b&&a<=c||"\x3d\x3d"===b&&a==c||"\x3d\x3d\x3d"===b&&a===c?!0:!1):!0}var c=this,e=c.chart,d=c.options,f=d.dataLabels,m=c.points,z,t,v=c.hasRendered||0,C,x,F=u(f.defer,!!d.animation),A=e.renderer;if(f.enabled||c._hasPointLabels)c.dlProcessOptions&&c.dlProcessOptions(f),x=c.plotGroup("dataLabelsGroup","data-labels",F&&!v?"hidden":"visible",f.zIndex||6),F&&(x.attr({opacity:+v}),v||B(c,"afterAnimate",function(){c.visible&&x.show(!0);x[d.animation?"animate":"attr"]({opacity:1},
357 {duration:200})})),t=f,q(m,function(h){var k,g=h.dataLabel,m,p,q=h.connector,r=!g,v;z=h.dlOptions||h.options&&h.options.dataLabels;(k=u(z&&z.enabled,t.enabled)&&!h.isNull)&&(k=!0===b(h,z||f));k&&(f=n(t,z),m=h.getLabelConfig(),v=f[h.formatPrefix+"Format"]||f.format,C=E(v)?l(v,m,e.time):(f[h.formatPrefix+"Formatter"]||f.formatter).call(m,f),v=f.style,m=f.rotation,v.color=u(f.color,v.color,c.color,"#000000"),"contrast"===v.color&&(h.contrastColor=A.getContrast(h.color||c.color),v.color=f.inside||0>u(h.labelDistance,
358 f.distance)||d.stacking?h.contrastColor:"#000000"),d.cursor&&(v.cursor=d.cursor),p={fill:f.backgroundColor,stroke:f.borderColor,"stroke-width":f.borderWidth,r:f.borderRadius||0,rotation:m,padding:f.padding,zIndex:1},a.objectEach(p,function(a,b){void 0===a&&delete p[b]}));!g||k&&E(C)?k&&E(C)&&(g?p.text=C:(g=h.dataLabel=m?A.text(C,0,-9999).addClass("highcharts-data-label"):A.label(C,0,-9999,f.shape,null,null,f.useHTML,null,"data-label"),g.addClass(" highcharts-data-label-color-"+h.colorIndex+" "+(f.className||
359 "")+(f.useHTML?"highcharts-tracker":""))),g.attr(p),g.css(v).shadow(f.shadow),g.added||g.add(x),c.alignDataLabel(h,g,f,null,r)):(h.dataLabel=g=g.destroy(),q&&(h.connector=q.destroy()))});a.fireEvent(this,"afterDrawDataLabels")};b.prototype.alignDataLabel=function(a,b,c,d,l){var e=this.chart,h=e.inverted,k=u(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),m=u(a.plotY,-9999),n=b.getBBox(),p,q=c.rotation,r=c.align,t=this.visible&&(a.series.forceDL||e.isInsidePlot(k,Math.round(m),h)||d&&e.isInsidePlot(k,h?d.x+
360 1:d.y+d.height-1,h)),v="justify"===u(c.overflow,"justify");if(t&&(p=c.style.fontSize,p=e.renderer.fontMetrics(p,b).b,d=f({x:h?this.yAxis.len-m:k,y:Math.round(h?this.xAxis.len-k:m),width:0,height:0},d),f(c,{width:n.width,height:n.height}),q?(v=!1,k=e.renderer.rotCorr(p,q),k={x:d.x+c.x+d.width/2+k.x,y:d.y+c.y+{top:0,middle:.5,bottom:1}[c.verticalAlign]*d.height},b[l?"attr":"animate"](k).attr({align:r}),m=(q+720)%360,m=180<m&&360>m,"left"===r?k.y-=m?n.height:0:"center"===r?(k.x-=n.width/2,k.y-=n.height/
361 2):"right"===r&&(k.x-=n.width,k.y-=m?0:n.height)):(b.align(c,null,d),k=b.alignAttr),v?a.isLabelJustified=this.justifyDataLabel(b,c,k,n,d,l):u(c.crop,!0)&&(t=e.isInsidePlot(k.x,k.y)&&e.isInsidePlot(k.x+n.width,k.y+n.height)),c.shape&&!q))b[l?"attr":"animate"]({anchorX:h?e.plotWidth-a.plotY:a.plotX,anchorY:h?e.plotHeight-a.plotX:a.plotY});t||(b.attr({y:-9999}),b.placed=!1)};b.prototype.justifyDataLabel=function(a,b,c,d,f,l){var e=this.chart,h=b.align,k=b.verticalAlign,m,n,p=a.box?0:a.padding||0;m=c.x+
362 p;0>m&&("right"===h?b.align="left":b.x=-m,n=!0);m=c.x+d.width-p;m>e.plotWidth&&("left"===h?b.align="right":b.x=e.plotWidth-m,n=!0);m=c.y+p;0>m&&("bottom"===k?b.verticalAlign="top":b.y=-m,n=!0);m=c.y+d.height-p;m>e.plotHeight&&("top"===k?b.verticalAlign="bottom":b.y=e.plotHeight-m,n=!0);n&&(a.placed=!l,a.align(b,null,f));return n};m.pie&&(m.pie.prototype.drawDataLabels=function(){var c=this,d=c.data,e,f=c.chart,l=c.options.dataLabels,m=u(l.connectorPadding,10),n=u(l.connectorWidth,1),t=f.plotWidth,
363 v=f.plotHeight,C,x=c.center,F=x[2]/2,A=x[1],B,G,g,w,L=[[],[]],P,N,O,K,y=[0,0,0,0];c.visible&&(l.enabled||c._hasPointLabels)&&(q(d,function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),b.prototype.drawDataLabels.apply(c),q(d,function(a){a.dataLabel&&a.visible&&(L[a.half].push(a),a.dataLabel._pos=null)}),q(L,function(b,d){var h,k,n=b.length,p=[],r;if(n)for(c.sortByAngle(b,d-.5),0<c.maxLabelDistance&&
364 (h=Math.max(0,A-F-c.maxLabelDistance),k=Math.min(A+F+c.maxLabelDistance,f.plotHeight),q(b,function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,A-F-a.labelDistance),a.bottom=Math.min(A+F+a.labelDistance,f.plotHeight),r=a.dataLabel.getBBox().height||21,a.positionsIndex=p.push({target:a.labelPos[1]-a.top+r/2,size:r,rank:a.y})-1)}),a.distribute(p,k+r-h)),K=0;K<n;K++)e=b[K],k=e.positionsIndex,g=e.labelPos,B=e.dataLabel,O=!1===e.visible?"hidden":"inherit",N=h=g[1],p&&E(p[k])&&(void 0===p[k].pos?
365 O="hidden":(w=p[k].size,N=e.top+p[k].pos)),delete e.positionIndex,P=l.justify?x[0]+(d?-1:1)*(F+e.labelDistance):c.getX(N<e.top+2||N>e.bottom-2?h:N,d,e),B._attr={visibility:O,align:g[6]},B._pos={x:P+l.x+({left:m,right:-m}[g[6]]||0),y:N+l.y-10},g.x=P,g.y=N,u(l.crop,!0)&&(G=B.getBBox().width,h=null,P-G<m?(h=Math.round(G-P+m),y[3]=Math.max(h,y[3])):P+G>t-m&&(h=Math.round(P+G-t+m),y[1]=Math.max(h,y[1])),0>N-w/2?y[0]=Math.max(Math.round(-N+w/2),y[0]):N+w/2>v&&(y[2]=Math.max(Math.round(N+w/2-v),y[2])),B.sideOverflow=
366 h)}),0===H(y)||this.verifyDataLabelOverflow(y))&&(this.placeDataLabels(),n&&q(this.points,function(a){var b;C=a.connector;if((B=a.dataLabel)&&B._pos&&a.visible&&0<a.labelDistance){O=B._attr.visibility;if(b=!C)a.connector=C=f.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-"+a.colorIndex).add(c.dataLabelsGroup),C.attr({"stroke-width":n,stroke:l.connectorColor||a.color||"#666666"});C[b?"attr":"animate"]({d:c.connectorPath(a.labelPos)});C.attr("visibility",O)}else C&&(a.connector=
367 C.destroy())}))},m.pie.prototype.connectorPath=function(a){var b=a.x,c=a.y;return u(this.options.dataLabels.softConnector,!0)?["M",b+("left"===a[6]?5:-5),c,"C",b,c,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",b+("left"===a[6]?5:-5),c,"L",a[2],a[3],"L",a[4],a[5]]},m.pie.prototype.placeDataLabels=function(){q(this.points,function(a){var b=a.dataLabel;b&&a.visible&&((a=b._pos)?(b.sideOverflow&&(b._attr.width=b.getBBox().width-b.sideOverflow,b.css({width:b._attr.width+"px",textOverflow:"ellipsis"}),
368 b.shortened=!0),b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-9999}))},this)},m.pie.prototype.alignDataLabel=v,m.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,e=this.options,d=e.center,f=e.minSize||80,h,l=null!==e.size;l||(null!==d[0]?h=Math.max(b[2]-Math.max(a[1],a[3]),f):(h=Math.max(b[2]-a[1]-a[3],f),b[0]+=(a[3]-a[1])/2),null!==d[1]?h=Math.max(Math.min(h,b[2]-Math.max(a[0],a[2])),f):(h=Math.max(Math.min(h,b[2]-a[0]-a[2]),f),b[1]+=(a[0]-a[2])/2),h<
369 b[2]?(b[2]=h,b[3]=Math.min(c(e.innerSize||0,h),h),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):l=!0);return l});m.column&&(m.column.prototype.alignDataLabel=function(a,c,d,f,l){var e=this.chart.inverted,h=a.series,k=a.dlBox||a.shapeArgs,m=u(a.below,a.plotY>u(this.translatedThreshold,h.yAxis.len)),p=u(d.inside,!!this.options.stacking);k&&(f=n(k),0>f.y&&(f.height+=f.y,f.y=0),k=f.y+f.height-h.yAxis.len,0<k&&(f.height-=k),e&&(f={x:h.yAxis.len-f.y-f.height,y:h.xAxis.len-f.x-f.width,width:f.height,
370 height:f.width}),p||(e?(f.x+=m?0:f.width,f.width=0):(f.y+=m?f.height:0,f.height=0)));d.align=u(d.align,!e||p?"center":m?"right":"left");d.verticalAlign=u(d.verticalAlign,e||p?"middle":m?"top":"bottom");b.prototype.alignDataLabel.call(this,a,c,d,f,l);a.isLabelJustified&&a.contrastColor&&a.dataLabel.css({color:a.contrastColor})})})(K);(function(a){var B=a.Chart,H=a.each,E=a.objectEach,q=a.pick;a=a.addEvent;a(B.prototype,"render",function(){var a=[];H(this.labelCollectors||[],function(f){a=a.concat(f())});
371 H(this.yAxis||[],function(f){f.options.stackLabels&&!f.options.stackLabels.allowOverlap&&E(f.stacks,function(f){E(f,function(f){a.push(f.label)})})});H(this.series||[],function(f){var l=f.options.dataLabels,n=f.dataLabelCollections||["dataLabel"];(l.enabled||f._hasPointLabels)&&!l.allowOverlap&&f.visible&&H(n,function(l){H(f.points,function(f){f[l]&&(f[l].labelrank=q(f.labelrank,f.shapeArgs&&f.shapeArgs.height),a.push(f[l]))})})});this.hideOverlappingLabels(a)});B.prototype.hideOverlappingLabels=
372 function(a){var f=a.length,q,n,v,u,c,b,m,d,h,k=function(a,b,c,d,f,h,k,l){return!(f>a+c||f+k<a||h>b+d||h+l<b)};for(n=0;n<f;n++)if(q=a[n])q.oldOpacity=q.opacity,q.newOpacity=1,q.width||(v=q.getBBox(),q.width=v.width,q.height=v.height);a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(n=0;n<f;n++)for(v=a[n],q=n+1;q<f;++q)if(u=a[q],v&&u&&v!==u&&v.placed&&u.placed&&0!==v.newOpacity&&0!==u.newOpacity&&(c=v.alignAttr,b=u.alignAttr,m=v.parentGroup,d=u.parentGroup,h=2*(v.box?0:v.padding||
373 0),c=k(c.x+m.translateX,c.y+m.translateY,v.width-h,v.height-h,b.x+d.translateX,b.y+d.translateY,u.width-h,u.height-h)))(v.labelrank<u.labelrank?v:u).newOpacity=0;H(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&a.placed&&(c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?"animate":"attr"](a.alignAttr,null,b)),a.isOld=!0)})}})(K);(function(a){var B=a.addEvent,H=a.Chart,E=a.createElement,q=a.css,f=a.defaultOptions,l=a.defaultPlotOptions,t=a.each,n=a.extend,v=a.fireEvent,
374 u=a.hasTouch,c=a.inArray,b=a.isObject,m=a.Legend,d=a.merge,h=a.pick,k=a.Point,e=a.Series,p=a.seriesTypes,r=a.svg,I;I=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart.pointer,c=function(a){var c=b.getPointFromEvent(a);void 0!==c&&(b.isDirectTouch=!0,c.onMouseOver(a))};t(a.points,function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=a)});a._hasTracking||(t(a.trackerGroups,function(d){if(a[d]){a[d].addClass("highcharts-tracker").on("mouseover",
375 c).on("mouseout",function(a){b.onTrackerMouseOut(a)});if(u)a[d].on("touchstart",c);a.options.cursor&&a[d].css(q).css({cursor:a.options.cursor})}}),a._hasTracking=!0);v(this,"afterDrawTracker")},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,h=f.pointer,k=f.renderer,l=f.options.tooltip.snap,g=a.tracker,m,n=function(){if(f.hoverSeries!==a)a.onMouseOver()},p="rgba(192,192,192,"+(r?.0001:.002)+")";if(e&&!c)for(m=e+1;m--;)"M"===
376 d[m]&&d.splice(m+1,0,d[m+1]-l,d[m+2],"L"),(m&&"M"===d[m]||m===e)&&d.splice(m,0,"L",d[m-2]+l,d[m-1]);g?g.attr({d:d}):a.graph&&(a.tracker=k.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:p,fill:c?p:"none","stroke-width":a.graph.strokeWidth()+(c?0:2*l),zIndex:2}).add(a.group),t([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",n).on("mouseout",function(a){h.onTrackerMouseOut(a)});b.cursor&&a.css({cursor:b.cursor});if(u)a.on("touchstart",
377 n)}));v(this,"afterDrawTracker")}};p.column&&(p.column.prototype.drawTracker=I.drawTrackerPoint);p.pie&&(p.pie.prototype.drawTracker=I.drawTrackerPoint);p.scatter&&(p.scatter.prototype.drawTracker=I.drawTrackerPoint);n(m.prototype,{setItemEvents:function(a,b,c){var e=this,f=e.chart.renderer.boxWrapper,h="highcharts-legend-"+(a instanceof k?"point":"series")+"-active";(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");f.addClass(h);b.css(e.options.itemHoverStyle)}).on("mouseout",function(){b.css(d(a.visible?
378 e.itemStyle:e.itemHiddenStyle));f.removeClass(h);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()};f.removeClass(h);b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):v(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=E("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);B(a.checkbox,"click",function(b){v(a.series||a,"checkboxClick",{checked:b.target.checked,
379 item:a},function(){a.select()})})}});f.legend.itemStyle.cursor="pointer";n(H.prototype,{showResetZoom:function(){function a(){b.zoomOut()}var b=this,c=f.lang,d=b.options.chart.resetZoomButton,e=d.theme,h=e.states,k="chart"===d.relativeTo?null:"plotBox";v(this,"beforeShowResetZoom",null,function(){b.resetZoomButton=b.renderer.button(c.resetZoom,null,null,a,e,h&&h.hover).attr({align:d.position.align,title:c.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(d.position,!1,k)})},zoomOut:function(){var a=
380 this;v(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var c,d=this.pointer,e=!1,f;!a||a.resetSelection?(t(this.axes,function(a){c=a.zoom()}),d.initiated=!1):t(a.xAxis.concat(a.yAxis),function(a){var b=a.axis;d[b.isXAxis?"zoomX":"zoomY"]&&(c=b.zoom(a.min,a.max),b.displayBtn&&(e=!0))});f=this.resetZoomButton;e&&!f?this.showResetZoom():!e&&b(f)&&(this.resetZoomButton=f.destroy());c&&this.redraw(h(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,
381 b){var c=this,d=c.hoverPoints,e;d&&t(d,function(a){a.setState()});t("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",h=c[d],g=(b.pointRange||0)/2,k=b.getExtremes(),l=b.toValue(h-f,!0)+g,m=b.toValue(h+b.len-f,!0)-g,n=m<l,h=n?m:l,l=n?l:m,m=Math.min(k.dataMin,g?k.min:b.toValue(b.toPixels(k.min)-b.minPixelPadding)),g=Math.max(k.dataMax,g?k.max:b.toValue(b.toPixels(k.max)+b.minPixelPadding)),n=m-h;0<n&&(l+=n,h=m);n=l-g;0<n&&(l=
382 g,h-=n);b.series.length&&h!==k.min&&l!==k.max&&(b.setExtremes(h,l,!1,!1,{trigger:"pan"}),e=!0);c[d]=f});e&&c.redraw(!1);q(c.container,{cursor:"move"})}});n(k.prototype,{select:function(a,b){var d=this,e=d.series,f=e.chart;a=h(a,!d.selected);d.firePointEvent(a?"select":"unselect",{accumulate:b},function(){d.selected=d.options.selected=a;e.options.data[c(d,e.data)]=d.options;d.setState(a&&"select");b||t(f.getSelectedPoints(),function(a){a.selected&&a!==d&&(a.selected=a.options.selected=!1,e.options.data[c(a,
383 e.data)]=a.options,a.setState(""),a.firePointEvent("unselect"))})})},onMouseOver:function(a){var b=this.series.chart,c=b.pointer;a=a?c.normalize(a):c.getChartCoordinatesFromPoint(this,b.inverted);c.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent("mouseOut");t(a.hoverPoints||[],function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var b=this,c=d(b.series.options.point,b.options).events;b.events=c;a.objectEach(c,
384 function(a,c){B(b,c,a)});this.hasImportedEvents=!0}},setState:function(a,b){var c=Math.floor(this.plotX),d=this.plotY,e=this.series,f=e.options.states[a||"normal"]||{},k=l[e.type].marker&&e.options.marker,m=k&&!1===k.enabled,p=k&&k.states&&k.states[a||"normal"]||{},g=!1===p.enabled,q=e.stateMarkerGraphic,r=this.marker||{},t=e.chart,u=e.halo,z,B=k&&e.markerAttribs;a=a||"";if(!(a===this.state&&!b||this.selected&&"select"!==a||!1===f.enabled||a&&(g||m&&!1===p.enabled)||a&&r.states&&r.states[a]&&!1===
385 r.states[a].enabled)){B&&(z=e.markerAttribs(this,a));if(this.graphic)this.state&&this.graphic.removeClass("highcharts-point-"+this.state),a&&this.graphic.addClass("highcharts-point-"+a),this.graphic.animate(e.pointAttribs(this,a),h(t.options.chart.animation,f.animation)),z&&this.graphic.animate(z,h(t.options.chart.animation,p.animation,k.animation)),q&&q.hide();else{if(a&&p){k=r.symbol||e.symbol;q&&q.currentSymbol!==k&&(q=q.destroy());if(q)q[b?"animate":"attr"]({x:z.x,y:z.y});else k&&(e.stateMarkerGraphic=
386 q=t.renderer.symbol(k,z.x,z.y,z.width,z.height).add(e.markerGroup),q.currentSymbol=k);q&&q.attr(e.pointAttribs(this,a))}q&&(q[a&&t.isInsidePlot(c,d,t.inverted)?"show":"hide"](),q.element.point=this)}(c=f.halo)&&c.size?(u||(e.halo=u=t.renderer.path().add((this.graphic||q).parentGroup)),u.show()[b?"animate":"attr"]({d:this.haloPath(c.size)}),u.attr({"class":"highcharts-halo highcharts-color-"+h(this.colorIndex,e.colorIndex)}),u.point=this,u.attr(n({fill:this.color||e.color,"fill-opacity":c.opacity,
387 zIndex:-1},c.attributes))):u&&u.point&&u.point.haloPath&&u.animate({d:u.point.haloPath(0)},null,u.hide);this.state=a;v(this,"afterSetState")}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});n(e.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&v(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=
388 this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&v(this,"mouseOut");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var b=this,c=b.options,d=b.graph,e=c.states,f=c.lineWidth,c=0;a=a||"";if(b.state!==a&&(t([b.group,b.markerGroup,b.dataLabelsGroup],function(c){c&&(b.state&&c.removeClass("highcharts-series-"+b.state),a&&c.addClass("highcharts-series-"+a))}),b.state=a,!e[a]||!1!==e[a].enabled)&&
389 (a&&(f=e[a].lineWidth||f+(e[a].lineWidthPlus||0)),d&&!d.dashstyle))for(f={"stroke-width":f},d.animate(f,h(e[a||"normal"]&&e[a||"normal"].animation,b.chart.options.chart.animation));b["zone-graph-"+c];)b["zone-graph-"+c].attr(f),c+=1},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,h=d.options.chart.ignoreHiddenSeries,k=c.visible;f=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!k:a)?"show":"hide";t(["group","dataLabelsGroup","markerGroup","tracker","tt"],function(a){if(c[a])c[a][f]()});
390 if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&t(d.series,function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});t(c.linkedSeries,function(b){b.setVisible(a,!1)});h&&(d.isDirtyBox=!0);!1!==b&&d.redraw();v(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);v(this,a?"select":
391 "unselect")},drawTracker:I.drawTrackerGraph})})(K);(function(a){var B=a.Chart,H=a.each,E=a.inArray,q=a.isArray,f=a.isObject,l=a.pick,t=a.splat;B.prototype.setResponsive=function(f){var l=this.options.responsive,n=[],c=this.currentResponsive;l&&l.rules&&H(l.rules,function(b){void 0===b._id&&(b._id=a.uniqueKey());this.matchResponsiveRule(b,n,f)},this);var b=a.merge.apply(0,a.map(n,function(b){return a.find(l.rules,function(a){return a._id===b}).chartOptions})),n=n.toString()||void 0;n!==(c&&c.ruleIds)&&
392 (c&&this.update(c.undoOptions,f),n?(this.currentResponsive={ruleIds:n,mergedOptions:b,undoOptions:this.currentOptions(b)},this.update(b,f)):this.currentResponsive=void 0)};B.prototype.matchResponsiveRule=function(a,f){var n=a.condition;(n.callback||function(){return this.chartWidth<=l(n.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=l(n.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=l(n.minWidth,0)&&this.chartHeight>=l(n.minHeight,0)}).call(this)&&f.push(a._id)};B.prototype.currentOptions=function(l){function n(c,
393 b,l,d){var h;a.objectEach(c,function(a,c){if(!d&&-1<E(c,["series","xAxis","yAxis"]))for(a=t(a),l[c]=[],h=0;h<a.length;h++)b[c][h]&&(l[c][h]={},n(a[h],b[c][h],l[c][h],d+1));else f(a)?(l[c]=q(a)?[]:{},n(a,b[c]||{},l[c],d+1)):l[c]=b[c]||null})}var u={};n(l,this.options,u,0);return u}})(K);return K});
highcharts.js
   1 /*!
   2  * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014 - 2015
   3  * @version 1.3.3
   4  *
   5  * Date formatter utility library that allows formatting date/time variables or Date objects using PHP DateTime format.
   6  * @see http://php.net/manual/en/function.date.php
   7  *
   8  * For more JQuery plugins visit http://plugins.krajee.com
   9  * For more Yii related demos visit http://demos.krajee.com
  10  */
  11 var DateFormatter;
  12 (function () {
  13     "use strict";
  14 
  15     var _compare, _lpad, _extend, defaultSettings, DAY, HOUR;
  16     DAY = 1000 * 60 * 60 * 24;
  17     HOUR = 3600;
  18 
  19     _compare = function (str1, str2) {
  20         return typeof(str1) === 'string' && typeof(str2) === 'string' && str1.toLowerCase() === str2.toLowerCase();
  21     };
  22     _lpad = function (value, length, char) {
  23         var chr = char || '0', val = value.toString();
  24         return val.length < length ? _lpad(chr + val, length) : val;
  25     };
  26     _extend = function (out) {
  27         var i, obj;
  28         out = out || {};
  29         for (i = 1; i < arguments.length; i++) {
  30             obj = arguments[i];
  31             if (!obj) {
  32                 continue;
  33             }
  34             for (var key in obj) {
  35                 if (obj.hasOwnProperty(key)) {
  36                     if (typeof obj[key] === 'object') {
  37                         _extend(out[key], obj[key]);
  38                     } else {
  39                         out[key] = obj[key];
  40                     }
  41                 }
  42             }
  43         }
  44         return out;
  45     };
  46     defaultSettings = {
  47         dateSettings: {
  48             days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
  49             daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
  50             months: [
  51                 'January', 'February', 'March', 'April', 'May', 'June', 'July',
  52                 'August', 'September', 'October', 'November', 'December'
  53             ],
  54             monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  55             meridiem: ['AM', 'PM'],
  56             ordinal: function (number) {
  57                 var n = number % 10, suffixes = {1: 'st', 2: 'nd', 3: 'rd'};
  58                 return Math.floor(number % 100 / 10) === 1 || !suffixes[n] ? 'th' : suffixes[n];
  59             }
  60         },
  61         separators: /[ \-+\/\.T:@]/g,
  62         validParts: /[dDjlNSwzWFmMntLoYyaABgGhHisueTIOPZcrU]/g,
  63         intParts: /[djwNzmnyYhHgGis]/g,
  64         tzParts: /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
  65         tzClip: /[^-+\dA-Z]/g
  66     };
  67 
  68     DateFormatter = function (options) {
  69         var self = this, config = _extend(defaultSettings, options);
  70         self.dateSettings = config.dateSettings;
  71         self.separators = config.separators;
  72         self.validParts = config.validParts;
  73         self.intParts = config.intParts;
  74         self.tzParts = config.tzParts;
  75         self.tzClip = config.tzClip;
  76     };
  77 
  78     DateFormatter.prototype = {
  79         constructor: DateFormatter,
  80         parseDate: function (vDate, vFormat) {
  81             var self = this, vFormatParts, vDateParts, i, vDateFlag = false, vTimeFlag = false, vDatePart, iDatePart,
  82                 vSettings = self.dateSettings, vMonth, vMeriIndex, vMeriOffset, len, mer,
  83                 out = {date: null, year: null, month: null, day: null, hour: 0, min: 0, sec: 0};
  84             if (!vDate) {
  85                 return undefined;
  86             }
  87             if (vDate instanceof Date) {
  88                 return vDate;
  89             }
  90             if (typeof vDate === 'number') {
  91                 return new Date(vDate);
  92             }
  93             if (vFormat === 'U') {
  94                 i = parseInt(vDate);
  95                 return i ? new Date(i * 1000) : vDate;
  96             }
  97             if (typeof vDate !== 'string') {
  98                 return '';
  99             }
 100             vFormatParts = vFormat.match(self.validParts);
 101             if (!vFormatParts || vFormatParts.length === 0) {
 102                 throw new Error("Invalid date format definition.");
 103             }
 104             vDateParts = vDate.replace(self.separators, '\0').split('\0');
 105             for (i = 0; i < vDateParts.length; i++) {
 106                 vDatePart = vDateParts[i];
 107                 iDatePart = parseInt(vDatePart);
 108                 switch (vFormatParts[i]) {
 109                     case 'y':
 110                     case 'Y':
 111                         len = vDatePart.length;
 112                         if (len === 2) {
 113                             out.year = parseInt((iDatePart < 70 ? '20' : '19') + vDatePart);
 114                         } else if (len === 4) {
 115                             out.year = iDatePart;
 116                         }
 117                         vDateFlag = true;
 118                         break;
 119                     case 'm':
 120                     case 'n':
 121                     case 'M':
 122                     case 'F':
 123                         if (isNaN(vDatePart)) {
 124                             vMonth = vSettings.monthsShort.indexOf(vDatePart);
 125                             if (vMonth > -1) {
 126                                 out.month = vMonth + 1;
 127                             }
 128                             vMonth = vSettings.months.indexOf(vDatePart);
 129                             if (vMonth > -1) {
 130                                 out.month = vMonth + 1;
 131                             }
 132                         } else {
 133                             if (iDatePart >= 1 && iDatePart <= 12) {
 134                                 out.month = iDatePart;
 135                             }
 136                         }
 137                         vDateFlag = true;
 138                         break;
 139                     case 'd':
 140                     case 'j':
 141                         if (iDatePart >= 1 && iDatePart <= 31) {
 142                             out.day = iDatePart;
 143                         }
 144                         vDateFlag = true;
 145                         break;
 146                     case 'g':
 147                     case 'h':
 148                         vMeriIndex = (vFormatParts.indexOf('a') > -1) ? vFormatParts.indexOf('a') :
 149                             (vFormatParts.indexOf('A') > -1) ? vFormatParts.indexOf('A') : -1;
 150                         mer = vDateParts[vMeriIndex];
 151                         if (vMeriIndex > -1) {
 152                             vMeriOffset = _compare(mer, vSettings.meridiem[0]) ? 0 :
 153                                 (_compare(mer, vSettings.meridiem[1]) ? 12 : -1);
 154                             if (iDatePart >= 1 && iDatePart <= 12 && vMeriOffset > -1) {
 155                                 out.hour = iDatePart + vMeriOffset - 1;
 156                             } else if (iDatePart >= 0 && iDatePart <= 23) {
 157                                 out.hour = iDatePart;
 158                             }
 159                         } else if (iDatePart >= 0 && iDatePart <= 23) {
 160                             out.hour = iDatePart;
 161                         }
 162                         vTimeFlag = true;
 163                         break;
 164                     case 'G':
 165                     case 'H':
 166                         if (iDatePart >= 0 && iDatePart <= 23) {
 167                             out.hour = iDatePart;
 168                         }
 169                         vTimeFlag = true;
 170                         break;
 171                     case 'i':
 172                         if (iDatePart >= 0 && iDatePart <= 59) {
 173                             out.min = iDatePart;
 174                         }
 175                         vTimeFlag = true;
 176                         break;
 177                     case 's':
 178                         if (iDatePart >= 0 && iDatePart <= 59) {
 179                             out.sec = iDatePart;
 180                         }
 181                         vTimeFlag = true;
 182                         break;
 183                 }
 184             }
 185             if (vDateFlag === true && out.year && out.month && out.day) {
 186                 out.date = new Date(out.year, out.month - 1, out.day, out.hour, out.min, out.sec, 0);
 187             } else {
 188                 if (vTimeFlag !== true) {
 189                     return false;
 190                 }
 191                 out.date = new Date(0, 0, 0, out.hour, out.min, out.sec, 0);
 192             }
 193             return out.date;
 194         },
 195         guessDate: function (vDateStr, vFormat) {
 196             if (typeof vDateStr !== 'string') {
 197                 return vDateStr;
 198             }
 199             var self = this, vParts = vDateStr.replace(self.separators, '\0').split('\0'), vPattern = /^[djmn]/g,
 200                 vFormatParts = vFormat.match(self.validParts), vDate = new Date(), vDigit = 0, vYear, i, iPart, iSec;
 201 
 202             if (!vPattern.test(vFormatParts[0])) {
 203                 return vDateStr;
 204             }
 205 
 206             for (i = 0; i < vParts.length; i++) {
 207                 vDigit = 2;
 208                 iPart = vParts[i];
 209                 iSec = parseInt(iPart.substr(0, 2));
 210                 switch (i) {
 211                     case 0:
 212                         if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {
 213                             vDate.setMonth(iSec - 1);
 214                         } else {
 215                             vDate.setDate(iSec);
 216                         }
 217                         break;
 218                     case 1:
 219                         if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {
 220                             vDate.setDate(iSec);
 221                         } else {
 222                             vDate.setMonth(iSec - 1);
 223                         }
 224                         break;
 225                     case 2:
 226                         vYear = vDate.getFullYear();
 227                         if (iPart.length < 4) {
 228                             vDate.setFullYear(parseInt(vYear.toString().substr(0, 4 - iPart.length) + iPart));
 229                             vDigit = iPart.length;
 230                         } else {
 231                             vDate.setFullYear = parseInt(iPart.substr(0, 4));
 232                             vDigit = 4;
 233                         }
 234                         break;
 235                     case 3:
 236                         vDate.setHours(iSec);
 237                         break;
 238                     case 4:
 239                         vDate.setMinutes(iSec);
 240                         break;
 241                     case 5:
 242                         vDate.setSeconds(iSec);
 243                         break;
 244                 }
 245                 if (iPart.substr(vDigit).length > 0) {
 246                     vParts.splice(i + 1, 0, iPart.substr(vDigit));
 247                 }
 248             }
 249             return vDate;
 250         },
 251         parseFormat: function (vChar, vDate) {
 252             var self = this, vSettings = self.dateSettings, fmt, backspace = /\\?(.?)/gi, doFormat = function (t, s) {
 253                 return fmt[t] ? fmt[t]() : s;
 254             };
 255             fmt = {
 256                 /////////
 257                 // DAY //
 258                 /////////
 259                 /**
 260                  * Day of month with leading 0: `01..31`
 261                  * @return {string}
 262                  */
 263                 d: function () {
 264                     return _lpad(fmt.j(), 2);
 265                 },
 266                 /**
 267                  * Shorthand day name: `Mon...Sun`
 268                  * @return {string}
 269                  */
 270                 D: function () {
 271                     return vSettings.daysShort[fmt.w()];
 272                 },
 273                 /**
 274                  * Day of month: `1..31`
 275                  * @return {number}
 276                  */
 277                 j: function () {
 278                     return vDate.getDate();
 279                 },
 280                 /**
 281                  * Full day name: `Monday...Sunday`
 282                  * @return {number}
 283                  */
 284                 l: function () {
 285                     return vSettings.days[fmt.w()];
 286                 },
 287                 /**
 288                  * ISO-8601 day of week: `1[Mon]..7[Sun]`
 289                  * @return {number}
 290                  */
 291                 N: function () {
 292                     return fmt.w() || 7;
 293                 },
 294                 /**
 295                  * Day of week: `0[Sun]..6[Sat]`
 296                  * @return {number}
 297                  */
 298                 w: function () {
 299                     return vDate.getDay();
 300                 },
 301                 /**
 302                  * Day of year: `0..365`
 303                  * @return {number}
 304                  */
 305                 z: function () {
 306                     var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j()), b = new Date(fmt.Y(), 0, 1);
 307                     return Math.round((a - b) / DAY);
 308                 },
 309 
 310                 //////////
 311                 // WEEK //
 312                 //////////
 313                 /**
 314                  * ISO-8601 week number
 315                  * @return {number}
 316                  */
 317                 W: function () {
 318                     var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j() - fmt.N() + 3), b = new Date(a.getFullYear(), 0, 4);
 319                     return _lpad(1 + Math.round((a - b) / DAY / 7), 2);
 320                 },
 321 
 322                 ///////////
 323                 // MONTH //
 324                 ///////////
 325                 /**
 326                  * Full month name: `January...December`
 327                  * @return {string}
 328                  */
 329                 F: function () {
 330                     return vSettings.months[vDate.getMonth()];
 331                 },
 332                 /**
 333                  * Month w/leading 0: `01..12`
 334                  * @return {string}
 335                  */
 336                 m: function () {
 337                     return _lpad(fmt.n(), 2);
 338                 },
 339                 /**
 340                  * Shorthand month name; `Jan...Dec`
 341                  * @return {string}
 342                  */
 343                 M: function () {
 344                     return vSettings.monthsShort[vDate.getMonth()];
 345                 },
 346                 /**
 347                  * Month: `1...12`
 348                  * @return {number}
 349                  */
 350                 n: function () {
 351                     return vDate.getMonth() + 1;
 352                 },
 353                 /**
 354                  * Days in month: `28...31`
 355                  * @return {number}
 356                  */
 357                 t: function () {
 358                     return (new Date(fmt.Y(), fmt.n(), 0)).getDate();
 359                 },
 360 
 361                 //////////
 362                 // YEAR //
 363                 //////////
 364                 /**
 365                  * Is leap year? `0 or 1`
 366                  * @return {number}
 367                  */
 368                 L: function () {
 369                     var Y = fmt.Y();
 370                     return (Y % 4 === 0 && Y % 100 !== 0 || Y % 400 === 0) ? 1 : 0;
 371                 },
 372                 /**
 373                  * ISO-8601 year
 374                  * @return {number}
 375                  */
 376                 o: function () {
 377                     var n = fmt.n(), W = fmt.W(), Y = fmt.Y();
 378                     return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
 379                 },
 380                 /**
 381                  * Full year: `e.g. 1980...2010`
 382                  * @return {number}
 383                  */
 384                 Y: function () {
 385                     return vDate.getFullYear();
 386                 },
 387                 /**
 388                  * Last two digits of year: `00...99`
 389                  * @return {string}
 390                  */
 391                 y: function () {
 392                     return fmt.Y().toString().slice(-2);
 393                 },
 394 
 395                 //////////
 396                 // TIME //
 397                 //////////
 398                 /**
 399                  * Meridian lower: `am or pm`
 400                  * @return {string}
 401                  */
 402                 a: function () {
 403                     return fmt.A().toLowerCase();
 404                 },
 405                 /**
 406                  * Meridian upper: `AM or PM`
 407                  * @return {string}
 408                  */
 409                 A: function () {
 410                     var n = fmt.G() < 12 ? 0 : 1;
 411                     return vSettings.meridiem[n];
 412                 },
 413                 /**
 414                  * Swatch Internet time: `000..999`
 415                  * @return {string}
 416                  */
 417                 B: function () {
 418                     var H = vDate.getUTCHours() * HOUR, i = vDate.getUTCMinutes() * 60, s = vDate.getUTCSeconds();
 419                     return _lpad(Math.floor((H + i + s + HOUR) / 86.4) % 1000, 3);
 420                 },
 421                 /**
 422                  * 12-Hours: `1..12`
 423                  * @return {number}
 424                  */
 425                 g: function () {
 426                     return fmt.G() % 12 || 12;
 427                 },
 428                 /**
 429                  * 24-Hours: `0..23`
 430                  * @return {number}
 431                  */
 432                 G: function () {
 433                     return vDate.getHours();
 434                 },
 435                 /**
 436                  * 12-Hours with leading 0: `01..12`
 437                  * @return {string}
 438                  */
 439                 h: function () {
 440                     return _lpad(fmt.g(), 2);
 441                 },
 442                 /**
 443                  * 24-Hours w/leading 0: `00..23`
 444                  * @return {string}
 445                  */
 446                 H: function () {
 447                     return _lpad(fmt.G(), 2);
 448                 },
 449                 /**
 450                  * Minutes w/leading 0: `00..59`
 451                  * @return {string}
 452                  */
 453                 i: function () {
 454                     return _lpad(vDate.getMinutes(), 2);
 455                 },
 456                 /**
 457                  * Seconds w/leading 0: `00..59`
 458                  * @return {string}
 459                  */
 460                 s: function () {
 461                     return _lpad(vDate.getSeconds(), 2);
 462                 },
 463                 /**
 464                  * Microseconds: `000000-999000`
 465                  * @return {string}
 466                  */
 467                 u: function () {
 468                     return _lpad(vDate.getMilliseconds() * 1000, 6);
 469                 },
 470 
 471                 //////////////
 472                 // TIMEZONE //
 473                 //////////////
 474                 /**
 475                  * Timezone identifier: `e.g. Atlantic/Azores, ...`
 476                  * @return {string}
 477                  */
 478                 e: function () {
 479                     var str = /\((.*)\)/.exec(String(vDate))[1];
 480                     return str || 'Coordinated Universal Time';
 481                 },
 482                 /**
 483                  * Timezone abbreviation: `e.g. EST, MDT, ...`
 484                  * @return {string}
 485                  */
 486                 T: function () {
 487                     var str = (String(vDate).match(self.tzParts) || [""]).pop().replace(self.tzClip, "");
 488                     return str || 'UTC';
 489                 },
 490                 /**
 491                  * DST observed? `0 or 1`
 492                  * @return {number}
 493                  */
 494                 I: function () {
 495                     var a = new Date(fmt.Y(), 0), c = Date.UTC(fmt.Y(), 0),
 496                         b = new Date(fmt.Y(), 6), d = Date.UTC(fmt.Y(), 6);
 497                     return ((a - c) !== (b - d)) ? 1 : 0;
 498                 },
 499                 /**
 500                  * Difference to GMT in hour format: `e.g. +0200`
 501                  * @return {string}
 502                  */
 503                 O: function () {
 504                     var tzo = vDate.getTimezoneOffset(), a = Math.abs(tzo);
 505                     return (tzo > 0 ? '-' : '+') + _lpad(Math.floor(a / 60) * 100 + a % 60, 4);
 506                 },
 507                 /**
 508                  * Difference to GMT with colon: `e.g. +02:00`
 509                  * @return {string}
 510                  */
 511                 P: function () {
 512                     var O = fmt.O();
 513                     return (O.substr(0, 3) + ':' + O.substr(3, 2));
 514                 },
 515                 /**
 516                  * Timezone offset in seconds: `-43200...50400`
 517                  * @return {number}
 518                  */
 519                 Z: function () {
 520                     return -vDate.getTimezoneOffset() * 60;
 521                 },
 522 
 523                 ////////////////////
 524                 // FULL DATE TIME //
 525                 ////////////////////
 526                 /**
 527                  * ISO-8601 date
 528                  * @return {string}
 529                  */
 530                 c: function () {
 531                     return 'Y-m-d\\TH:i:sP'.replace(backspace, doFormat);
 532                 },
 533                 /**
 534                  * RFC 2822 date
 535                  * @return {string}
 536                  */
 537                 r: function () {
 538                     return 'D, d M Y H:i:s O'.replace(backspace, doFormat);
 539                 },
 540                 /**
 541                  * Seconds since UNIX epoch
 542                  * @return {number}
 543                  */
 544                 U: function () {
 545                     return vDate.getTime() / 1000 || 0;
 546                 }
 547             };
 548             return doFormat(vChar, vChar);
 549         },
 550         formatDate: function (vDate, vFormat) {
 551             var self = this, i, n, len, str, vChar, vDateStr = '';
 552             if (typeof vDate === 'string') {
 553                 vDate = self.parseDate(vDate, vFormat);
 554                 if (vDate === false) {
 555                     return false;
 556                 }
 557             }
 558             if (vDate instanceof Date) {
 559                 len = vFormat.length;
 560                 for (i = 0; i < len; i++) {
 561                     vChar = vFormat.charAt(i);
 562                     if (vChar === 'S') {
 563                         continue;
 564                     }
 565                     str = self.parseFormat(vChar, vDate);
 566                     if (i !== (len - 1) && self.intParts.test(vChar) && vFormat.charAt(i + 1) === 'S') {
 567                         n = parseInt(str);
 568                         str += self.dateSettings.ordinal(n);
 569                     }
 570                     vDateStr += str;
 571                 }
 572                 return vDateStr;
 573             }
 574             return '';
 575         }
 576     };
 577 })();/**
 578  * @preserve jQuery DateTimePicker plugin v2.5.3
 579  * @homepage http://xdsoft.net/jqplugins/datetimepicker/
 580  * @author Chupurnov Valeriy (<chupurnov@gmail.com>)
 581  */
 582 /*global DateFormatter, document,window,jQuery,setTimeout,clearTimeout,HighlightedDate,getCurrentValue*/
 583 ;(function (factory) {
 584     if ( typeof define === 'function' && define.amd ) {
 585         // AMD. Register as an anonymous module.
 586         define(['jquery', 'jquery-mousewheel'], factory);
 587     } else if (typeof exports === 'object') {
 588         // Node/CommonJS style for Browserify
 589         module.exports = factory;
 590     } else {
 591         // Browser globals
 592         factory(jQuery);
 593     }
 594 }(function ($) {
 595     'use strict';
 596     var default_options  = {
 597         i18n: {
 598             ar: { // Arabic
 599                 months: [
 600                     "كانون الثاني", "شباط", "آذار", "نيسان", "مايو", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"
 601                 ],
 602                 dayOfWeekShort: [
 603                     "ن", "ث", "ع", "خ", "ج", "س", "ح"
 604                 ],
 605                 dayOfWeek: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"]
 606             },
 607             ro: { // Romanian
 608                 months: [
 609                     "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"
 610                 ],
 611                 dayOfWeekShort: [
 612                     "Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ"
 613                 ],
 614                 dayOfWeek: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă"]
 615             },
 616             id: { // Indonesian
 617                 months: [
 618                     "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"
 619                 ],
 620                 dayOfWeekShort: [
 621                     "Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"
 622                 ],
 623                 dayOfWeek: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"]
 624             },
 625             is: { // Icelandic
 626                 months: [
 627                     "Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"
 628                 ],
 629                 dayOfWeekShort: [
 630                     "Sun", "Mán", "Þrið", "Mið", "Fim", "Fös", "Lau"
 631                 ],
 632                 dayOfWeek: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur"]
 633             },
 634             bg: { // Bulgarian
 635                 months: [
 636                     "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"
 637                 ],
 638                 dayOfWeekShort: [
 639                     "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
 640                 ],
 641                 dayOfWeek: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота"]
 642             },
 643             fa: { // Persian/Farsi
 644                 months: [
 645                     'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'
 646                 ],
 647                 dayOfWeekShort: [
 648                     'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'
 649                 ],
 650                 dayOfWeek: ["یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یک‌شنبه"]
 651             },
 652             ru: { // Russian
 653                 months: [
 654                     'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
 655                 ],
 656                 dayOfWeekShort: [
 657                     "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
 658                 ],
 659                 dayOfWeek: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"]
 660             },
 661             uk: { // Ukrainian
 662                 months: [
 663                     'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'
 664                 ],
 665                 dayOfWeekShort: [
 666                     "Ндл", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Сбт"
 667                 ],
 668                 dayOfWeek: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"]
 669             },
 670             en: { // English
 671                 months: [
 672                     "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
 673                 ],
 674                 dayOfWeekShort: [
 675                     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 676                 ],
 677                 dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
 678             },
 679             el: { // Ελληνικά
 680                 months: [
 681                     "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"
 682                 ],
 683                 dayOfWeekShort: [
 684                     "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"
 685                 ],
 686                 dayOfWeek: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"]
 687             },
 688             de: { // German
 689                 months: [
 690                     'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
 691                 ],
 692                 dayOfWeekShort: [
 693                     "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"
 694                 ],
 695                 dayOfWeek: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]
 696             },
 697             nl: { // Dutch
 698                 months: [
 699                     "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"
 700                 ],
 701                 dayOfWeekShort: [
 702                     "zo", "ma", "di", "wo", "do", "vr", "za"
 703                 ],
 704                 dayOfWeek: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"]
 705             },
 706             tr: { // Turkish
 707                 months: [
 708                     "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
 709                 ],
 710                 dayOfWeekShort: [
 711                     "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts"
 712                 ],
 713                 dayOfWeek: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"]
 714             },
 715             fr: { //French
 716                 months: [
 717                     "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
 718                 ],
 719                 dayOfWeekShort: [
 720                     "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"
 721                 ],
 722                 dayOfWeek: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
 723             },
 724             es: { // Spanish
 725                 months: [
 726                     "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
 727                 ],
 728                 dayOfWeekShort: [
 729                     "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"
 730                 ],
 731                 dayOfWeek: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]
 732             },
 733             th: { // Thai
 734                 months: [
 735                     'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
 736                 ],
 737                 dayOfWeekShort: [
 738                     'อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'
 739                 ],
 740                 dayOfWeek: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"]
 741             },
 742             pl: { // Polish
 743                 months: [
 744                     "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"
 745                 ],
 746                 dayOfWeekShort: [
 747                     "nd", "pn", "wt", "śr", "cz", "pt", "sb"
 748                 ],
 749                 dayOfWeek: ["niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota"]
 750             },
 751             pt: { // Portuguese
 752                 months: [
 753                     "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
 754                 ],
 755                 dayOfWeekShort: [
 756                     "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"
 757                 ],
 758                 dayOfWeek: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
 759             },
 760             ch: { // Simplified Chinese
 761                 months: [
 762                     "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
 763                 ],
 764                 dayOfWeekShort: [
 765                     "日", "一", "二", "三", "四", "五", "六"
 766                 ]
 767             },
 768             se: { // Swedish
 769                 months: [
 770                     "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September",  "Oktober", "November", "December"
 771                 ],
 772                 dayOfWeekShort: [
 773                     "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
 774                 ]
 775             },
 776             kr: { // Korean
 777                 months: [
 778                     "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
 779                 ],
 780                 dayOfWeekShort: [
 781                     "일", "월", "화", "수", "목", "금", "토"
 782                 ],
 783                 dayOfWeek: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
 784             },
 785             it: { // Italian
 786                 months: [
 787                     "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"
 788                 ],
 789                 dayOfWeekShort: [
 790                     "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"
 791                 ],
 792                 dayOfWeek: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"]
 793             },
 794             da: { // Dansk
 795                 months: [
 796                     "January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December"
 797                 ],
 798                 dayOfWeekShort: [
 799                     "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
 800                 ],
 801                 dayOfWeek: ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"]
 802             },
 803             no: { // Norwegian
 804                 months: [
 805                     "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"
 806                 ],
 807                 dayOfWeekShort: [
 808                     "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
 809                 ],
 810                 dayOfWeek: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag']
 811             },
 812             ja: { // Japanese
 813                 months: [
 814                     "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"
 815                 ],
 816                 dayOfWeekShort: [
 817                     "日", "月", "火", "水", "木", "金", "土"
 818                 ],
 819                 dayOfWeek: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"]
 820             },
 821             vi: { // Vietnamese
 822                 months: [
 823                     "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"
 824                 ],
 825                 dayOfWeekShort: [
 826                     "CN", "T2", "T3", "T4", "T5", "T6", "T7"
 827                 ],
 828                 dayOfWeek: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"]
 829             },
 830             sl: { // Slovenščina
 831                 months: [
 832                     "Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"
 833                 ],
 834                 dayOfWeekShort: [
 835                     "Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"
 836                 ],
 837                 dayOfWeek: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota"]
 838             },
 839             cs: { // Čeština
 840                 months: [
 841                     "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"
 842                 ],
 843                 dayOfWeekShort: [
 844                     "Ne", "Po", "Út", "St", "Čt", "Pá", "So"
 845                 ]
 846             },
 847             hu: { // Hungarian
 848                 months: [
 849                     "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"
 850                 ],
 851                 dayOfWeekShort: [
 852                     "Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo"
 853                 ],
 854                 dayOfWeek: ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"]
 855             },
 856             az: { //Azerbaijanian (Azeri)
 857                 months: [
 858                     "Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"
 859                 ],
 860                 dayOfWeekShort: [
 861                     "B", "Be", "Ça", "Ç", "Ca", "C", "Ş"
 862                 ],
 863                 dayOfWeek: ["Bazar", "Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə"]
 864             },
 865             bs: { //Bosanski
 866                 months: [
 867                     "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
 868                 ],
 869                 dayOfWeekShort: [
 870                     "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
 871                 ],
 872                 dayOfWeek: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"]
 873             },
 874             ca: { //Català
 875                 months: [
 876                     "Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"
 877                 ],
 878                 dayOfWeekShort: [
 879                     "Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds"
 880                 ],
 881                 dayOfWeek: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"]
 882             },
 883             'en-GB': { //English (British)
 884                 months: [
 885                     "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
 886                 ],
 887                 dayOfWeekShort: [
 888                     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 889                 ],
 890                 dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
 891             },
 892             et: { //"Eesti"
 893                 months: [
 894                     "Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"
 895                 ],
 896                 dayOfWeekShort: [
 897                     "P", "E", "T", "K", "N", "R", "L"
 898                 ],
 899                 dayOfWeek: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev"]
 900             },
 901             eu: { //Euskara
 902                 months: [
 903                     "Urtarrila", "Otsaila", "Martxoa", "Apirila", "Maiatza", "Ekaina", "Uztaila", "Abuztua", "Iraila", "Urria", "Azaroa", "Abendua"
 904                 ],
 905                 dayOfWeekShort: [
 906                     "Ig.", "Al.", "Ar.", "Az.", "Og.", "Or.", "La."
 907                 ],
 908                 dayOfWeek: ['Igandea', 'Astelehena', 'Asteartea', 'Asteazkena', 'Osteguna', 'Ostirala', 'Larunbata']
 909             },
 910             fi: { //Finnish (Suomi)
 911                 months: [
 912                     "Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"
 913                 ],
 914                 dayOfWeekShort: [
 915                     "Su", "Ma", "Ti", "Ke", "To", "Pe", "La"
 916                 ],
 917                 dayOfWeek: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"]
 918             },
 919             gl: { //Galego
 920                 months: [
 921                     "Xan", "Feb", "Maz", "Abr", "Mai", "Xun", "Xul", "Ago", "Set", "Out", "Nov", "Dec"
 922                 ],
 923                 dayOfWeekShort: [
 924                     "Dom", "Lun", "Mar", "Mer", "Xov", "Ven", "Sab"
 925                 ],
 926                 dayOfWeek: ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado"]
 927             },
 928             hr: { //Hrvatski
 929                 months: [
 930                     "Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"
 931                 ],
 932                 dayOfWeekShort: [
 933                     "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
 934                 ],
 935                 dayOfWeek: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"]
 936             },
 937             ko: { //Korean (한국어)
 938                 months: [
 939                     "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
 940                 ],
 941                 dayOfWeekShort: [
 942                     "일", "월", "화", "수", "목", "금", "토"
 943                 ],
 944                 dayOfWeek: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
 945             },
 946             lt: { //Lithuanian (lietuvių)
 947                 months: [
 948                     "Sausio", "Vasario", "Kovo", "Balandžio", "Gegužės", "Birželio", "Liepos", "Rugpjūčio", "Rugsėjo", "Spalio", "Lapkričio", "Gruodžio"
 949                 ],
 950                 dayOfWeekShort: [
 951                     "Sek", "Pir", "Ant", "Tre", "Ket", "Pen", "Šeš"
 952                 ],
 953                 dayOfWeek: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis"]
 954             },
 955             lv: { //Latvian (Latviešu)
 956                 months: [
 957                     "Janvāris", "Februāris", "Marts", "Aprīlis ", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"
 958                 ],
 959                 dayOfWeekShort: [
 960                     "Sv", "Pr", "Ot", "Tr", "Ct", "Pk", "St"
 961                 ],
 962                 dayOfWeek: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena"]
 963             },
 964             mk: { //Macedonian (Македонски)
 965                 months: [
 966                     "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"
 967                 ],
 968                 dayOfWeekShort: [
 969                     "нед", "пон", "вто", "сре", "чет", "пет", "саб"
 970                 ],
 971                 dayOfWeek: ["Недела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота"]
 972             },
 973             mn: { //Mongolian (Монгол)
 974                 months: [
 975                     "1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар"
 976                 ],
 977                 dayOfWeekShort: [
 978                     "Дав", "Мяг", "Лха", "Пүр", "Бсн", "Бям", "Ням"
 979                 ],
 980                 dayOfWeek: ["Даваа", "Мягмар", "Лхагва", "Пүрэв", "Баасан", "Бямба", "Ням"]
 981             },
 982             'pt-BR': { //Português(Brasil)
 983                 months: [
 984                     "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
 985                 ],
 986                 dayOfWeekShort: [
 987                     "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"
 988                 ],
 989                 dayOfWeek: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
 990             },
 991             sk: { //Slovenčina
 992                 months: [
 993                     "Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"
 994                 ],
 995                 dayOfWeekShort: [
 996                     "Ne", "Po", "Ut", "St", "Št", "Pi", "So"
 997                 ],
 998                 dayOfWeek: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"]
 999             },
1000             sq: { //Albanian (Shqip)
1001                 months: [
1002                     "Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor"
1003                 ],
1004                 dayOfWeekShort: [
1005                     "Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Shtu"
1006                 ],
1007                 dayOfWeek: ["E Diel", "E Hënë", "E Martē", "E Mërkurë", "E Enjte", "E Premte", "E Shtunë"]
1008             },
1009             'sr-YU': { //Serbian (Srpski)
1010                 months: [
1011                     "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
1012                 ],
1013                 dayOfWeekShort: [
1014                     "Ned", "Pon", "Uto", "Sre", "čet", "Pet", "Sub"
1015                 ],
1016                 dayOfWeek: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"]
1017             },
1018             sr: { //Serbian Cyrillic (Српски)
1019                 months: [
1020                     "јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"
1021                 ],
1022                 dayOfWeekShort: [
1023                     "нед", "пон", "уто", "сре", "чет", "пет", "суб"
1024                 ],
1025                 dayOfWeek: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота"]
1026             },
1027             sv: { //Svenska
1028                 months: [
1029                     "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"
1030                 ],
1031                 dayOfWeekShort: [
1032                     "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
1033                 ],
1034                 dayOfWeek: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]
1035             },
1036             'zh-TW': { //Traditional Chinese (繁體中文)
1037                 months: [
1038                     "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
1039                 ],
1040                 dayOfWeekShort: [
1041                     "日", "一", "二", "三", "四", "五", "六"
1042                 ],
1043                 dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
1044             },
1045             zh: { //Simplified Chinese (简体中文)
1046                 months: [
1047                     "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
1048                 ],
1049                 dayOfWeekShort: [
1050                     "日", "一", "二", "三", "四", "五", "六"
1051                 ],
1052                 dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
1053             },
1054             he: { //Hebrew (עברית)
1055                 months: [
1056                     'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'
1057                 ],
1058                 dayOfWeekShort: [
1059                     'א\'', 'ב\'', 'ג\'', 'ד\'', 'ה\'', 'ו\'', 'שבת'
1060                 ],
1061                 dayOfWeek: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
1062             },
1063             hy: { // Armenian
1064                 months: [
1065                     "Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր"
1066                 ],
1067                 dayOfWeekShort: [
1068                     "Կի", "Երկ", "Երք", "Չոր", "Հնգ", "Ուրբ", "Շբթ"
1069                 ],
1070                 dayOfWeek: ["Կիրակի", "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ"]
1071             },
1072             kg: { // Kyrgyz
1073                 months: [
1074                     'Үчтүн айы', 'Бирдин айы', 'Жалган Куран', 'Чын Куран', 'Бугу', 'Кулжа', 'Теке', 'Баш Оона', 'Аяк Оона', 'Тогуздун айы', 'Жетинин айы', 'Бештин айы'
1075                 ],
1076                 dayOfWeekShort: [
1077                     "Жек", "Дүй", "Шей", "Шар", "Бей", "Жум", "Ише"
1078                 ],
1079                 dayOfWeek: [
1080                     "Жекшемб", "Дүйшөмб", "Шейшемб", "Шаршемб", "Бейшемби", "Жума", "Ишенб"
1081                 ]
1082             },
1083             rm: { // Romansh
1084                 months: [
1085                     "Schaner", "Favrer", "Mars", "Avrigl", "Matg", "Zercladur", "Fanadur", "Avust", "Settember", "October", "November", "December"
1086                 ],
1087                 dayOfWeekShort: [
1088                     "Du", "Gli", "Ma", "Me", "Gie", "Ve", "So"
1089                 ],
1090                 dayOfWeek: [
1091                     "Dumengia", "Glindesdi", "Mardi", "Mesemna", "Gievgia", "Venderdi", "Sonda"
1092                 ]
1093             },
1094             ka: { // Georgian
1095                 months: [
1096                     'იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'
1097                 ],
1098                 dayOfWeekShort: [
1099                     "კვ", "ორშ", "სამშ", "ოთხ", "ხუთ", "პარ", "შაბ"
1100                 ],
1101                 dayOfWeek: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"]
1102             },
1103         },
1104         value: '',
1105         rtl: false,
1106 
1107         format:    'Y/m/d H:i',
1108         formatTime:    'H:i',
1109         formatDate:    'Y/m/d',
1110 
1111         startDate:    false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05',
1112         step: 60,
1113         monthChangeSpinner: true,
1114 
1115         closeOnDateSelect: false,
1116         closeOnTimeSelect: true,
1117         closeOnWithoutClick: true,
1118         closeOnInputClick: true,
1119 
1120         timepicker: true,
1121         datepicker: true,
1122         weeks: false,
1123 
1124         defaultTime: false,    // use formatTime format (ex. '10:00' for formatTime:    'H:i')
1125         defaultDate: false,    // use formatDate format (ex new Date() or '1986/12/08' or '-1970/01/05' or '-1970/01/05')
1126 
1127         minDate: false,
1128         maxDate: false,
1129         minTime: false,
1130         maxTime: false,
1131         disabledMinTime: false,
1132         disabledMaxTime: false,
1133 
1134         allowTimes: [],
1135         opened: false,
1136         initTime: true,
1137         inline: false,
1138         theme: '',
1139 
1140         onSelectDate: function () {},
1141         onSelectTime: function () {},
1142         onChangeMonth: function () {},
1143         onGetWeekOfYear: function () {},
1144         onChangeYear: function () {},
1145         onChangeDateTime: function () {},
1146         onShow: function () {},
1147         onClose: function () {},
1148         onGenerate: function () {},
1149 
1150         withoutCopyright: true,
1151         inverseButton: false,
1152         hours12: false,
1153         next: 'xdsoft_next',
1154         prev : 'xdsoft_prev',
1155         dayOfWeekStart: 0,
1156         parentID: 'body',
1157         timeHeightInTimePicker: 25,
1158         timepickerScrollbar: true,
1159         todayButton: true,
1160         prevButton: true,
1161         nextButton: true,
1162         defaultSelect: true,
1163 
1164         scrollMonth: true,
1165         scrollTime: true,
1166         scrollInput: true,
1167 
1168         lazyInit: false,
1169         mask: false,
1170         validateOnBlur: true,
1171         allowBlank: true,
1172         yearStart: 1950,
1173         yearEnd: 2050,
1174         monthStart: 0,
1175         monthEnd: 11,
1176         style: '',
1177         id: '',
1178         fixed: false,
1179         roundTime: 'round', // ceil, floor
1180         className: '',
1181         weekends: [],
1182         highlightedDates: [],
1183         highlightedPeriods: [],
1184         allowDates : [],
1185         allowDateRe : null,
1186         disabledDates : [],
1187         disabledWeekDays: [],
1188         yearOffset: 0,
1189         beforeShowDay: null,
1190 
1191         enterLikeTab: true,
1192         showApplyButton: false
1193     };
1194 
1195     var dateHelper = null,
1196         globalLocaleDefault = 'en',
1197         globalLocale = 'en';
1198 
1199     var dateFormatterOptionsDefault = {
1200         meridiem: ['AM', 'PM']
1201     };
1202 
1203     var initDateFormatter = function(){
1204         var locale = default_options.i18n[globalLocale],
1205             opts = {
1206                 days: locale.dayOfWeek,
1207                 daysShort: locale.dayOfWeekShort,
1208                 months: locale.months,
1209                 monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
1210             };
1211 
1212          dateHelper = new DateFormatter({
1213             dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
1214         });
1215     };
1216 
1217     // for locale settings
1218     $.datetimepicker = {
1219         setLocale: function(locale){
1220             var newLocale = default_options.i18n[locale]?locale:globalLocaleDefault;
1221             if(globalLocale != newLocale){
1222                 globalLocale = newLocale;
1223                 // reinit date formatter
1224                 initDateFormatter();
1225             }
1226         },
1227         setDateFormatter: function(dateFormatter) {
1228             dateHelper = dateFormatter;
1229         },
1230         RFC_2822: 'D, d M Y H:i:s O',
1231         ATOM: 'Y-m-d\TH:i:sP',
1232         ISO_8601: 'Y-m-d\TH:i:sO',
1233         RFC_822: 'D, d M y H:i:s O',
1234         RFC_850: 'l, d-M-y H:i:s T',
1235         RFC_1036: 'D, d M y H:i:s O',
1236         RFC_1123: 'D, d M Y H:i:s O',
1237         RSS: 'D, d M Y H:i:s O',
1238         W3C: 'Y-m-d\TH:i:sP'
1239     };
1240 
1241     // first init date formatter
1242     initDateFormatter();
1243 
1244     // fix for ie8
1245     if (!window.getComputedStyle) {
1246         window.getComputedStyle = function (el, pseudo) {
1247             this.el = el;
1248             this.getPropertyValue = function (prop) {
1249                 var re = /(\-([a-z]){1})/g;
1250                 if (prop === 'float') {
1251                     prop = 'styleFloat';
1252                 }
1253                 if (re.test(prop)) {
1254                     prop = prop.replace(re, function (a, b, c) {
1255                         return c.toUpperCase();
1256                     });
1257                 }
1258                 return el.currentStyle[prop] || null;
1259             };
1260             return this;
1261         };
1262     }
1263     if (!Array.prototype.indexOf) {
1264         Array.prototype.indexOf = function (obj, start) {
1265             var i, j;
1266             for (i = (start || 0), j = this.length; i < j; i += 1) {
1267                 if (this[i] === obj) { return i; }
1268             }
1269             return -1;
1270         };
1271     }
1272     Date.prototype.countDaysInMonth = function () {
1273         return new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate();
1274     };
1275     $.fn.xdsoftScroller = function (percent) {
1276         return this.each(function () {
1277             var timeboxparent = $(this),
1278                 pointerEventToXY = function (e) {
1279                     var out = {x: 0, y: 0},
1280                         touch;
1281                     if (e.type === 'touchstart' || e.type === 'touchmove' || e.type === 'touchend' || e.type === 'touchcancel') {
1282                         touch  = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
1283                         out.x = touch.clientX;
1284                         out.y = touch.clientY;
1285                     } else if (e.type === 'mousedown' || e.type === 'mouseup' || e.type === 'mousemove' || e.type === 'mouseover' || e.type === 'mouseout' || e.type === 'mouseenter' || e.type === 'mouseleave') {
1286                         out.x = e.clientX;
1287                         out.y = e.clientY;
1288                     }
1289                     return out;
1290                 },
1291                 timebox,
1292                 parentHeight,
1293                 height,
1294                 scrollbar,
1295                 scroller,
1296                 maximumOffset = 100,
1297                 start = false,
1298                 startY = 0,
1299                 startTop = 0,
1300                 h1 = 0,
1301                 touchStart = false,
1302                 startTopScroll = 0,
1303                 calcOffset = function () {};
1304             if (percent === 'hide') {
1305                 timeboxparent.find('.xdsoft_scrollbar').hide();
1306                 return;
1307             }
1308             if (!$(this).hasClass('xdsoft_scroller_box')) {
1309                 timebox = timeboxparent.children().eq(0);
1310                 parentHeight = timeboxparent[0].clientHeight;
1311                 height = timebox[0].offsetHeight;
1312                 scrollbar = $('<div class="xdsoft_scrollbar"></div>');
1313                 scroller = $('<div class="xdsoft_scroller"></div>');
1314                 scrollbar.append(scroller);
1315 
1316                 timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar);
1317                 calcOffset = function calcOffset(event) {
1318                     var offset = pointerEventToXY(event).y - startY + startTopScroll;
1319                     if (offset < 0) {
1320                         offset = 0;
1321                     }
1322                     if (offset + scroller[0].offsetHeight > h1) {
1323                         offset = h1 - scroller[0].offsetHeight;
1324                     }
1325                     timeboxparent.trigger('scroll_element.xdsoft_scroller', [maximumOffset ? offset / maximumOffset : 0]);
1326                 };
1327 
1328                 scroller
1329                     .on('touchstart.xdsoft_scroller mousedown.xdsoft_scroller', function (event) {
1330                         if (!parentHeight) {
1331                             timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
1332                         }
1333 
1334                         startY = pointerEventToXY(event).y;
1335                         startTopScroll = parseInt(scroller.css('margin-top'), 10);
1336                         h1 = scrollbar[0].offsetHeight;
1337 
1338                         if (event.type === 'mousedown' || event.type === 'touchstart') {
1339                             if (document) {
1340                                 $(document.body).addClass('xdsoft_noselect');
1341                             }
1342                             $([document.body, window]).on('touchend mouseup.xdsoft_scroller', function arguments_callee() {
1343                                 $([document.body, window]).off('touchend mouseup.xdsoft_scroller', arguments_callee)
1344                                     .off('mousemove.xdsoft_scroller', calcOffset)
1345                                     .removeClass('xdsoft_noselect');
1346                             });
1347                             $(document.body).on('mousemove.xdsoft_scroller', calcOffset);
1348                         } else {
1349                             touchStart = true;
1350                             event.stopPropagation();
1351                             event.preventDefault();
1352                         }
1353                     })
1354                     .on('touchmove', function (event) {
1355                         if (touchStart) {
1356                             event.preventDefault();
1357                             calcOffset(event);
1358                         }
1359                     })
1360                     .on('touchend touchcancel', function () {
1361                         touchStart =  false;
1362                         startTopScroll = 0;
1363                     });
1364 
1365                 timeboxparent
1366                     .on('scroll_element.xdsoft_scroller', function (event, percentage) {
1367                         if (!parentHeight) {
1368                             timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percentage, true]);
1369                         }
1370                         percentage = percentage > 1 ? 1 : (percentage < 0 || isNaN(percentage)) ? 0 : percentage;
1371 
1372                         scroller.css('margin-top', maximumOffset * percentage);
1373 
1374                         setTimeout(function () {
1375                             timebox.css('marginTop', -parseInt((timebox[0].offsetHeight - parentHeight) * percentage, 10));
1376                         }, 10);
1377                     })
1378                     .on('resize_scroll.xdsoft_scroller', function (event, percentage, noTriggerScroll) {
1379                         var percent, sh;
1380                         parentHeight = timeboxparent[0].clientHeight;
1381                         height = timebox[0].offsetHeight;
1382                         percent = parentHeight / height;
1383                         sh = percent * scrollbar[0].offsetHeight;
1384                         if (percent > 1) {
1385                             scroller.hide();
1386                         } else {
1387                             scroller.show();
1388                             scroller.css('height', parseInt(sh > 10 ? sh : 10, 10));
1389                             maximumOffset = scrollbar[0].offsetHeight - scroller[0].offsetHeight;
1390                             if (noTriggerScroll !== true) {
1391                                 timeboxparent.trigger('scroll_element.xdsoft_scroller', [percentage || Math.abs(parseInt(timebox.css('marginTop'), 10)) / (height - parentHeight)]);
1392                             }
1393                         }
1394                     });
1395 
1396                 timeboxparent.on('mousewheel', function (event) {
1397                     var top = Math.abs(parseInt(timebox.css('marginTop'), 10));
1398 
1399                     top = top - (event.deltaY * 20);
1400                     if (top < 0) {
1401                         top = 0;
1402                     }
1403 
1404                     timeboxparent.trigger('scroll_element.xdsoft_scroller', [top / (height - parentHeight)]);
1405                     event.stopPropagation();
1406                     return false;
1407                 });
1408 
1409                 timeboxparent.on('touchstart', function (event) {
1410                     start = pointerEventToXY(event);
1411                     startTop = Math.abs(parseInt(timebox.css('marginTop'), 10));
1412                 });
1413 
1414                 timeboxparent.on('touchmove', function (event) {
1415                     if (start) {
1416                         event.preventDefault();
1417                         var coord = pointerEventToXY(event);
1418                         timeboxparent.trigger('scroll_element.xdsoft_scroller', [(startTop - (coord.y - start.y)) / (height - parentHeight)]);
1419                     }
1420                 });
1421 
1422                 timeboxparent.on('touchend touchcancel', function () {
1423                     start = false;
1424                     startTop = 0;
1425                 });
1426             }
1427             timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
1428         });
1429     };
1430 
1431     $.fn.datetimepicker = function (opt, opt2) {
1432         var result = this,
1433             KEY0 = 48,
1434             KEY9 = 57,
1435             _KEY0 = 96,
1436             _KEY9 = 105,
1437             CTRLKEY = 17,
1438             DEL = 46,
1439             ENTER = 13,
1440             ESC = 27,
1441             BACKSPACE = 8,
1442             ARROWLEFT = 37,
1443             ARROWUP = 38,
1444             ARROWRIGHT = 39,
1445             ARROWDOWN = 40,
1446             TAB = 9,
1447             F5 = 116,
1448             AKEY = 65,
1449             CKEY = 67,
1450             VKEY = 86,
1451             ZKEY = 90,
1452             YKEY = 89,
1453             ctrlDown    =    false,
1454             options = ($.isPlainObject(opt) || !opt) ? $.extend(true, {}, default_options, opt) : $.extend(true, {}, default_options),
1455 
1456             lazyInitTimer = 0,
1457             createDateTimePicker,
1458             destroyDateTimePicker,
1459 
1460             lazyInit = function (input) {
1461                 input
1462                     .on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function initOnActionCallback() {
1463                         if (input.is(':disabled') || input.data('xdsoft_datetimepicker')) {
1464                             return;
1465                         }
1466                         clearTimeout(lazyInitTimer);
1467                         lazyInitTimer = setTimeout(function () {
1468 
1469                             if (!input.data('xdsoft_datetimepicker')) {
1470                                 createDateTimePicker(input);
1471                             }
1472                             input
1473                                 .off('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', initOnActionCallback)
1474                                 .trigger('open.xdsoft');
1475                         }, 100);
1476                     });
1477             };
1478 
1479         createDateTimePicker = function (input) {
1480             var datetimepicker = $('<div class="xdsoft_datetimepicker xdsoft_noselect"></div>'),
1481                 xdsoft_copyright = $('<div class="xdsoft_copyright"><a target="_blank" href="http://xdsoft.net/jqplugins/datetimepicker/">xdsoft.net</a></div>'),
1482                 datepicker = $('<div class="xdsoft_datepicker active"></div>'),
1483                 mounth_picker = $('<div class="xdsoft_mounthpicker"><button type="button" class="xdsoft_prev"></button><button type="button" class="xdsoft_today_button"></button>' +
1484                     '<div class="xdsoft_label xdsoft_month"><span></span><i></i></div>' +
1485                     '<div class="xdsoft_label xdsoft_year"><span></span><i></i></div>' +
1486                     '<button type="button" class="xdsoft_next"></button></div>'),
1487                 calendar = $('<div class="xdsoft_calendar"></div>'),
1488                 timepicker = $('<div class="xdsoft_timepicker active"><button type="button" class="xdsoft_prev"></button><div class="xdsoft_time_box"></div><button type="button" class="xdsoft_next"></button></div>'),
1489                 timeboxparent = timepicker.find('.xdsoft_time_box').eq(0),
1490                 timebox = $('<div class="xdsoft_time_variant"></div>'),
1491                 applyButton = $('<button type="button" class="xdsoft_save_selected blue-gradient-button">Save Selected</button>'),
1492 
1493                 monthselect = $('<div class="xdsoft_select xdsoft_monthselect"><div></div></div>'),
1494                 yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
1495                 triggerAfterOpen = false,
1496                 XDSoft_datetime,
1497 
1498                 xchangeTimer,
1499                 timerclick,
1500                 current_time_index,
1501                 setPos,
1502                 timer = 0,
1503                 _xdsoft_datetime,
1504                 forEachAncestorOf;
1505 
1506             if (options.id) {
1507                 datetimepicker.attr('id', options.id);
1508             }
1509             if (options.style) {
1510                 datetimepicker.attr('style', options.style);
1511             }
1512             if (options.weeks) {
1513                 datetimepicker.addClass('xdsoft_showweeks');
1514             }
1515             if (options.rtl) {
1516                 datetimepicker.addClass('xdsoft_rtl');
1517             }
1518 
1519             datetimepicker.addClass('xdsoft_' + options.theme);
1520             datetimepicker.addClass(options.className);
1521 
1522             mounth_picker
1523                 .find('.xdsoft_month span')
1524                     .after(monthselect);
1525             mounth_picker
1526                 .find('.xdsoft_year span')
1527                     .after(yearselect);
1528 
1529             mounth_picker
1530                 .find('.xdsoft_month,.xdsoft_year')
1531                     .on('touchstart mousedown.xdsoft', function (event) {
1532                     var select = $(this).find('.xdsoft_select').eq(0),
1533                         val = 0,
1534                         top = 0,
1535                         visible = select.is(':visible'),
1536                         items,
1537                         i;
1538 
1539                     mounth_picker
1540                         .find('.xdsoft_select')
1541                             .hide();
1542                     if (_xdsoft_datetime.currentTime) {
1543                         val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month') ? 'getMonth' : 'getFullYear']();
1544                     }
1545 
1546                     select[visible ? 'hide' : 'show']();
1547                     for (items = select.find('div.xdsoft_option'), i = 0; i < items.length; i += 1) {
1548                         if (items.eq(i).data('value') === val) {
1549                             break;
1550                         } else {
1551                             top += items[0].offsetHeight;
1552                         }
1553                     }
1554 
1555                     select.xdsoftScroller(top / (select.children()[0].offsetHeight - (select[0].clientHeight)));
1556                     event.stopPropagation();
1557                     return false;
1558                 });
1559 
1560             mounth_picker
1561                 .find('.xdsoft_select')
1562                     .xdsoftScroller()
1563                 .on('touchstart mousedown.xdsoft', function (event) {
1564                     event.stopPropagation();
1565                     event.preventDefault();
1566                 })
1567                 .on('touchstart mousedown.xdsoft', '.xdsoft_option', function () {
1568                     if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
1569                         _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1570                     }
1571 
1572                     var year = _xdsoft_datetime.currentTime.getFullYear();
1573                     if (_xdsoft_datetime && _xdsoft_datetime.currentTime) {
1574                         _xdsoft_datetime.currentTime[$(this).parent().parent().hasClass('xdsoft_monthselect') ? 'setMonth' : 'setFullYear']($(this).data('value'));
1575                     }
1576 
1577                     $(this).parent().parent().hide();
1578 
1579                     datetimepicker.trigger('xchange.xdsoft');
1580                     if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1581                         options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1582                     }
1583 
1584                     if (year !== _xdsoft_datetime.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1585                         options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1586                     }
1587                 });
1588 
1589             datetimepicker.getValue = function () {
1590                 return _xdsoft_datetime.getCurrentTime();
1591             };
1592 
1593             datetimepicker.setOptions = function (_options) {
1594                 var highlightedDates = {};
1595 
1596                 options = $.extend(true, {}, options, _options);
1597 
1598                 if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
1599                     options.allowTimes = $.extend(true, [], _options.allowTimes);
1600                 }
1601 
1602                 if (_options.weekends && $.isArray(_options.weekends) && _options.weekends.length) {
1603                     options.weekends = $.extend(true, [], _options.weekends);
1604                 }
1605 
1606                 if (_options.allowDates && $.isArray(_options.allowDates) && _options.allowDates.length) {
1607                     options.allowDates = $.extend(true, [], _options.allowDates);
1608                 }
1609 
1610                 if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
1611                     options.allowDateRe = new RegExp(_options.allowDateRe);
1612                 }
1613 
1614                 if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
1615                     $.each(_options.highlightedDates, function (index, value) {
1616                         var splitData = $.map(value.split(','), $.trim),
1617                             exDesc,
1618                             hDate = new HighlightedDate(dateHelper.parseDate(splitData[0], options.formatDate), splitData[1], splitData[2]), // date, desc, style
1619                             keyDate = dateHelper.formatDate(hDate.date, options.formatDate);
1620                         if (highlightedDates[keyDate] !== undefined) {
1621                             exDesc = highlightedDates[keyDate].desc;
1622                             if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) {
1623                                 highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc;
1624                             }
1625                         } else {
1626                             highlightedDates[keyDate] = hDate;
1627                         }
1628                     });
1629 
1630                     options.highlightedDates = $.extend(true, [], highlightedDates);
1631                 }
1632 
1633                 if (_options.highlightedPeriods && $.isArray(_options.highlightedPeriods) && _options.highlightedPeriods.length) {
1634                     highlightedDates = $.extend(true, [], options.highlightedDates);
1635                     $.each(_options.highlightedPeriods, function (index, value) {
1636                         var dateTest, // start date
1637                             dateEnd,
1638                             desc,
1639                             hDate,
1640                             keyDate,
1641                             exDesc,
1642                             style;
1643                         if ($.isArray(value)) {
1644                             dateTest = value[0];
1645                             dateEnd = value[1];
1646                             desc = value[2];
1647                             style = value[3];
1648                         }
1649                         else {
1650                             var splitData = $.map(value.split(','), $.trim);
1651                             dateTest = dateHelper.parseDate(splitData[0], options.formatDate);
1652                             dateEnd = dateHelper.parseDate(splitData[1], options.formatDate);
1653                             desc = splitData[2];
1654                             style = splitData[3];
1655                         }
1656 
1657                         while (dateTest <= dateEnd) {
1658                             hDate = new HighlightedDate(dateTest, desc, style);
1659                             keyDate = dateHelper.formatDate(dateTest, options.formatDate);
1660                             dateTest.setDate(dateTest.getDate() + 1);
1661                             if (highlightedDates[keyDate] !== undefined) {
1662                                 exDesc = highlightedDates[keyDate].desc;
1663                                 if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) {
1664                                     highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc;
1665                                 }
1666                             } else {
1667                                 highlightedDates[keyDate] = hDate;
1668                             }
1669                         }
1670                     });
1671 
1672                     options.highlightedDates = $.extend(true, [], highlightedDates);
1673                 }
1674 
1675                 if (_options.disabledDates && $.isArray(_options.disabledDates) && _options.disabledDates.length) {
1676                     options.disabledDates = $.extend(true, [], _options.disabledDates);
1677                 }
1678 
1679                 if (_options.disabledWeekDays && $.isArray(_options.disabledWeekDays) && _options.disabledWeekDays.length) {
1680                     options.disabledWeekDays = $.extend(true, [], _options.disabledWeekDays);
1681                 }
1682 
1683                 if ((options.open || options.opened) && (!options.inline)) {
1684                     input.trigger('open.xdsoft');
1685                 }
1686 
1687                 if (options.inline) {
1688                     triggerAfterOpen = true;
1689                     datetimepicker.addClass('xdsoft_inline');
1690                     input.after(datetimepicker).hide();
1691                 }
1692 
1693                 if (options.inverseButton) {
1694                     options.next = 'xdsoft_prev';
1695                     options.prev = 'xdsoft_next';
1696                 }
1697 
1698                 if (options.datepicker) {
1699                     datepicker.addClass('active');
1700                 } else {
1701                     datepicker.removeClass('active');
1702                 }
1703 
1704                 if (options.timepicker) {
1705                     timepicker.addClass('active');
1706                 } else {
1707                     timepicker.removeClass('active');
1708                 }
1709 
1710                 if (options.value) {
1711                     _xdsoft_datetime.setCurrentTime(options.value);
1712                     if (input && input.val) {
1713                         input.val(_xdsoft_datetime.str);
1714                     }
1715                 }
1716 
1717                 if (isNaN(options.dayOfWeekStart)) {
1718                     options.dayOfWeekStart = 0;
1719                 } else {
1720                     options.dayOfWeekStart = parseInt(options.dayOfWeekStart, 10) % 7;
1721                 }
1722 
1723                 if (!options.timepickerScrollbar) {
1724                     timeboxparent.xdsoftScroller('hide');
1725                 }
1726 
1727                 if (options.minDate && /^[\+\-](.*)$/.test(options.minDate)) {
1728                     options.minDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.minDate), options.formatDate);
1729                 }
1730 
1731                 if (options.maxDate &&  /^[\+\-](.*)$/.test(options.maxDate)) {
1732                     options.maxDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.maxDate), options.formatDate);
1733                 }
1734 
1735                 applyButton.toggle(options.showApplyButton);
1736 
1737                 mounth_picker
1738                     .find('.xdsoft_today_button')
1739                         .css('visibility', !options.todayButton ? 'hidden' : 'visible');
1740 
1741                 mounth_picker
1742                     .find('.' + options.prev)
1743                         .css('visibility', !options.prevButton ? 'hidden' : 'visible');
1744 
1745                 mounth_picker
1746                     .find('.' + options.next)
1747                         .css('visibility', !options.nextButton ? 'hidden' : 'visible');
1748 
1749                 setMask(options);
1750 
1751                 if (options.validateOnBlur) {
1752                     input
1753                         .off('blur.xdsoft')
1754                         .on('blur.xdsoft', function () {
1755                             if (options.allowBlank && (!$.trim($(this).val()).length || (typeof options.mask == "string" && $.trim($(this).val()) === options.mask.replace(/[0-9]/g, '_')))) {
1756                                 $(this).val(null);
1757                                 datetimepicker.data('xdsoft_datetime').empty();
1758                             } else {
1759                                 var d = dateHelper.parseDate($(this).val(), options.format);
1760                                 if (d) { // parseDate() may skip some invalid parts like date or time, so make it clear for user: show parsed date/time
1761                                     $(this).val(dateHelper.formatDate(d, options.format));
1762                                 } else {
1763                                     var splittedHours   = +([$(this).val()[0], $(this).val()[1]].join('')),
1764                                         splittedMinutes = +([$(this).val()[2], $(this).val()[3]].join(''));
1765     
1766                                     // parse the numbers as 0312 => 03:12
1767                                     if (!options.datepicker && options.timepicker && splittedHours >= 0 && splittedHours < 24 && splittedMinutes >= 0 && splittedMinutes < 60) {
1768                                         $(this).val([splittedHours, splittedMinutes].map(function (item) {
1769                                             return item > 9 ? item : '0' + item;
1770                                         }).join(':'));
1771                                     } else {
1772                                         $(this).val(dateHelper.formatDate(_xdsoft_datetime.now(), options.format));
1773                                     }
1774                                 }
1775                                 datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val());
1776                             }
1777 
1778                             datetimepicker.trigger('changedatetime.xdsoft');
1779                             datetimepicker.trigger('close.xdsoft');
1780                         });
1781                 }
1782                 options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
1783 
1784                 datetimepicker
1785                     .trigger('xchange.xdsoft')
1786                     .trigger('afterOpen.xdsoft');
1787             };
1788 
1789             datetimepicker
1790                 .data('options', options)
1791                 .on('touchstart mousedown.xdsoft', function (event) {
1792                     event.stopPropagation();
1793                     event.preventDefault();
1794                     yearselect.hide();
1795                     monthselect.hide();
1796                     return false;
1797                 });
1798 
1799             //scroll_element = timepicker.find('.xdsoft_time_box');
1800             timeboxparent.append(timebox);
1801             timeboxparent.xdsoftScroller();
1802 
1803             datetimepicker.on('afterOpen.xdsoft', function () {
1804                 timeboxparent.xdsoftScroller();
1805             });
1806 
1807             datetimepicker
1808                 .append(datepicker)
1809                 .append(timepicker);
1810 
1811             if (options.withoutCopyright !== true) {
1812                 datetimepicker
1813                     .append(xdsoft_copyright);
1814             }
1815 
1816             datepicker
1817                 .append(mounth_picker)
1818                 .append(calendar)
1819                 .append(applyButton);
1820 
1821             $(options.parentID)
1822                 .append(datetimepicker);
1823 
1824             XDSoft_datetime = function () {
1825                 var _this = this;
1826                 _this.now = function (norecursion) {
1827                     var d = new Date(),
1828                         date,
1829                         time;
1830 
1831                     if (!norecursion && options.defaultDate) {
1832                         date = _this.strToDateTime(options.defaultDate);
1833                         d.setFullYear(date.getFullYear());
1834                         d.setMonth(date.getMonth());
1835                         d.setDate(date.getDate());
1836                     }
1837 
1838                     if (options.yearOffset) {
1839                         d.setFullYear(d.getFullYear() + options.yearOffset);
1840                     }
1841 
1842                     if (!norecursion && options.defaultTime) {
1843                         time = _this.strtotime(options.defaultTime);
1844                         d.setHours(time.getHours());
1845                         d.setMinutes(time.getMinutes());
1846                     }
1847                     return d;
1848                 };
1849 
1850                 _this.isValidDate = function (d) {
1851                     if (Object.prototype.toString.call(d) !== "[object Date]") {
1852                         return false;
1853                     }
1854                     return !isNaN(d.getTime());
1855                 };
1856 
1857                 _this.setCurrentTime = function (dTime) {
1858                     _this.currentTime = (typeof dTime === 'string') ? _this.strToDateTime(dTime) : _this.isValidDate(dTime) ? dTime : _this.now();
1859                     datetimepicker.trigger('xchange.xdsoft');
1860                 };
1861 
1862                 _this.empty = function () {
1863                     _this.currentTime = null;
1864                 };
1865 
1866                 _this.getCurrentTime = function (dTime) {
1867                     return _this.currentTime;
1868                 };
1869 
1870                 _this.nextMonth = function () {
1871 
1872                     if (_this.currentTime === undefined || _this.currentTime === null) {
1873                         _this.currentTime = _this.now();
1874                     }
1875 
1876                     var month = _this.currentTime.getMonth() + 1,
1877                         year;
1878                     if (month === 12) {
1879                         _this.currentTime.setFullYear(_this.currentTime.getFullYear() + 1);
1880                         month = 0;
1881                     }
1882 
1883                     year = _this.currentTime.getFullYear();
1884 
1885                     _this.currentTime.setDate(
1886                         Math.min(
1887                             new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1888                             _this.currentTime.getDate()
1889                         )
1890                     );
1891                     _this.currentTime.setMonth(month);
1892 
1893                     if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1894                         options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1895                     }
1896 
1897                     if (year !== _this.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1898                         options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1899                     }
1900 
1901                     datetimepicker.trigger('xchange.xdsoft');
1902                     return month;
1903                 };
1904 
1905                 _this.prevMonth = function () {
1906 
1907                     if (_this.currentTime === undefined || _this.currentTime === null) {
1908                         _this.currentTime = _this.now();
1909                     }
1910 
1911                     var month = _this.currentTime.getMonth() - 1;
1912                     if (month === -1) {
1913                         _this.currentTime.setFullYear(_this.currentTime.getFullYear() - 1);
1914                         month = 11;
1915                     }
1916                     _this.currentTime.setDate(
1917                         Math.min(
1918                             new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1919                             _this.currentTime.getDate()
1920                         )
1921                     );
1922                     _this.currentTime.setMonth(month);
1923                     if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1924                         options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1925                     }
1926                     datetimepicker.trigger('xchange.xdsoft');
1927                     return month;
1928                 };
1929 
1930                 _this.getWeekOfYear = function (datetime) {
1931                     if (options.onGetWeekOfYear && $.isFunction(options.onGetWeekOfYear)) {
1932                         var week = options.onGetWeekOfYear.call(datetimepicker, datetime);
1933                         if (typeof week !== 'undefined') {
1934                             return week;
1935                         }
1936                     }
1937                     var onejan = new Date(datetime.getFullYear(), 0, 1);
1938                     //First week of the year is th one with the first Thursday according to ISO8601
1939                     if(onejan.getDay()!=4)
1940                         onejan.setMonth(0, 1 + ((4 - onejan.getDay()+ 7) % 7));
1941                     return Math.ceil((((datetime - onejan) / 86400000) + onejan.getDay() + 1) / 7);
1942                 };
1943 
1944                 _this.strToDateTime = function (sDateTime) {
1945                     var tmpDate = [], timeOffset, currentTime;
1946 
1947                     if (sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime)) {
1948                         return sDateTime;
1949                     }
1950 
1951                     tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime);
1952                     if (tmpDate) {
1953                         tmpDate[2] = dateHelper.parseDate(tmpDate[2], options.formatDate);
1954                     }
1955                     if (tmpDate  && tmpDate[2]) {
1956                         timeOffset = tmpDate[2].getTime() - (tmpDate[2].getTimezoneOffset()) * 60000;
1957                         currentTime = new Date((_this.now(true)).getTime() + parseInt(tmpDate[1] + '1', 10) * timeOffset);
1958                     } else {
1959                         currentTime = sDateTime ? dateHelper.parseDate(sDateTime, options.format) : _this.now();
1960                     }
1961 
1962                     if (!_this.isValidDate(currentTime)) {
1963                         currentTime = _this.now();
1964                     }
1965 
1966                     return currentTime;
1967                 };
1968 
1969                 _this.strToDate = function (sDate) {
1970                     if (sDate && sDate instanceof Date && _this.isValidDate(sDate)) {
1971                         return sDate;
1972                     }
1973 
1974                     var currentTime = sDate ? dateHelper.parseDate(sDate, options.formatDate) : _this.now(true);
1975                     if (!_this.isValidDate(currentTime)) {
1976                         currentTime = _this.now(true);
1977                     }
1978                     return currentTime;
1979                 };
1980 
1981                 _this.strtotime = function (sTime) {
1982                     if (sTime && sTime instanceof Date && _this.isValidDate(sTime)) {
1983                         return sTime;
1984                     }
1985                     var currentTime = sTime ? dateHelper.parseDate(sTime, options.formatTime) : _this.now(true);
1986                     if (!_this.isValidDate(currentTime)) {
1987                         currentTime = _this.now(true);
1988                     }
1989                     return currentTime;
1990                 };
1991 
1992                 _this.str = function () {
1993                     return dateHelper.formatDate(_this.currentTime, options.format);
1994                 };
1995                 _this.currentTime = this.now();
1996             };
1997 
1998             _xdsoft_datetime = new XDSoft_datetime();
1999 
2000             applyButton.on('touchend click', function (e) {//pathbrite
2001                 e.preventDefault();
2002                 datetimepicker.data('changed', true);
2003                 _xdsoft_datetime.setCurrentTime(getCurrentValue());
2004                 input.val(_xdsoft_datetime.str());
2005                 datetimepicker.trigger('close.xdsoft');
2006             });
2007             mounth_picker
2008                 .find('.xdsoft_today_button')
2009                 .on('touchend mousedown.xdsoft', function () {
2010                     datetimepicker.data('changed', true);
2011                     _xdsoft_datetime.setCurrentTime(0);
2012                     datetimepicker.trigger('afterOpen.xdsoft');
2013                 }).on('dblclick.xdsoft', function () {
2014                     var currentDate = _xdsoft_datetime.getCurrentTime(), minDate, maxDate;
2015                     currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
2016                     minDate = _xdsoft_datetime.strToDate(options.minDate);
2017                     minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
2018                     if (currentDate < minDate) {
2019                         return;
2020                     }
2021                     maxDate = _xdsoft_datetime.strToDate(options.maxDate);
2022                     maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());
2023                     if (currentDate > maxDate) {
2024                         return;
2025                     }
2026                     input.val(_xdsoft_datetime.str());
2027                     input.trigger('change');
2028                     datetimepicker.trigger('close.xdsoft');
2029                 });
2030             mounth_picker
2031                 .find('.xdsoft_prev,.xdsoft_next')
2032                 .on('touchend mousedown.xdsoft', function () {
2033                     var $this = $(this),
2034                         timer = 0,
2035                         stop = false;
2036 
2037                     (function arguments_callee1(v) {
2038                         if ($this.hasClass(options.next)) {
2039                             _xdsoft_datetime.nextMonth();
2040                         } else if ($this.hasClass(options.prev)) {
2041                             _xdsoft_datetime.prevMonth();
2042                         }
2043                         if (options.monthChangeSpinner) {
2044                             if (!stop) {
2045                                 timer = setTimeout(arguments_callee1, v || 100);
2046                             }
2047                         }
2048                     }(500));
2049 
2050                     $([document.body, window]).on('touchend mouseup.xdsoft', function arguments_callee2() {
2051                         clearTimeout(timer);
2052                         stop = true;
2053                         $([document.body, window]).off('touchend mouseup.xdsoft', arguments_callee2);
2054                     });
2055                 });
2056 
2057             timepicker
2058                 .find('.xdsoft_prev,.xdsoft_next')
2059                 .on('touchend mousedown.xdsoft', function () {
2060                     var $this = $(this),
2061                         timer = 0,
2062                         stop = false,
2063                         period = 110;
2064                     (function arguments_callee4(v) {
2065                         var pheight = timeboxparent[0].clientHeight,
2066                             height = timebox[0].offsetHeight,
2067                             top = Math.abs(parseInt(timebox.css('marginTop'), 10));
2068                         if ($this.hasClass(options.next) && (height - pheight) - options.timeHeightInTimePicker >= top) {
2069                             timebox.css('marginTop', '-' + (top + options.timeHeightInTimePicker) + 'px');
2070                         } else if ($this.hasClass(options.prev) && top - options.timeHeightInTimePicker >= 0) {
2071                             timebox.css('marginTop', '-' + (top - options.timeHeightInTimePicker) + 'px');
2072                         }
2073                         /**
2074                          * Fixed bug:
2075                          * When using css3 transition, it will cause a bug that you cannot scroll the timepicker list.
2076                          * The reason is that the transition-duration time, if you set it to 0, all things fine, otherwise, this
2077                          * would cause a bug when you use jquery.css method.
2078                          * Let's say: * { transition: all .5s ease; }
2079                          * jquery timebox.css('marginTop') will return the original value which is before you clicking the next/prev button,
2080                          * meanwhile the timebox[0].style.marginTop will return the right value which is after you clicking the
2081                          * next/prev button.
2082                          * 
2083                          * What we should do:
2084                          * Replace timebox.css('marginTop') with timebox[0].style.marginTop.
2085                          */
2086                         timeboxparent.trigger('scroll_element.xdsoft_scroller', [Math.abs(parseInt(timebox[0].style.marginTop, 10) / (height - pheight))]);
2087                         period = (period > 10) ? 10 : period - 10;
2088                         if (!stop) {
2089                             timer = setTimeout(arguments_callee4, v || period);
2090                         }
2091                     }(500));
2092                     $([document.body, window]).on('touchend mouseup.xdsoft', function arguments_callee5() {
2093                         clearTimeout(timer);
2094                         stop = true;
2095                         $([document.body, window])
2096                             .off('touchend mouseup.xdsoft', arguments_callee5);
2097                     });
2098                 });
2099 
2100             xchangeTimer = 0;
2101             // base handler - generating a calendar and timepicker
2102             datetimepicker
2103                 .on('xchange.xdsoft', function (event) {
2104                     clearTimeout(xchangeTimer);
2105                     xchangeTimer = setTimeout(function () {
2106 
2107                         if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
2108                             _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
2109                         }
2110 
2111                         var table =    '',
2112                             start = new Date(_xdsoft_datetime.currentTime.getFullYear(), _xdsoft_datetime.currentTime.getMonth(), 1, 12, 0, 0),
2113                             i = 0,
2114                             j,
2115                             today = _xdsoft_datetime.now(),
2116                             maxDate = false,
2117                             minDate = false,
2118                             hDate,
2119                             day,
2120                             d,
2121                             y,
2122                             m,
2123                             w,
2124                             classes = [],
2125                             customDateSettings,
2126                             newRow = true,
2127                             time = '',
2128                             h = '',
2129                             line_time,
2130                             description;
2131 
2132                         while (start.getDay() !== options.dayOfWeekStart) {
2133                             start.setDate(start.getDate() - 1);
2134                         }
2135 
2136                         table += '<table><thead><tr>';
2137 
2138                         if (options.weeks) {
2139                             table += '<th></th>';
2140                         }
2141 
2142                         for (j = 0; j < 7; j += 1) {
2143                             table += '<th>' + options.i18n[globalLocale].dayOfWeekShort[(j + options.dayOfWeekStart) % 7] + '</th>';
2144                         }
2145 
2146                         table += '</tr></thead>';
2147                         table += '<tbody>';
2148 
2149                         if (options.maxDate !== false) {
2150                             maxDate = _xdsoft_datetime.strToDate(options.maxDate);
2151                             maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59, 59, 999);
2152                         }
2153 
2154                         if (options.minDate !== false) {
2155                             minDate = _xdsoft_datetime.strToDate(options.minDate);
2156                             minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
2157                         }
2158 
2159                         while (i < _xdsoft_datetime.currentTime.countDaysInMonth() || start.getDay() !== options.dayOfWeekStart || _xdsoft_datetime.currentTime.getMonth() === start.getMonth()) {
2160                             classes = [];
2161                             i += 1;
2162 
2163                             day = start.getDay();
2164                             d = start.getDate();
2165                             y = start.getFullYear();
2166                             m = start.getMonth();
2167                             w = _xdsoft_datetime.getWeekOfYear(start);
2168                             description = '';
2169 
2170                             classes.push('xdsoft_date');
2171 
2172                             if (options.beforeShowDay && $.isFunction(options.beforeShowDay.call)) {
2173                                 customDateSettings = options.beforeShowDay.call(datetimepicker, start);
2174                             } else {
2175                                 customDateSettings = null;
2176                             }
2177 
2178                             if(options.allowDateRe && Object.prototype.toString.call(options.allowDateRe) === "[object RegExp]"){
2179                                 if(!options.allowDateRe.test(dateHelper.formatDate(start, options.formatDate))){
2180                                     classes.push('xdsoft_disabled');
2181                                 }
2182                             } else if(options.allowDates && options.allowDates.length>0){
2183                                 if(options.allowDates.indexOf(dateHelper.formatDate(start, options.formatDate)) === -1){
2184                                     classes.push('xdsoft_disabled');
2185                                 }
2186                             } else if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
2187                                 classes.push('xdsoft_disabled');
2188                             } else if (options.disabledDates.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
2189                                 classes.push('xdsoft_disabled');
2190                             } else if (options.disabledWeekDays.indexOf(day) !== -1) {
2191                                 classes.push('xdsoft_disabled');
2192                             }else if (input.is('[readonly]')) {
2193                                 classes.push('xdsoft_disabled');
2194                             }
2195 
2196                             if (customDateSettings && customDateSettings[1] !== "") {
2197                                 classes.push(customDateSettings[1]);
2198                             }
2199 
2200                             if (_xdsoft_datetime.currentTime.getMonth() !== m) {
2201                                 classes.push('xdsoft_other_month');
2202                             }
2203 
2204                             if ((options.defaultSelect || datetimepicker.data('changed')) && dateHelper.formatDate(_xdsoft_datetime.currentTime, options.formatDate) === dateHelper.formatDate(start, options.formatDate)) {
2205                                 classes.push('xdsoft_current');
2206                             }
2207 
2208                             if (dateHelper.formatDate(today, options.formatDate) === dateHelper.formatDate(start, options.formatDate)) {
2209                                 classes.push('xdsoft_today');
2210                             }
2211 
2212                             if (start.getDay() === 0 || start.getDay() === 6 || options.weekends.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
2213                                 classes.push('xdsoft_weekend');
2214                             }
2215 
2216                             if (options.highlightedDates[dateHelper.formatDate(start, options.formatDate)] !== undefined) {
2217                                 hDate = options.highlightedDates[dateHelper.formatDate(start, options.formatDate)];
2218                                 classes.push(hDate.style === undefined ? 'xdsoft_highlighted_default' : hDate.style);
2219                                 description = hDate.desc === undefined ? '' : hDate.desc;
2220                             }
2221 
2222                             if (options.beforeShowDay && $.isFunction(options.beforeShowDay)) {
2223                                 classes.push(options.beforeShowDay(start));
2224                             }
2225 
2226                             if (newRow) {
2227                                 table += '<tr>';
2228                                 newRow = false;
2229                                 if (options.weeks) {
2230                                     table += '<th>' + w + '</th>';
2231                                 }
2232                             }
2233 
2234                             table += '<td data-date="' + d + '" data-month="' + m + '" data-year="' + y + '"' + ' class="xdsoft_date xdsoft_day_of_week' + start.getDay() + ' ' + classes.join(' ') + '" title="' + description + '">' +
2235                                         '<div>' + d + '</div>' +
2236                                     '</td>';
2237 
2238                             if (start.getDay() === options.dayOfWeekStartPrev) {
2239                                 table += '</tr>';
2240                                 newRow = true;
2241                             }
2242 
2243                             start.setDate(d + 1);
2244                         }
2245                         table += '</tbody></table>';
2246 
2247                         calendar.html(table);
2248 
2249                         mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[globalLocale].months[_xdsoft_datetime.currentTime.getMonth()]);
2250                         mounth_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear());
2251 
2252                         // generate timebox
2253                         time = '';
2254                         h = '';
2255                         m = '';
2256 
2257                         line_time = function line_time(h, m) {
2258                             var now = _xdsoft_datetime.now(), optionDateTime, current_time,
2259                                 isALlowTimesInit = options.allowTimes && $.isArray(options.allowTimes) && options.allowTimes.length;
2260                             now.setHours(h);
2261                             h = parseInt(now.getHours(), 10);
2262                             now.setMinutes(m);
2263                             m = parseInt(now.getMinutes(), 10);
2264                             optionDateTime = new Date(_xdsoft_datetime.currentTime);
2265                             optionDateTime.setHours(h);
2266                             optionDateTime.setMinutes(m);
2267                             classes = [];            
2268                             if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || (options.maxTime !== false && _xdsoft_datetime.strtotime(options.maxTime).getTime() < now.getTime()) || (options.minTime !== false && _xdsoft_datetime.strtotime(options.minTime).getTime() > now.getTime())) {
2269                                 classes.push('xdsoft_disabled');
2270                             } else if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || ((options.disabledMinTime !== false && now.getTime() > _xdsoft_datetime.strtotime(options.disabledMinTime).getTime()) && (options.disabledMaxTime !== false && now.getTime() < _xdsoft_datetime.strtotime(options.disabledMaxTime).getTime()))) {
2271                                 classes.push('xdsoft_disabled');
2272                             } else if (input.is('[readonly]')) {
2273                                 classes.push('xdsoft_disabled');
2274                             }
2275 
2276                             current_time = new Date(_xdsoft_datetime.currentTime);
2277                             current_time.setHours(parseInt(_xdsoft_datetime.currentTime.getHours(), 10));
2278 
2279                             if (!isALlowTimesInit) {
2280                                 current_time.setMinutes(Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes() / options.step) * options.step);
2281                             }
2282 
2283                             if ((options.initTime || options.defaultSelect || datetimepicker.data('changed')) && current_time.getHours() === parseInt(h, 10) && ((!isALlowTimesInit && options.step > 59) || current_time.getMinutes() === parseInt(m, 10))) {
2284                                 if (options.defaultSelect || datetimepicker.data('changed')) {
2285                                     classes.push('xdsoft_current');
2286                                 } else if (options.initTime) {
2287                                     classes.push('xdsoft_init_time');
2288                                 }
2289                             }
2290                             if (parseInt(today.getHours(), 10) === parseInt(h, 10) && parseInt(today.getMinutes(), 10) === parseInt(m, 10)) {
2291                                 classes.push('xdsoft_today');
2292                             }
2293                             time += '<div class="xdsoft_time ' + classes.join(' ') + '" data-hour="' + h + '" data-minute="' + m + '">' + dateHelper.formatDate(now, options.formatTime) + '</div>';
2294                         };
2295 
2296                         if (!options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length) {
2297                             for (i = 0, j = 0; i < (options.hours12 ? 12 : 24); i += 1) {
2298                                 for (j = 0; j < 60; j += options.step) {
2299                                     h = (i < 10 ? '0' : '') + i;
2300                                     m = (j < 10 ? '0' : '') + j;
2301                                     line_time(h, m);
2302                                 }
2303                             }
2304                         } else {
2305                             for (i = 0; i < options.allowTimes.length; i += 1) {
2306                                 h = _xdsoft_datetime.strtotime(options.allowTimes[i]).getHours();
2307                                 m = _xdsoft_datetime.strtotime(options.allowTimes[i]).getMinutes();
2308                                 line_time(h, m);
2309                             }
2310                         }
2311 
2312                         timebox.html(time);
2313 
2314                         opt = '';
2315                         i = 0;
2316 
2317                         for (i = parseInt(options.yearStart, 10) + options.yearOffset; i <= parseInt(options.yearEnd, 10) + options.yearOffset; i += 1) {
2318                             opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getFullYear() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + i + '</div>';
2319                         }
2320                         yearselect.children().eq(0)
2321                                                 .html(opt);
2322 
2323                         for (i = parseInt(options.monthStart, 10), opt = ''; i <= parseInt(options.monthEnd, 10); i += 1) {
2324                             opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getMonth() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + options.i18n[globalLocale].months[i] + '</div>';
2325                         }
2326                         monthselect.children().eq(0).html(opt);
2327                         $(datetimepicker)
2328                             .trigger('generate.xdsoft');
2329                     }, 10);
2330                     event.stopPropagation();
2331                 })
2332                 .on('afterOpen.xdsoft', function () {
2333                     if (options.timepicker) {
2334                         var classType, pheight, height, top;
2335                         if (timebox.find('.xdsoft_current').length) {
2336                             classType = '.xdsoft_current';
2337                         } else if (timebox.find('.xdsoft_init_time').length) {
2338                             classType = '.xdsoft_init_time';
2339                         }
2340                         if (classType) {
2341                             pheight = timeboxparent[0].clientHeight;
2342                             height = timebox[0].offsetHeight;
2343                             top = timebox.find(classType).index() * options.timeHeightInTimePicker + 1;
2344                             if ((height - pheight) < top) {
2345                                 top = height - pheight;
2346                             }
2347                             timeboxparent.trigger('scroll_element.xdsoft_scroller', [parseInt(top, 10) / (height - pheight)]);
2348                         } else {
2349                             timeboxparent.trigger('scroll_element.xdsoft_scroller', [0]);
2350                         }
2351                     }
2352                 });
2353 
2354             timerclick = 0;
2355             calendar
2356                 .on('touchend click.xdsoft', 'td', function (xdevent) {
2357                     xdevent.stopPropagation();  // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap
2358                     timerclick += 1;
2359                     var $this = $(this),
2360                         currentTime = _xdsoft_datetime.currentTime;
2361 
2362                     if (currentTime === undefined || currentTime === null) {
2363                         _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
2364                         currentTime = _xdsoft_datetime.currentTime;
2365                     }
2366 
2367                     if ($this.hasClass('xdsoft_disabled')) {
2368                         return false;
2369                     }
2370 
2371                     currentTime.setDate(1);
2372                     currentTime.setFullYear($this.data('year'));
2373                     currentTime.setMonth($this.data('month'));
2374                     currentTime.setDate($this.data('date'));
2375 
2376                     datetimepicker.trigger('select.xdsoft', [currentTime]);
2377 
2378                     input.val(_xdsoft_datetime.str());
2379 
2380                     if (options.onSelectDate &&    $.isFunction(options.onSelectDate)) {
2381                         options.onSelectDate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
2382                     }
2383 
2384                     datetimepicker.data('changed', true);
2385                     datetimepicker.trigger('xchange.xdsoft');
2386                     datetimepicker.trigger('changedatetime.xdsoft');
2387                     if ((timerclick > 1 || (options.closeOnDateSelect === true || (options.closeOnDateSelect === false && !options.timepicker))) && !options.inline) {
2388                         datetimepicker.trigger('close.xdsoft');
2389                     }
2390                     setTimeout(function () {
2391                         timerclick = 0;
2392                     }, 200);
2393                 });
2394 
2395             timebox
2396                 .on('touchend click.xdsoft', 'div', function (xdevent) {
2397                     xdevent.stopPropagation();
2398                     var $this = $(this),
2399                         currentTime = _xdsoft_datetime.currentTime;
2400 
2401                     if (currentTime === undefined || currentTime === null) {
2402                         _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
2403                         currentTime = _xdsoft_datetime.currentTime;
2404                     }
2405 
2406                     if ($this.hasClass('xdsoft_disabled')) {
2407                         return false;
2408                     }
2409                     currentTime.setHours($this.data('hour'));
2410                     currentTime.setMinutes($this.data('minute'));
2411                     datetimepicker.trigger('select.xdsoft', [currentTime]);
2412 
2413                     datetimepicker.data('input').val(_xdsoft_datetime.str());
2414 
2415                     if (options.onSelectTime && $.isFunction(options.onSelectTime)) {
2416                         options.onSelectTime.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
2417                     }
2418                     datetimepicker.data('changed', true);
2419                     datetimepicker.trigger('xchange.xdsoft');
2420                     datetimepicker.trigger('changedatetime.xdsoft');
2421                     if (options.inline !== true && options.closeOnTimeSelect === true) {
2422                         datetimepicker.trigger('close.xdsoft');
2423                     }
2424                 });
2425 
2426             datepicker
2427                 .on('mousewheel.xdsoft', function (event) {
2428                     if (!options.scrollMonth) {
2429                         return true;
2430                     }
2431                     if (event.deltaY < 0) {
2432                         _xdsoft_datetime.nextMonth();
2433                     } else {
2434                         _xdsoft_datetime.prevMonth();
2435                     }
2436                     return false;
2437                 });
2438 
2439             input
2440                 .on('mousewheel.xdsoft', function (event) {
2441                     if (!options.scrollInput) {
2442                         return true;
2443                     }
2444                     if (!options.datepicker && options.timepicker) {
2445                         current_time_index = timebox.find('.xdsoft_current').length ? timebox.find('.xdsoft_current').eq(0).index() : 0;
2446                         if (current_time_index + event.deltaY >= 0 && current_time_index + event.deltaY < timebox.children().length) {
2447                             current_time_index += event.deltaY;
2448                         }
2449                         if (timebox.children().eq(current_time_index).length) {
2450                             timebox.children().eq(current_time_index).trigger('mousedown');
2451                         }
2452                         return false;
2453                     }
2454                     if (options.datepicker && !options.timepicker) {
2455                         datepicker.trigger(event, [event.deltaY, event.deltaX, event.deltaY]);
2456                         if (input.val) {
2457                             input.val(_xdsoft_datetime.str());
2458                         }
2459                         datetimepicker.trigger('changedatetime.xdsoft');
2460                         return false;
2461                     }
2462                 });
2463 
2464             datetimepicker
2465                 .on('changedatetime.xdsoft', function (event) {
2466                     if (options.onChangeDateTime && $.isFunction(options.onChangeDateTime)) {
2467                         var $input = datetimepicker.data('input');
2468                         options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input, event);
2469                         delete options.value;
2470                         $input.trigger('change');
2471                     }
2472                 })
2473                 .on('generate.xdsoft', function () {
2474                     if (options.onGenerate && $.isFunction(options.onGenerate)) {
2475                         options.onGenerate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
2476                     }
2477                     if (triggerAfterOpen) {
2478                         datetimepicker.trigger('afterOpen.xdsoft');
2479                         triggerAfterOpen = false;
2480                     }
2481                 })
2482                 .on('click.xdsoft', function (xdevent) {
2483                     xdevent.stopPropagation();
2484                 });
2485 
2486             current_time_index = 0;
2487 
2488             /**
2489              * Runs the callback for each of the specified node's ancestors.
2490              *
2491              * Return FALSE from the callback to stop ascending.
2492              *
2493              * @param {DOMNode} node
2494              * @param {Function} callback
2495              * @returns {undefined}
2496              */
2497             forEachAncestorOf = function (node, callback) {
2498                 do {
2499                     node = node.parentNode;
2500 
2501                     if (callback(node) === false) {
2502                         break;
2503                     }
2504                 } while (node.nodeName !== 'HTML');
2505             };
2506 
2507             /**
2508              * Sets the position of the picker.
2509              *
2510              * @returns {undefined}
2511              */
2512             setPos = function () {
2513                 var dateInputOffset,
2514                     dateInputElem,
2515                     verticalPosition,
2516                     left,
2517                     position,
2518                     datetimepickerElem,
2519                     dateInputHasFixedAncestor,
2520                     $dateInput,
2521                     windowWidth,
2522                     verticalAnchorEdge,
2523                     datetimepickerCss,
2524                     windowHeight,
2525                     windowScrollTop;
2526 
2527                 $dateInput = datetimepicker.data('input');
2528                 dateInputOffset = $dateInput.offset();
2529                 dateInputElem = $dateInput[0];
2530 
2531                 verticalAnchorEdge = 'top';
2532                 verticalPosition = (dateInputOffset.top + dateInputElem.offsetHeight) - 1;
2533                 left = dateInputOffset.left;
2534                 position = "absolute";
2535 
2536                 windowWidth = $(window).width();
2537                 windowHeight = $(window).height();
2538                 windowScrollTop = $(window).scrollTop();
2539 
2540                 if ((document.documentElement.clientWidth - dateInputOffset.left) < datepicker.parent().outerWidth(true)) {
2541                     var diff = datepicker.parent().outerWidth(true) - dateInputElem.offsetWidth;
2542                     left = left - diff;
2543                 }
2544 
2545                 if ($dateInput.parent().css('direction') === 'rtl') {
2546                     left -= (datetimepicker.outerWidth() - $dateInput.outerWidth());
2547                 }
2548 
2549                 if (options.fixed) {
2550                     verticalPosition -= windowScrollTop;
2551                     left -= $(window).scrollLeft();
2552                     position = "fixed";
2553                 } else {
2554                     dateInputHasFixedAncestor = false;
2555 
2556                     forEachAncestorOf(dateInputElem, function (ancestorNode) {
2557                         if (window.getComputedStyle(ancestorNode).getPropertyValue('position') === 'fixed') {
2558                             dateInputHasFixedAncestor = true;
2559                             return false;
2560                         }
2561                     });
2562 
2563                     if (dateInputHasFixedAncestor) {
2564                         position = 'fixed';
2565 
2566                         //If the picker won't fit entirely within the viewport then display it above the date input.
2567                         if (verticalPosition + datetimepicker.outerHeight() > windowHeight + windowScrollTop) {
2568                             verticalAnchorEdge = 'bottom';
2569                             verticalPosition = (windowHeight + windowScrollTop) - dateInputOffset.top;
2570                         } else {
2571                             verticalPosition -= windowScrollTop;
2572                         }
2573                     } else {
2574                         if (verticalPosition + dateInputElem.offsetHeight > windowHeight + windowScrollTop) {
2575                             verticalPosition = dateInputOffset.top - dateInputElem.offsetHeight + 1;
2576                         }
2577                     }
2578 
2579                     if (verticalPosition < 0) {
2580                         verticalPosition = 0;
2581                     }
2582 
2583                     if (left + dateInputElem.offsetWidth > windowWidth) {
2584                         left = windowWidth - dateInputElem.offsetWidth;
2585                     }
2586                 }
2587 
2588                 datetimepickerElem = datetimepicker[0];
2589 
2590                 forEachAncestorOf(datetimepickerElem, function (ancestorNode) {
2591                     var ancestorNodePosition;
2592 
2593                     ancestorNodePosition = window.getComputedStyle(ancestorNode).getPropertyValue('position');
2594 
2595                     if (ancestorNodePosition === 'relative' && windowWidth >= ancestorNode.offsetWidth) {
2596                         left = left - ((windowWidth - ancestorNode.offsetWidth) / 2);
2597                         return false;
2598                     }
2599                 });
2600 
2601                 datetimepickerCss = {
2602                     position: position,
2603                     left: left,
2604                     top: '',  //Initialize to prevent previous values interfering with new ones.
2605                     bottom: ''  //Initialize to prevent previous values interfering with new ones.
2606                 };
2607 
2608                 datetimepickerCss[verticalAnchorEdge] = verticalPosition;
2609 
2610                 datetimepicker.css(datetimepickerCss);
2611             };
2612 
2613             datetimepicker
2614                 .on('open.xdsoft', function (event) {
2615                     var onShow = true;
2616                     if (options.onShow && $.isFunction(options.onShow)) {
2617                         onShow = options.onShow.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
2618                     }
2619                     if (onShow !== false) {
2620                         datetimepicker.show();
2621                         setPos();
2622                         $(window)
2623                             .off('resize.xdsoft', setPos)
2624                             .on('resize.xdsoft', setPos);
2625 
2626                         if (options.closeOnWithoutClick) {
2627                             $([document.body, window]).on('touchstart mousedown.xdsoft', function arguments_callee6() {
2628                                 datetimepicker.trigger('close.xdsoft');
2629                                 $([document.body, window]).off('touchstart mousedown.xdsoft', arguments_callee6);
2630                             });
2631                         }
2632                     }
2633                 })
2634                 .on('close.xdsoft', function (event) {
2635                     var onClose = true;
2636                     mounth_picker
2637                         .find('.xdsoft_month,.xdsoft_year')
2638                             .find('.xdsoft_select')
2639                                 .hide();
2640                     if (options.onClose && $.isFunction(options.onClose)) {
2641                         onClose = options.onClose.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
2642                     }
2643                     if (onClose !== false && !options.opened && !options.inline) {
2644                         datetimepicker.hide();
2645                     }
2646                     event.stopPropagation();
2647                 })
2648                 .on('toggle.xdsoft', function () {
2649                     if (datetimepicker.is(':visible')) {
2650                         datetimepicker.trigger('close.xdsoft');
2651                     } else {
2652                         datetimepicker.trigger('open.xdsoft');
2653                     }
2654                 })
2655                 .data('input', input);
2656 
2657             timer = 0;
2658 
2659             datetimepicker.data('xdsoft_datetime', _xdsoft_datetime);
2660             datetimepicker.setOptions(options);
2661 
2662             function getCurrentValue() {
2663                 var ct = false, time;
2664 
2665                 if (options.startDate) {
2666                     ct = _xdsoft_datetime.strToDate(options.startDate);
2667                 } else {
2668                     ct = options.value || ((input && input.val && input.val()) ? input.val() : '');
2669                     if (ct) {
2670                         ct = _xdsoft_datetime.strToDateTime(ct);
2671                     } else if (options.defaultDate) {
2672                         ct = _xdsoft_datetime.strToDateTime(options.defaultDate);
2673                         if (options.defaultTime) {
2674                             time = _xdsoft_datetime.strtotime(options.defaultTime);
2675                             ct.setHours(time.getHours());
2676                             ct.setMinutes(time.getMinutes());
2677                         }
2678                     }
2679                 }
2680 
2681                 if (ct && _xdsoft_datetime.isValidDate(ct)) {
2682                     datetimepicker.data('changed', true);
2683                 } else {
2684                     ct = '';
2685                 }
2686 
2687                 return ct || 0;
2688             }
2689 
2690             function setMask(options) {
2691 
2692                 var isValidValue = function (mask, value) {
2693                     var reg = mask
2694                         .replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
2695                         .replace(/_/g, '{digit+}')
2696                         .replace(/([0-9]{1})/g, '{digit$1}')
2697                         .replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
2698                         .replace(/\{digit[\+]\}/g, '[0-9_]{1}');
2699                     return (new RegExp(reg)).test(value);
2700                 },
2701                 getCaretPos = function (input) {
2702                     try {
2703                         if (document.selection && document.selection.createRange) {
2704                             var range = document.selection.createRange();
2705                             return range.getBookmark().charCodeAt(2) - 2;
2706                         }
2707                         if (input.setSelectionRange) {
2708                             return input.selectionStart;
2709                         }
2710                     } catch (e) {
2711                         return 0;
2712                     }
2713                 },
2714                 setCaretPos = function (node, pos) {
2715                     node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
2716                     if (!node) {
2717                         return false;
2718                     }
2719                     if (node.createTextRange) {
2720                         var textRange = node.createTextRange();
2721                         textRange.collapse(true);
2722                         textRange.moveEnd('character', pos);
2723                         textRange.moveStart('character', pos);
2724                         textRange.select();
2725                         return true;
2726                     }
2727                     if (node.setSelectionRange) {
2728                         node.setSelectionRange(pos, pos);
2729                         return true;
2730                     }
2731                     return false;
2732                 };
2733                 if(options.mask) {
2734                     input.off('keydown.xdsoft');
2735                 }
2736                 if (options.mask === true) {
2737                                                         if (typeof moment != 'undefined') {
2738                                                                     options.mask = options.format
2739                                                                             .replace(/Y{4}/g, '9999')
2740                                                                             .replace(/Y{2}/g, '99')
2741                                                                             .replace(/M{2}/g, '19')
2742                                                                             .replace(/D{2}/g, '39')
2743                                                                             .replace(/H{2}/g, '29')
2744                                                                             .replace(/m{2}/g, '59')
2745                                                                             .replace(/s{2}/g, '59');
2746                                                         } else {
2747                                                                     options.mask = options.format
2748                                                                             .replace(/Y/g, '9999')
2749                                                                             .replace(/F/g, '9999')
2750                                                                             .replace(/m/g, '19')
2751                                                                             .replace(/d/g, '39')
2752                                                                             .replace(/H/g, '29')
2753                                                                             .replace(/i/g, '59')
2754                                                                             .replace(/s/g, '59');
2755                                                         }
2756                 }
2757 
2758                 if ($.type(options.mask) === 'string') {
2759                     if (!isValidValue(options.mask, input.val())) {
2760                         input.val(options.mask.replace(/[0-9]/g, '_'));
2761                         setCaretPos(input[0], 0);
2762                     }
2763 
2764                     input.on('keydown.xdsoft', function (event) {
2765                         var val = this.value,
2766                             key = event.which,
2767                             pos,
2768                             digit;
2769 
2770                         if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
2771                             pos = getCaretPos(this);
2772                             digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
2773 
2774                             if ((key === BACKSPACE || key === DEL) && pos) {
2775                                 pos -= 1;
2776                                 digit = '_';
2777                             }
2778 
2779                             while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
2780                                 pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
2781                             }
2782 
2783                             val = val.substr(0, pos) + digit + val.substr(pos + 1);
2784                             if ($.trim(val) === '') {
2785                                 val = options.mask.replace(/[0-9]/g, '_');
2786                             } else {
2787                                 if (pos === options.mask.length) {
2788                                     event.preventDefault();
2789                                     return false;
2790                                 }
2791                             }
2792 
2793                             pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
2794                             while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
2795                                 pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
2796                             }
2797 
2798                             if (isValidValue(options.mask, val)) {
2799                                 this.value = val;
2800                                 setCaretPos(this, pos);
2801                             } else if ($.trim(val) === '') {
2802                                 this.value = options.mask.replace(/[0-9]/g, '_');
2803                             } else {
2804                                 input.trigger('error_input.xdsoft');
2805                             }
2806                         } else {
2807                             if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
2808                                 return true;
2809                             }
2810                         }
2811 
2812                         event.preventDefault();
2813                         return false;
2814                     });
2815                 }
2816             }
2817 
2818             _xdsoft_datetime.setCurrentTime(getCurrentValue());
2819 
2820             input
2821                 .data('xdsoft_datetimepicker', datetimepicker)
2822                 .on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function () {
2823                     if (input.is(':disabled') || (input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick)) {
2824                         return;
2825                     }
2826                     clearTimeout(timer);
2827                     timer = setTimeout(function () {
2828                         if (input.is(':disabled')) {
2829                             return;
2830                         }
2831 
2832                         triggerAfterOpen = true;
2833                         _xdsoft_datetime.setCurrentTime(getCurrentValue());
2834                         if(options.mask) {
2835                             setMask(options);
2836                         }
2837                         datetimepicker.trigger('open.xdsoft');
2838                     }, 100);
2839                 })
2840                 .on('keydown.xdsoft', function (event) {
2841                     var elementSelector,
2842                         key = event.which;
2843                     if ([ENTER].indexOf(key) !== -1 && options.enterLikeTab) {
2844                         elementSelector = $("input:visible,textarea:visible,button:visible,a:visible");
2845                         datetimepicker.trigger('close.xdsoft');
2846                         elementSelector.eq(elementSelector.index(this) + 1).focus();
2847                         return false;
2848                     }
2849                     if ([TAB].indexOf(key) !== -1) {
2850                         datetimepicker.trigger('close.xdsoft');
2851                         return true;
2852                     }
2853                 })
2854                 .on('blur.xdsoft', function () {
2855                     datetimepicker.trigger('close.xdsoft');
2856                 });
2857         };
2858         destroyDateTimePicker = function (input) {
2859             var datetimepicker = input.data('xdsoft_datetimepicker');
2860             if (datetimepicker) {
2861                 datetimepicker.data('xdsoft_datetime', null);
2862                 datetimepicker.remove();
2863                 input
2864                     .data('xdsoft_datetimepicker', null)
2865                     .off('.xdsoft');
2866                 $(window).off('resize.xdsoft');
2867                 $([window, document.body]).off('mousedown.xdsoft touchstart');
2868                 if (input.unmousewheel) {
2869                     input.unmousewheel();
2870                 }
2871             }
2872         };
2873         $(document)
2874             .off('keydown.xdsoftctrl keyup.xdsoftctrl')
2875             .on('keydown.xdsoftctrl', function (e) {
2876                 if (e.keyCode === CTRLKEY) {
2877                     ctrlDown = true;
2878                 }
2879             })
2880             .on('keyup.xdsoftctrl', function (e) {
2881                 if (e.keyCode === CTRLKEY) {
2882                     ctrlDown = false;
2883                 }
2884             });
2885 
2886         this.each(function () {
2887             var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
2888             if (datetimepicker) {
2889                 if ($.type(opt) === 'string') {
2890                     switch (opt) {
2891                     case 'show':
2892                         $(this).select().focus();
2893                         datetimepicker.trigger('open.xdsoft');
2894                         break;
2895                     case 'hide':
2896                         datetimepicker.trigger('close.xdsoft');
2897                         break;
2898                     case 'toggle':
2899                         datetimepicker.trigger('toggle.xdsoft');
2900                         break;
2901                     case 'destroy':
2902                         destroyDateTimePicker($(this));
2903                         break;
2904                     case 'reset':
2905                         this.value = this.defaultValue;
2906                         if (!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(dateHelper.parseDate(this.value, options.format))) {
2907                             datetimepicker.data('changed', false);
2908                         }
2909                         datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value);
2910                         break;
2911                     case 'validate':
2912                         $input = datetimepicker.data('input');
2913                         $input.trigger('blur.xdsoft');
2914                         break;
2915                     default:
2916                         if (datetimepicker[opt] && $.isFunction(datetimepicker[opt])) {
2917                             result = datetimepicker[opt](opt2);
2918                         }
2919                     }
2920                 } else {
2921                     datetimepicker
2922                         .setOptions(opt);
2923                 }
2924                 return 0;
2925             }
2926             if ($.type(opt) !== 'string') {
2927                 if (!options.lazyInit || options.open || options.inline) {
2928                     createDateTimePicker($(this));
2929                 } else {
2930                     lazyInit($(this));
2931                 }
2932             }
2933         });
2934 
2935         return result;
2936     };
2937 
2938     $.fn.datetimepicker.defaults = default_options;
2939 
2940     function HighlightedDate(date, desc, style) {
2941         "use strict";
2942         this.date = date;
2943         this.desc = desc;
2944         this.style = style;
2945     }
2946 }));
2947 /*!
2948  * jQuery Mousewheel 3.1.13
2949  *
2950  * Copyright jQuery Foundation and other contributors
2951  * Released under the MIT license
2952  * http://jquery.org/license
2953  */
2954 
2955 (function (factory) {
2956     if ( typeof define === 'function' && define.amd ) {
2957         // AMD. Register as an anonymous module.
2958         define(['jquery'], factory);
2959     } else if (typeof exports === 'object') {
2960         // Node/CommonJS style for Browserify
2961         module.exports = factory;
2962     } else {
2963         // Browser globals
2964         factory(jQuery);
2965     }
2966 }(function ($) {
2967 
2968     var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
2969         toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
2970                     ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
2971         slice  = Array.prototype.slice,
2972         nullLowestDeltaTimeout, lowestDelta;
2973 
2974     if ( $.event.fixHooks ) {
2975         for ( var i = toFix.length; i; ) {
2976             $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
2977         }
2978     }
2979 
2980     var special = $.event.special.mousewheel = {
2981         version: '3.1.12',
2982 
2983         setup: function() {
2984             if ( this.addEventListener ) {
2985                 for ( var i = toBind.length; i; ) {
2986                     this.addEventListener( toBind[--i], handler, false );
2987                 }
2988             } else {
2989                 this.onmousewheel = handler;
2990             }
2991             // Store the line height and page height for this particular element
2992             $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
2993             $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
2994         },
2995 
2996         teardown: function() {
2997             if ( this.removeEventListener ) {
2998                 for ( var i = toBind.length; i; ) {
2999                     this.removeEventListener( toBind[--i], handler, false );
3000                 }
3001             } else {
3002                 this.onmousewheel = null;
3003             }
3004             // Clean up the data we added to the element
3005             $.removeData(this, 'mousewheel-line-height');
3006             $.removeData(this, 'mousewheel-page-height');
3007         },
3008 
3009         getLineHeight: function(elem) {
3010             var $elem = $(elem),
3011                 $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
3012             if (!$parent.length) {
3013                 $parent = $('body');
3014             }
3015             return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
3016         },
3017 
3018         getPageHeight: function(elem) {
3019             return $(elem).height();
3020         },
3021 
3022         settings: {
3023             adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
3024             normalizeOffset: true  // calls getBoundingClientRect for each event
3025         }
3026     };
3027 
3028     $.fn.extend({
3029         mousewheel: function(fn) {
3030             return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
3031         },
3032 
3033         unmousewheel: function(fn) {
3034             return this.unbind('mousewheel', fn);
3035         }
3036     });
3037 
3038 
3039     function handler(event) {
3040         var orgEvent   = event || window.event,
3041             args       = slice.call(arguments, 1),
3042             delta      = 0,
3043             deltaX     = 0,
3044             deltaY     = 0,
3045             absDelta   = 0,
3046             offsetX    = 0,
3047             offsetY    = 0;
3048         event = $.event.fix(orgEvent);
3049         event.type = 'mousewheel';
3050 
3051         // Old school scrollwheel delta
3052         if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
3053         if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
3054         if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
3055         if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
3056 
3057         // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
3058         if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
3059             deltaX = deltaY * -1;
3060             deltaY = 0;
3061         }
3062 
3063         // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
3064         delta = deltaY === 0 ? deltaX : deltaY;
3065 
3066         // New school wheel delta (wheel event)
3067         if ( 'deltaY' in orgEvent ) {
3068             deltaY = orgEvent.deltaY * -1;
3069             delta  = deltaY;
3070         }
3071         if ( 'deltaX' in orgEvent ) {
3072             deltaX = orgEvent.deltaX;
3073             if ( deltaY === 0 ) { delta  = deltaX * -1; }
3074         }
3075 
3076         // No change actually happened, no reason to go any further
3077         if ( deltaY === 0 && deltaX === 0 ) { return; }
3078 
3079         // Need to convert lines and pages to pixels if we aren't already in pixels
3080         // There are three delta modes:
3081         //   * deltaMode 0 is by pixels, nothing to do
3082         //   * deltaMode 1 is by lines
3083         //   * deltaMode 2 is by pages
3084         if ( orgEvent.deltaMode === 1 ) {
3085             var lineHeight = $.data(this, 'mousewheel-line-height');
3086             delta  *= lineHeight;
3087             deltaY *= lineHeight;
3088             deltaX *= lineHeight;
3089         } else if ( orgEvent.deltaMode === 2 ) {
3090             var pageHeight = $.data(this, 'mousewheel-page-height');
3091             delta  *= pageHeight;
3092             deltaY *= pageHeight;
3093             deltaX *= pageHeight;
3094         }
3095 
3096         // Store lowest absolute delta to normalize the delta values
3097         absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
3098 
3099         if ( !lowestDelta || absDelta < lowestDelta ) {
3100             lowestDelta = absDelta;
3101 
3102             // Adjust older deltas if necessary
3103             if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
3104                 lowestDelta /= 40;
3105             }
3106         }
3107 
3108         // Adjust older deltas if necessary
3109         if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
3110             // Divide all the things by 40!
3111             delta  /= 40;
3112             deltaX /= 40;
3113             deltaY /= 40;
3114         }
3115 
3116         // Get a whole, normalized value for the deltas
3117         delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
3118         deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
3119         deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
3120 
3121         // Normalise offsetX and offsetY properties
3122         if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
3123             var boundingRect = this.getBoundingClientRect();
3124             offsetX = event.clientX - boundingRect.left;
3125             offsetY = event.clientY - boundingRect.top;
3126         }
3127 
3128         // Add information to the event object
3129         event.deltaX = deltaX;
3130         event.deltaY = deltaY;
3131         event.deltaFactor = lowestDelta;
3132         event.offsetX = offsetX;
3133         event.offsetY = offsetY;
3134         // Go ahead and set deltaMode to 0 since we converted to pixels
3135         // Although this is a little odd since we overwrite the deltaX/Y
3136         // properties with normalized deltas.
3137         event.deltaMode = 0;
3138 
3139         // Add event and delta to the front of the arguments
3140         args.unshift(event, delta, deltaX, deltaY);
3141 
3142         // Clearout lowestDelta after sometime to better
3143         // handle multiple device types that give different
3144         // a different lowestDelta
3145         // Ex: trackpad = 3 and mouse wheel = 120
3146         if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
3147         nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
3148 
3149         return ($.event.dispatch || $.event.handle).apply(this, args);
3150     }
3151 
3152     function nullLowestDelta() {
3153         lowestDelta = null;
3154     }
3155 
3156     function shouldAdjustOldDeltas(orgEvent, absDelta) {
3157         // If this is an older event and the delta is divisable by 120,
3158         // then we are assuming that the browser is treating this as an
3159         // older mouse wheel event and that we should divide the deltas
3160         // by 40 to try and get a more usable deltaFactor.
3161         // Side note, this actually impacts the reported scroll distance
3162         // in older browsers and can cause scrolling to be slower than native.
3163         // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
3164         return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
3165     }
3166 
3167 }));
jquery.datetimepicker.full.js
   1 /**
   2  * @preserve jQuery DateTimePicker plugin v2.5.3
   3  * @homepage http://xdsoft.net/jqplugins/datetimepicker/
   4  * @author Chupurnov Valeriy (<chupurnov@gmail.com>)
   5  */
   6 /*global DateFormatter, document,window,jQuery,setTimeout,clearTimeout,HighlightedDate,getCurrentValue*/
   7 ;(function (factory) {
   8     if ( typeof define === 'function' && define.amd ) {
   9         // AMD. Register as an anonymous module.
  10         define(['jquery', 'jquery-mousewheel'], factory);
  11     } else if (typeof exports === 'object') {
  12         // Node/CommonJS style for Browserify
  13         module.exports = factory;
  14     } else {
  15         // Browser globals
  16         factory(jQuery);
  17     }
  18 }(function ($) {
  19     'use strict';
  20     var default_options  = {
  21         i18n: {
  22             ar: { // Arabic
  23                 months: [
  24                     "كانون الثاني", "شباط", "آذار", "نيسان", "مايو", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"
  25                 ],
  26                 dayOfWeekShort: [
  27                     "ن", "ث", "ع", "خ", "ج", "س", "ح"
  28                 ],
  29                 dayOfWeek: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"]
  30             },
  31             ro: { // Romanian
  32                 months: [
  33                     "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"
  34                 ],
  35                 dayOfWeekShort: [
  36                     "Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ"
  37                 ],
  38                 dayOfWeek: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă"]
  39             },
  40             id: { // Indonesian
  41                 months: [
  42                     "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"
  43                 ],
  44                 dayOfWeekShort: [
  45                     "Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"
  46                 ],
  47                 dayOfWeek: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"]
  48             },
  49             is: { // Icelandic
  50                 months: [
  51                     "Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"
  52                 ],
  53                 dayOfWeekShort: [
  54                     "Sun", "Mán", "Þrið", "Mið", "Fim", "Fös", "Lau"
  55                 ],
  56                 dayOfWeek: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur"]
  57             },
  58             bg: { // Bulgarian
  59                 months: [
  60                     "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"
  61                 ],
  62                 dayOfWeekShort: [
  63                     "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
  64                 ],
  65                 dayOfWeek: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота"]
  66             },
  67             fa: { // Persian/Farsi
  68                 months: [
  69                     'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'
  70                 ],
  71                 dayOfWeekShort: [
  72                     'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'
  73                 ],
  74                 dayOfWeek: ["یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یک‌شنبه"]
  75             },
  76             ru: { // Russian
  77                 months: [
  78                     'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
  79                 ],
  80                 dayOfWeekShort: [
  81                     "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
  82                 ],
  83                 dayOfWeek: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"]
  84             },
  85             uk: { // Ukrainian
  86                 months: [
  87                     'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'
  88                 ],
  89                 dayOfWeekShort: [
  90                     "Ндл", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Сбт"
  91                 ],
  92                 dayOfWeek: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"]
  93             },
  94             en: { // English
  95                 months: [
  96                     "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
  97                 ],
  98                 dayOfWeekShort: [
  99                     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 100                 ],
 101                 dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
 102             },
 103             el: { // Ελληνικά
 104                 months: [
 105                     "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"
 106                 ],
 107                 dayOfWeekShort: [
 108                     "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"
 109                 ],
 110                 dayOfWeek: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"]
 111             },
 112             de: { // German
 113                 months: [
 114                     'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
 115                 ],
 116                 dayOfWeekShort: [
 117                     "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"
 118                 ],
 119                 dayOfWeek: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]
 120             },
 121             nl: { // Dutch
 122                 months: [
 123                     "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"
 124                 ],
 125                 dayOfWeekShort: [
 126                     "zo", "ma", "di", "wo", "do", "vr", "za"
 127                 ],
 128                 dayOfWeek: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"]
 129             },
 130             tr: { // Turkish
 131                 months: [
 132                     "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
 133                 ],
 134                 dayOfWeekShort: [
 135                     "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts"
 136                 ],
 137                 dayOfWeek: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"]
 138             },
 139             fr: { //French
 140                 months: [
 141                     "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
 142                 ],
 143                 dayOfWeekShort: [
 144                     "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"
 145                 ],
 146                 dayOfWeek: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
 147             },
 148             es: { // Spanish
 149                 months: [
 150                     "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
 151                 ],
 152                 dayOfWeekShort: [
 153                     "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"
 154                 ],
 155                 dayOfWeek: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]
 156             },
 157             th: { // Thai
 158                 months: [
 159                     'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
 160                 ],
 161                 dayOfWeekShort: [
 162                     'อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'
 163                 ],
 164                 dayOfWeek: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"]
 165             },
 166             pl: { // Polish
 167                 months: [
 168                     "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"
 169                 ],
 170                 dayOfWeekShort: [
 171                     "nd", "pn", "wt", "śr", "cz", "pt", "sb"
 172                 ],
 173                 dayOfWeek: ["niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota"]
 174             },
 175             pt: { // Portuguese
 176                 months: [
 177                     "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
 178                 ],
 179                 dayOfWeekShort: [
 180                     "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"
 181                 ],
 182                 dayOfWeek: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
 183             },
 184             ch: { // Simplified Chinese
 185                 months: [
 186                     "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
 187                 ],
 188                 dayOfWeekShort: [
 189                     "日", "一", "二", "三", "四", "五", "六"
 190                 ]
 191             },
 192             se: { // Swedish
 193                 months: [
 194                     "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September",  "Oktober", "November", "December"
 195                 ],
 196                 dayOfWeekShort: [
 197                     "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
 198                 ]
 199             },
 200             kr: { // Korean
 201                 months: [
 202                     "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
 203                 ],
 204                 dayOfWeekShort: [
 205                     "일", "월", "화", "수", "목", "금", "토"
 206                 ],
 207                 dayOfWeek: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
 208             },
 209             it: { // Italian
 210                 months: [
 211                     "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"
 212                 ],
 213                 dayOfWeekShort: [
 214                     "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"
 215                 ],
 216                 dayOfWeek: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"]
 217             },
 218             da: { // Dansk
 219                 months: [
 220                     "January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December"
 221                 ],
 222                 dayOfWeekShort: [
 223                     "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
 224                 ],
 225                 dayOfWeek: ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"]
 226             },
 227             no: { // Norwegian
 228                 months: [
 229                     "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"
 230                 ],
 231                 dayOfWeekShort: [
 232                     "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
 233                 ],
 234                 dayOfWeek: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag']
 235             },
 236             ja: { // Japanese
 237                 months: [
 238                     "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"
 239                 ],
 240                 dayOfWeekShort: [
 241                     "日", "月", "火", "水", "木", "金", "土"
 242                 ],
 243                 dayOfWeek: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"]
 244             },
 245             vi: { // Vietnamese
 246                 months: [
 247                     "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"
 248                 ],
 249                 dayOfWeekShort: [
 250                     "CN", "T2", "T3", "T4", "T5", "T6", "T7"
 251                 ],
 252                 dayOfWeek: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"]
 253             },
 254             sl: { // Slovenščina
 255                 months: [
 256                     "Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"
 257                 ],
 258                 dayOfWeekShort: [
 259                     "Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"
 260                 ],
 261                 dayOfWeek: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota"]
 262             },
 263             cs: { // Čeština
 264                 months: [
 265                     "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"
 266                 ],
 267                 dayOfWeekShort: [
 268                     "Ne", "Po", "Út", "St", "Čt", "Pá", "So"
 269                 ]
 270             },
 271             hu: { // Hungarian
 272                 months: [
 273                     "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"
 274                 ],
 275                 dayOfWeekShort: [
 276                     "Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo"
 277                 ],
 278                 dayOfWeek: ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"]
 279             },
 280             az: { //Azerbaijanian (Azeri)
 281                 months: [
 282                     "Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"
 283                 ],
 284                 dayOfWeekShort: [
 285                     "B", "Be", "Ça", "Ç", "Ca", "C", "Ş"
 286                 ],
 287                 dayOfWeek: ["Bazar", "Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə"]
 288             },
 289             bs: { //Bosanski
 290                 months: [
 291                     "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
 292                 ],
 293                 dayOfWeekShort: [
 294                     "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
 295                 ],
 296                 dayOfWeek: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"]
 297             },
 298             ca: { //Català
 299                 months: [
 300                     "Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"
 301                 ],
 302                 dayOfWeekShort: [
 303                     "Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds"
 304                 ],
 305                 dayOfWeek: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"]
 306             },
 307             'en-GB': { //English (British)
 308                 months: [
 309                     "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
 310                 ],
 311                 dayOfWeekShort: [
 312                     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 313                 ],
 314                 dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
 315             },
 316             et: { //"Eesti"
 317                 months: [
 318                     "Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"
 319                 ],
 320                 dayOfWeekShort: [
 321                     "P", "E", "T", "K", "N", "R", "L"
 322                 ],
 323                 dayOfWeek: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev"]
 324             },
 325             eu: { //Euskara
 326                 months: [
 327                     "Urtarrila", "Otsaila", "Martxoa", "Apirila", "Maiatza", "Ekaina", "Uztaila", "Abuztua", "Iraila", "Urria", "Azaroa", "Abendua"
 328                 ],
 329                 dayOfWeekShort: [
 330                     "Ig.", "Al.", "Ar.", "Az.", "Og.", "Or.", "La."
 331                 ],
 332                 dayOfWeek: ['Igandea', 'Astelehena', 'Asteartea', 'Asteazkena', 'Osteguna', 'Ostirala', 'Larunbata']
 333             },
 334             fi: { //Finnish (Suomi)
 335                 months: [
 336                     "Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"
 337                 ],
 338                 dayOfWeekShort: [
 339                     "Su", "Ma", "Ti", "Ke", "To", "Pe", "La"
 340                 ],
 341                 dayOfWeek: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"]
 342             },
 343             gl: { //Galego
 344                 months: [
 345                     "Xan", "Feb", "Maz", "Abr", "Mai", "Xun", "Xul", "Ago", "Set", "Out", "Nov", "Dec"
 346                 ],
 347                 dayOfWeekShort: [
 348                     "Dom", "Lun", "Mar", "Mer", "Xov", "Ven", "Sab"
 349                 ],
 350                 dayOfWeek: ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado"]
 351             },
 352             hr: { //Hrvatski
 353                 months: [
 354                     "Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"
 355                 ],
 356                 dayOfWeekShort: [
 357                     "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
 358                 ],
 359                 dayOfWeek: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"]
 360             },
 361             ko: { //Korean (한국어)
 362                 months: [
 363                     "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
 364                 ],
 365                 dayOfWeekShort: [
 366                     "일", "월", "화", "수", "목", "금", "토"
 367                 ],
 368                 dayOfWeek: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
 369             },
 370             lt: { //Lithuanian (lietuvių)
 371                 months: [
 372                     "Sausio", "Vasario", "Kovo", "Balandžio", "Gegužės", "Birželio", "Liepos", "Rugpjūčio", "Rugsėjo", "Spalio", "Lapkričio", "Gruodžio"
 373                 ],
 374                 dayOfWeekShort: [
 375                     "Sek", "Pir", "Ant", "Tre", "Ket", "Pen", "Šeš"
 376                 ],
 377                 dayOfWeek: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis"]
 378             },
 379             lv: { //Latvian (Latviešu)
 380                 months: [
 381                     "Janvāris", "Februāris", "Marts", "Aprīlis ", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"
 382                 ],
 383                 dayOfWeekShort: [
 384                     "Sv", "Pr", "Ot", "Tr", "Ct", "Pk", "St"
 385                 ],
 386                 dayOfWeek: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena"]
 387             },
 388             mk: { //Macedonian (Македонски)
 389                 months: [
 390                     "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"
 391                 ],
 392                 dayOfWeekShort: [
 393                     "нед", "пон", "вто", "сре", "чет", "пет", "саб"
 394                 ],
 395                 dayOfWeek: ["Недела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота"]
 396             },
 397             mn: { //Mongolian (Монгол)
 398                 months: [
 399                     "1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар"
 400                 ],
 401                 dayOfWeekShort: [
 402                     "Дав", "Мяг", "Лха", "Пүр", "Бсн", "Бям", "Ням"
 403                 ],
 404                 dayOfWeek: ["Даваа", "Мягмар", "Лхагва", "Пүрэв", "Баасан", "Бямба", "Ням"]
 405             },
 406             'pt-BR': { //Português(Brasil)
 407                 months: [
 408                     "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
 409                 ],
 410                 dayOfWeekShort: [
 411                     "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"
 412                 ],
 413                 dayOfWeek: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
 414             },
 415             sk: { //Slovenčina
 416                 months: [
 417                     "Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"
 418                 ],
 419                 dayOfWeekShort: [
 420                     "Ne", "Po", "Ut", "St", "Št", "Pi", "So"
 421                 ],
 422                 dayOfWeek: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"]
 423             },
 424             sq: { //Albanian (Shqip)
 425                 months: [
 426                     "Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor"
 427                 ],
 428                 dayOfWeekShort: [
 429                     "Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Shtu"
 430                 ],
 431                 dayOfWeek: ["E Diel", "E Hënë", "E Martē", "E Mërkurë", "E Enjte", "E Premte", "E Shtunë"]
 432             },
 433             'sr-YU': { //Serbian (Srpski)
 434                 months: [
 435                     "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
 436                 ],
 437                 dayOfWeekShort: [
 438                     "Ned", "Pon", "Uto", "Sre", "čet", "Pet", "Sub"
 439                 ],
 440                 dayOfWeek: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"]
 441             },
 442             sr: { //Serbian Cyrillic (Српски)
 443                 months: [
 444                     "јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"
 445                 ],
 446                 dayOfWeekShort: [
 447                     "нед", "пон", "уто", "сре", "чет", "пет", "суб"
 448                 ],
 449                 dayOfWeek: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота"]
 450             },
 451             sv: { //Svenska
 452                 months: [
 453                     "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"
 454                 ],
 455                 dayOfWeekShort: [
 456                     "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
 457                 ],
 458                 dayOfWeek: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]
 459             },
 460             'zh-TW': { //Traditional Chinese (繁體中文)
 461                 months: [
 462                     "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
 463                 ],
 464                 dayOfWeekShort: [
 465                     "日", "一", "二", "三", "四", "五", "六"
 466                 ],
 467                 dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
 468             },
 469             zh: { //Simplified Chinese (简体中文)
 470                 months: [
 471                     "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
 472                 ],
 473                 dayOfWeekShort: [
 474                     "日", "一", "二", "三", "四", "五", "六"
 475                 ],
 476                 dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
 477             },
 478             he: { //Hebrew (עברית)
 479                 months: [
 480                     'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'
 481                 ],
 482                 dayOfWeekShort: [
 483                     'א\'', 'ב\'', 'ג\'', 'ד\'', 'ה\'', 'ו\'', 'שבת'
 484                 ],
 485                 dayOfWeek: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
 486             },
 487             hy: { // Armenian
 488                 months: [
 489                     "Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր"
 490                 ],
 491                 dayOfWeekShort: [
 492                     "Կի", "Երկ", "Երք", "Չոր", "Հնգ", "Ուրբ", "Շբթ"
 493                 ],
 494                 dayOfWeek: ["Կիրակի", "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ"]
 495             },
 496             kg: { // Kyrgyz
 497                 months: [
 498                     'Үчтүн айы', 'Бирдин айы', 'Жалган Куран', 'Чын Куран', 'Бугу', 'Кулжа', 'Теке', 'Баш Оона', 'Аяк Оона', 'Тогуздун айы', 'Жетинин айы', 'Бештин айы'
 499                 ],
 500                 dayOfWeekShort: [
 501                     "Жек", "Дүй", "Шей", "Шар", "Бей", "Жум", "Ише"
 502                 ],
 503                 dayOfWeek: [
 504                     "Жекшемб", "Дүйшөмб", "Шейшемб", "Шаршемб", "Бейшемби", "Жума", "Ишенб"
 505                 ]
 506             },
 507             rm: { // Romansh
 508                 months: [
 509                     "Schaner", "Favrer", "Mars", "Avrigl", "Matg", "Zercladur", "Fanadur", "Avust", "Settember", "October", "November", "December"
 510                 ],
 511                 dayOfWeekShort: [
 512                     "Du", "Gli", "Ma", "Me", "Gie", "Ve", "So"
 513                 ],
 514                 dayOfWeek: [
 515                     "Dumengia", "Glindesdi", "Mardi", "Mesemna", "Gievgia", "Venderdi", "Sonda"
 516                 ]
 517             },
 518             ka: { // Georgian
 519                 months: [
 520                     'იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'
 521                 ],
 522                 dayOfWeekShort: [
 523                     "კვ", "ორშ", "სამშ", "ოთხ", "ხუთ", "პარ", "შაბ"
 524                 ],
 525                 dayOfWeek: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"]
 526             },
 527         },
 528         value: '',
 529         rtl: false,
 530 
 531         format:    'Y/m/d H:i',
 532         formatTime:    'H:i',
 533         formatDate:    'Y/m/d',
 534 
 535         startDate:    false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05',
 536         step: 60,
 537         monthChangeSpinner: true,
 538 
 539         closeOnDateSelect: false,
 540         closeOnTimeSelect: true,
 541         closeOnWithoutClick: true,
 542         closeOnInputClick: true,
 543 
 544         timepicker: true,
 545         datepicker: true,
 546         weeks: false,
 547 
 548         defaultTime: false,    // use formatTime format (ex. '10:00' for formatTime:    'H:i')
 549         defaultDate: false,    // use formatDate format (ex new Date() or '1986/12/08' or '-1970/01/05' or '-1970/01/05')
 550 
 551         minDate: false,
 552         maxDate: false,
 553         minTime: false,
 554         maxTime: false,
 555         disabledMinTime: false,
 556         disabledMaxTime: false,
 557 
 558         allowTimes: [],
 559         opened: false,
 560         initTime: true,
 561         inline: false,
 562         theme: '',
 563 
 564         onSelectDate: function () {},
 565         onSelectTime: function () {},
 566         onChangeMonth: function () {},
 567         onGetWeekOfYear: function () {},
 568         onChangeYear: function () {},
 569         onChangeDateTime: function () {},
 570         onShow: function () {},
 571         onClose: function () {},
 572         onGenerate: function () {},
 573 
 574         withoutCopyright: true,
 575         inverseButton: false,
 576         hours12: false,
 577         next: 'xdsoft_next',
 578         prev : 'xdsoft_prev',
 579         dayOfWeekStart: 0,
 580         parentID: 'body',
 581         timeHeightInTimePicker: 25,
 582         timepickerScrollbar: true,
 583         todayButton: true,
 584         prevButton: true,
 585         nextButton: true,
 586         defaultSelect: true,
 587 
 588         scrollMonth: true,
 589         scrollTime: true,
 590         scrollInput: true,
 591 
 592         lazyInit: false,
 593         mask: false,
 594         validateOnBlur: true,
 595         allowBlank: true,
 596         yearStart: 1950,
 597         yearEnd: 2050,
 598         monthStart: 0,
 599         monthEnd: 11,
 600         style: '',
 601         id: '',
 602         fixed: false,
 603         roundTime: 'round', // ceil, floor
 604         className: '',
 605         weekends: [],
 606         highlightedDates: [],
 607         highlightedPeriods: [],
 608         allowDates : [],
 609         allowDateRe : null,
 610         disabledDates : [],
 611         disabledWeekDays: [],
 612         yearOffset: 0,
 613         beforeShowDay: null,
 614 
 615         enterLikeTab: true,
 616         showApplyButton: false
 617     };
 618 
 619     var dateHelper = null,
 620         globalLocaleDefault = 'en',
 621         globalLocale = 'en';
 622 
 623     var dateFormatterOptionsDefault = {
 624         meridiem: ['AM', 'PM']
 625     };
 626 
 627     var initDateFormatter = function(){
 628         var locale = default_options.i18n[globalLocale],
 629             opts = {
 630                 days: locale.dayOfWeek,
 631                 daysShort: locale.dayOfWeekShort,
 632                 months: locale.months,
 633                 monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
 634             };
 635 
 636          dateHelper = new DateFormatter({
 637             dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
 638         });
 639     };
 640 
 641     // for locale settings
 642     $.datetimepicker = {
 643         setLocale: function(locale){
 644             var newLocale = default_options.i18n[locale]?locale:globalLocaleDefault;
 645             if(globalLocale != newLocale){
 646                 globalLocale = newLocale;
 647                 // reinit date formatter
 648                 initDateFormatter();
 649             }
 650         },
 651         setDateFormatter: function(dateFormatter) {
 652             dateHelper = dateFormatter;
 653         },
 654         RFC_2822: 'D, d M Y H:i:s O',
 655         ATOM: 'Y-m-d\TH:i:sP',
 656         ISO_8601: 'Y-m-d\TH:i:sO',
 657         RFC_822: 'D, d M y H:i:s O',
 658         RFC_850: 'l, d-M-y H:i:s T',
 659         RFC_1036: 'D, d M y H:i:s O',
 660         RFC_1123: 'D, d M Y H:i:s O',
 661         RSS: 'D, d M Y H:i:s O',
 662         W3C: 'Y-m-d\TH:i:sP'
 663     };
 664 
 665     // first init date formatter
 666     initDateFormatter();
 667 
 668     // fix for ie8
 669     if (!window.getComputedStyle) {
 670         window.getComputedStyle = function (el, pseudo) {
 671             this.el = el;
 672             this.getPropertyValue = function (prop) {
 673                 var re = /(\-([a-z]){1})/g;
 674                 if (prop === 'float') {
 675                     prop = 'styleFloat';
 676                 }
 677                 if (re.test(prop)) {
 678                     prop = prop.replace(re, function (a, b, c) {
 679                         return c.toUpperCase();
 680                     });
 681                 }
 682                 return el.currentStyle[prop] || null;
 683             };
 684             return this;
 685         };
 686     }
 687     if (!Array.prototype.indexOf) {
 688         Array.prototype.indexOf = function (obj, start) {
 689             var i, j;
 690             for (i = (start || 0), j = this.length; i < j; i += 1) {
 691                 if (this[i] === obj) { return i; }
 692             }
 693             return -1;
 694         };
 695     }
 696     Date.prototype.countDaysInMonth = function () {
 697         return new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate();
 698     };
 699     $.fn.xdsoftScroller = function (percent) {
 700         return this.each(function () {
 701             var timeboxparent = $(this),
 702                 pointerEventToXY = function (e) {
 703                     var out = {x: 0, y: 0},
 704                         touch;
 705                     if (e.type === 'touchstart' || e.type === 'touchmove' || e.type === 'touchend' || e.type === 'touchcancel') {
 706                         touch  = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
 707                         out.x = touch.clientX;
 708                         out.y = touch.clientY;
 709                     } else if (e.type === 'mousedown' || e.type === 'mouseup' || e.type === 'mousemove' || e.type === 'mouseover' || e.type === 'mouseout' || e.type === 'mouseenter' || e.type === 'mouseleave') {
 710                         out.x = e.clientX;
 711                         out.y = e.clientY;
 712                     }
 713                     return out;
 714                 },
 715                 timebox,
 716                 parentHeight,
 717                 height,
 718                 scrollbar,
 719                 scroller,
 720                 maximumOffset = 100,
 721                 start = false,
 722                 startY = 0,
 723                 startTop = 0,
 724                 h1 = 0,
 725                 touchStart = false,
 726                 startTopScroll = 0,
 727                 calcOffset = function () {};
 728             if (percent === 'hide') {
 729                 timeboxparent.find('.xdsoft_scrollbar').hide();
 730                 return;
 731             }
 732             if (!$(this).hasClass('xdsoft_scroller_box')) {
 733                 timebox = timeboxparent.children().eq(0);
 734                 parentHeight = timeboxparent[0].clientHeight;
 735                 height = timebox[0].offsetHeight;
 736                 scrollbar = $('<div class="xdsoft_scrollbar"></div>');
 737                 scroller = $('<div class="xdsoft_scroller"></div>');
 738                 scrollbar.append(scroller);
 739 
 740                 timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar);
 741                 calcOffset = function calcOffset(event) {
 742                     var offset = pointerEventToXY(event).y - startY + startTopScroll;
 743                     if (offset < 0) {
 744                         offset = 0;
 745                     }
 746                     if (offset + scroller[0].offsetHeight > h1) {
 747                         offset = h1 - scroller[0].offsetHeight;
 748                     }
 749                     timeboxparent.trigger('scroll_element.xdsoft_scroller', [maximumOffset ? offset / maximumOffset : 0]);
 750                 };
 751 
 752                 scroller
 753                     .on('touchstart.xdsoft_scroller mousedown.xdsoft_scroller', function (event) {
 754                         if (!parentHeight) {
 755                             timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
 756                         }
 757 
 758                         startY = pointerEventToXY(event).y;
 759                         startTopScroll = parseInt(scroller.css('margin-top'), 10);
 760                         h1 = scrollbar[0].offsetHeight;
 761 
 762                         if (event.type === 'mousedown' || event.type === 'touchstart') {
 763                             if (document) {
 764                                 $(document.body).addClass('xdsoft_noselect');
 765                             }
 766                             $([document.body, window]).on('touchend mouseup.xdsoft_scroller', function arguments_callee() {
 767                                 $([document.body, window]).off('touchend mouseup.xdsoft_scroller', arguments_callee)
 768                                     .off('mousemove.xdsoft_scroller', calcOffset)
 769                                     .removeClass('xdsoft_noselect');
 770                             });
 771                             $(document.body).on('mousemove.xdsoft_scroller', calcOffset);
 772                         } else {
 773                             touchStart = true;
 774                             event.stopPropagation();
 775                             event.preventDefault();
 776                         }
 777                     })
 778                     .on('touchmove', function (event) {
 779                         if (touchStart) {
 780                             event.preventDefault();
 781                             calcOffset(event);
 782                         }
 783                     })
 784                     .on('touchend touchcancel', function () {
 785                         touchStart =  false;
 786                         startTopScroll = 0;
 787                     });
 788 
 789                 timeboxparent
 790                     .on('scroll_element.xdsoft_scroller', function (event, percentage) {
 791                         if (!parentHeight) {
 792                             timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percentage, true]);
 793                         }
 794                         percentage = percentage > 1 ? 1 : (percentage < 0 || isNaN(percentage)) ? 0 : percentage;
 795 
 796                         scroller.css('margin-top', maximumOffset * percentage);
 797 
 798                         setTimeout(function () {
 799                             timebox.css('marginTop', -parseInt((timebox[0].offsetHeight - parentHeight) * percentage, 10));
 800                         }, 10);
 801                     })
 802                     .on('resize_scroll.xdsoft_scroller', function (event, percentage, noTriggerScroll) {
 803                         var percent, sh;
 804                         parentHeight = timeboxparent[0].clientHeight;
 805                         height = timebox[0].offsetHeight;
 806                         percent = parentHeight / height;
 807                         sh = percent * scrollbar[0].offsetHeight;
 808                         if (percent > 1) {
 809                             scroller.hide();
 810                         } else {
 811                             scroller.show();
 812                             scroller.css('height', parseInt(sh > 10 ? sh : 10, 10));
 813                             maximumOffset = scrollbar[0].offsetHeight - scroller[0].offsetHeight;
 814                             if (noTriggerScroll !== true) {
 815                                 timeboxparent.trigger('scroll_element.xdsoft_scroller', [percentage || Math.abs(parseInt(timebox.css('marginTop'), 10)) / (height - parentHeight)]);
 816                             }
 817                         }
 818                     });
 819 
 820                 timeboxparent.on('mousewheel', function (event) {
 821                     var top = Math.abs(parseInt(timebox.css('marginTop'), 10));
 822 
 823                     top = top - (event.deltaY * 20);
 824                     if (top < 0) {
 825                         top = 0;
 826                     }
 827 
 828                     timeboxparent.trigger('scroll_element.xdsoft_scroller', [top / (height - parentHeight)]);
 829                     event.stopPropagation();
 830                     return false;
 831                 });
 832 
 833                 timeboxparent.on('touchstart', function (event) {
 834                     start = pointerEventToXY(event);
 835                     startTop = Math.abs(parseInt(timebox.css('marginTop'), 10));
 836                 });
 837 
 838                 timeboxparent.on('touchmove', function (event) {
 839                     if (start) {
 840                         event.preventDefault();
 841                         var coord = pointerEventToXY(event);
 842                         timeboxparent.trigger('scroll_element.xdsoft_scroller', [(startTop - (coord.y - start.y)) / (height - parentHeight)]);
 843                     }
 844                 });
 845 
 846                 timeboxparent.on('touchend touchcancel', function () {
 847                     start = false;
 848                     startTop = 0;
 849                 });
 850             }
 851             timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
 852         });
 853     };
 854 
 855     $.fn.datetimepicker = function (opt, opt2) {
 856         var result = this,
 857             KEY0 = 48,
 858             KEY9 = 57,
 859             _KEY0 = 96,
 860             _KEY9 = 105,
 861             CTRLKEY = 17,
 862             DEL = 46,
 863             ENTER = 13,
 864             ESC = 27,
 865             BACKSPACE = 8,
 866             ARROWLEFT = 37,
 867             ARROWUP = 38,
 868             ARROWRIGHT = 39,
 869             ARROWDOWN = 40,
 870             TAB = 9,
 871             F5 = 116,
 872             AKEY = 65,
 873             CKEY = 67,
 874             VKEY = 86,
 875             ZKEY = 90,
 876             YKEY = 89,
 877             ctrlDown    =    false,
 878             options = ($.isPlainObject(opt) || !opt) ? $.extend(true, {}, default_options, opt) : $.extend(true, {}, default_options),
 879 
 880             lazyInitTimer = 0,
 881             createDateTimePicker,
 882             destroyDateTimePicker,
 883 
 884             lazyInit = function (input) {
 885                 input
 886                     .on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function initOnActionCallback() {
 887                         if (input.is(':disabled') || input.data('xdsoft_datetimepicker')) {
 888                             return;
 889                         }
 890                         clearTimeout(lazyInitTimer);
 891                         lazyInitTimer = setTimeout(function () {
 892 
 893                             if (!input.data('xdsoft_datetimepicker')) {
 894                                 createDateTimePicker(input);
 895                             }
 896                             input
 897                                 .off('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', initOnActionCallback)
 898                                 .trigger('open.xdsoft');
 899                         }, 100);
 900                     });
 901             };
 902 
 903         createDateTimePicker = function (input) {
 904             var datetimepicker = $('<div class="xdsoft_datetimepicker xdsoft_noselect"></div>'),
 905                 xdsoft_copyright = $('<div class="xdsoft_copyright"><a target="_blank" href="http://xdsoft.net/jqplugins/datetimepicker/">xdsoft.net</a></div>'),
 906                 datepicker = $('<div class="xdsoft_datepicker active"></div>'),
 907                 mounth_picker = $('<div class="xdsoft_mounthpicker"><button type="button" class="xdsoft_prev"></button><button type="button" class="xdsoft_today_button"></button>' +
 908                     '<div class="xdsoft_label xdsoft_month"><span></span><i></i></div>' +
 909                     '<div class="xdsoft_label xdsoft_year"><span></span><i></i></div>' +
 910                     '<button type="button" class="xdsoft_next"></button></div>'),
 911                 calendar = $('<div class="xdsoft_calendar"></div>'),
 912                 timepicker = $('<div class="xdsoft_timepicker active"><button type="button" class="xdsoft_prev"></button><div class="xdsoft_time_box"></div><button type="button" class="xdsoft_next"></button></div>'),
 913                 timeboxparent = timepicker.find('.xdsoft_time_box').eq(0),
 914                 timebox = $('<div class="xdsoft_time_variant"></div>'),
 915                 applyButton = $('<button type="button" class="xdsoft_save_selected blue-gradient-button">Save Selected</button>'),
 916 
 917                 monthselect = $('<div class="xdsoft_select xdsoft_monthselect"><div></div></div>'),
 918                 yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
 919                 triggerAfterOpen = false,
 920                 XDSoft_datetime,
 921 
 922                 xchangeTimer,
 923                 timerclick,
 924                 current_time_index,
 925                 setPos,
 926                 timer = 0,
 927                 _xdsoft_datetime,
 928                 forEachAncestorOf;
 929 
 930             if (options.id) {
 931                 datetimepicker.attr('id', options.id);
 932             }
 933             if (options.style) {
 934                 datetimepicker.attr('style', options.style);
 935             }
 936             if (options.weeks) {
 937                 datetimepicker.addClass('xdsoft_showweeks');
 938             }
 939             if (options.rtl) {
 940                 datetimepicker.addClass('xdsoft_rtl');
 941             }
 942 
 943             datetimepicker.addClass('xdsoft_' + options.theme);
 944             datetimepicker.addClass(options.className);
 945 
 946             mounth_picker
 947                 .find('.xdsoft_month span')
 948                     .after(monthselect);
 949             mounth_picker
 950                 .find('.xdsoft_year span')
 951                     .after(yearselect);
 952 
 953             mounth_picker
 954                 .find('.xdsoft_month,.xdsoft_year')
 955                     .on('touchstart mousedown.xdsoft', function (event) {
 956                     var select = $(this).find('.xdsoft_select').eq(0),
 957                         val = 0,
 958                         top = 0,
 959                         visible = select.is(':visible'),
 960                         items,
 961                         i;
 962 
 963                     mounth_picker
 964                         .find('.xdsoft_select')
 965                             .hide();
 966                     if (_xdsoft_datetime.currentTime) {
 967                         val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month') ? 'getMonth' : 'getFullYear']();
 968                     }
 969 
 970                     select[visible ? 'hide' : 'show']();
 971                     for (items = select.find('div.xdsoft_option'), i = 0; i < items.length; i += 1) {
 972                         if (items.eq(i).data('value') === val) {
 973                             break;
 974                         } else {
 975                             top += items[0].offsetHeight;
 976                         }
 977                     }
 978 
 979                     select.xdsoftScroller(top / (select.children()[0].offsetHeight - (select[0].clientHeight)));
 980                     event.stopPropagation();
 981                     return false;
 982                 });
 983 
 984             mounth_picker
 985                 .find('.xdsoft_select')
 986                     .xdsoftScroller()
 987                 .on('touchstart mousedown.xdsoft', function (event) {
 988                     event.stopPropagation();
 989                     event.preventDefault();
 990                 })
 991                 .on('touchstart mousedown.xdsoft', '.xdsoft_option', function () {
 992                     if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
 993                         _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
 994                     }
 995 
 996                     var year = _xdsoft_datetime.currentTime.getFullYear();
 997                     if (_xdsoft_datetime && _xdsoft_datetime.currentTime) {
 998                         _xdsoft_datetime.currentTime[$(this).parent().parent().hasClass('xdsoft_monthselect') ? 'setMonth' : 'setFullYear']($(this).data('value'));
 999                     }
1000 
1001                     $(this).parent().parent().hide();
1002 
1003                     datetimepicker.trigger('xchange.xdsoft');
1004                     if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1005                         options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1006                     }
1007 
1008                     if (year !== _xdsoft_datetime.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1009                         options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1010                     }
1011                 });
1012 
1013             datetimepicker.getValue = function () {
1014                 return _xdsoft_datetime.getCurrentTime();
1015             };
1016 
1017             datetimepicker.setOptions = function (_options) {
1018                 var highlightedDates = {};
1019 
1020                 options = $.extend(true, {}, options, _options);
1021 
1022                 if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
1023                     options.allowTimes = $.extend(true, [], _options.allowTimes);
1024                 }
1025 
1026                 if (_options.weekends && $.isArray(_options.weekends) && _options.weekends.length) {
1027                     options.weekends = $.extend(true, [], _options.weekends);
1028                 }
1029 
1030                 if (_options.allowDates && $.isArray(_options.allowDates) && _options.allowDates.length) {
1031                     options.allowDates = $.extend(true, [], _options.allowDates);
1032                 }
1033 
1034                 if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
1035                     options.allowDateRe = new RegExp(_options.allowDateRe);
1036                 }
1037 
1038                 if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
1039                     $.each(_options.highlightedDates, function (index, value) {
1040                         var splitData = $.map(value.split(','), $.trim),
1041                             exDesc,
1042                             hDate = new HighlightedDate(dateHelper.parseDate(splitData[0], options.formatDate), splitData[1], splitData[2]), // date, desc, style
1043                             keyDate = dateHelper.formatDate(hDate.date, options.formatDate);
1044                         if (highlightedDates[keyDate] !== undefined) {
1045                             exDesc = highlightedDates[keyDate].desc;
1046                             if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) {
1047                                 highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc;
1048                             }
1049                         } else {
1050                             highlightedDates[keyDate] = hDate;
1051                         }
1052                     });
1053 
1054                     options.highlightedDates = $.extend(true, [], highlightedDates);
1055                 }
1056 
1057                 if (_options.highlightedPeriods && $.isArray(_options.highlightedPeriods) && _options.highlightedPeriods.length) {
1058                     highlightedDates = $.extend(true, [], options.highlightedDates);
1059                     $.each(_options.highlightedPeriods, function (index, value) {
1060                         var dateTest, // start date
1061                             dateEnd,
1062                             desc,
1063                             hDate,
1064                             keyDate,
1065                             exDesc,
1066                             style;
1067                         if ($.isArray(value)) {
1068                             dateTest = value[0];
1069                             dateEnd = value[1];
1070                             desc = value[2];
1071                             style = value[3];
1072                         }
1073                         else {
1074                             var splitData = $.map(value.split(','), $.trim);
1075                             dateTest = dateHelper.parseDate(splitData[0], options.formatDate);
1076                             dateEnd = dateHelper.parseDate(splitData[1], options.formatDate);
1077                             desc = splitData[2];
1078                             style = splitData[3];
1079                         }
1080 
1081                         while (dateTest <= dateEnd) {
1082                             hDate = new HighlightedDate(dateTest, desc, style);
1083                             keyDate = dateHelper.formatDate(dateTest, options.formatDate);
1084                             dateTest.setDate(dateTest.getDate() + 1);
1085                             if (highlightedDates[keyDate] !== undefined) {
1086                                 exDesc = highlightedDates[keyDate].desc;
1087                                 if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) {
1088                                     highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc;
1089                                 }
1090                             } else {
1091                                 highlightedDates[keyDate] = hDate;
1092                             }
1093                         }
1094                     });
1095 
1096                     options.highlightedDates = $.extend(true, [], highlightedDates);
1097                 }
1098 
1099                 if (_options.disabledDates && $.isArray(_options.disabledDates) && _options.disabledDates.length) {
1100                     options.disabledDates = $.extend(true, [], _options.disabledDates);
1101                 }
1102 
1103                 if (_options.disabledWeekDays && $.isArray(_options.disabledWeekDays) && _options.disabledWeekDays.length) {
1104                     options.disabledWeekDays = $.extend(true, [], _options.disabledWeekDays);
1105                 }
1106 
1107                 if ((options.open || options.opened) && (!options.inline)) {
1108                     input.trigger('open.xdsoft');
1109                 }
1110 
1111                 if (options.inline) {
1112                     triggerAfterOpen = true;
1113                     datetimepicker.addClass('xdsoft_inline');
1114                     input.after(datetimepicker).hide();
1115                 }
1116 
1117                 if (options.inverseButton) {
1118                     options.next = 'xdsoft_prev';
1119                     options.prev = 'xdsoft_next';
1120                 }
1121 
1122                 if (options.datepicker) {
1123                     datepicker.addClass('active');
1124                 } else {
1125                     datepicker.removeClass('active');
1126                 }
1127 
1128                 if (options.timepicker) {
1129                     timepicker.addClass('active');
1130                 } else {
1131                     timepicker.removeClass('active');
1132                 }
1133 
1134                 if (options.value) {
1135                     _xdsoft_datetime.setCurrentTime(options.value);
1136                     if (input && input.val) {
1137                         input.val(_xdsoft_datetime.str);
1138                     }
1139                 }
1140 
1141                 if (isNaN(options.dayOfWeekStart)) {
1142                     options.dayOfWeekStart = 0;
1143                 } else {
1144                     options.dayOfWeekStart = parseInt(options.dayOfWeekStart, 10) % 7;
1145                 }
1146 
1147                 if (!options.timepickerScrollbar) {
1148                     timeboxparent.xdsoftScroller('hide');
1149                 }
1150 
1151                 if (options.minDate && /^[\+\-](.*)$/.test(options.minDate)) {
1152                     options.minDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.minDate), options.formatDate);
1153                 }
1154 
1155                 if (options.maxDate &&  /^[\+\-](.*)$/.test(options.maxDate)) {
1156                     options.maxDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.maxDate), options.formatDate);
1157                 }
1158 
1159                 applyButton.toggle(options.showApplyButton);
1160 
1161                 mounth_picker
1162                     .find('.xdsoft_today_button')
1163                         .css('visibility', !options.todayButton ? 'hidden' : 'visible');
1164 
1165                 mounth_picker
1166                     .find('.' + options.prev)
1167                         .css('visibility', !options.prevButton ? 'hidden' : 'visible');
1168 
1169                 mounth_picker
1170                     .find('.' + options.next)
1171                         .css('visibility', !options.nextButton ? 'hidden' : 'visible');
1172 
1173                 setMask(options);
1174 
1175                 if (options.validateOnBlur) {
1176                     input
1177                         .off('blur.xdsoft')
1178                         .on('blur.xdsoft', function () {
1179                             if (options.allowBlank && (!$.trim($(this).val()).length || (typeof options.mask == "string" && $.trim($(this).val()) === options.mask.replace(/[0-9]/g, '_')))) {
1180                                 $(this).val(null);
1181                                 datetimepicker.data('xdsoft_datetime').empty();
1182                             } else {
1183                                 var d = dateHelper.parseDate($(this).val(), options.format);
1184                                 if (d) { // parseDate() may skip some invalid parts like date or time, so make it clear for user: show parsed date/time
1185                                     $(this).val(dateHelper.formatDate(d, options.format));
1186                                 } else {
1187                                     var splittedHours   = +([$(this).val()[0], $(this).val()[1]].join('')),
1188                                         splittedMinutes = +([$(this).val()[2], $(this).val()[3]].join(''));
1189     
1190                                     // parse the numbers as 0312 => 03:12
1191                                     if (!options.datepicker && options.timepicker && splittedHours >= 0 && splittedHours < 24 && splittedMinutes >= 0 && splittedMinutes < 60) {
1192                                         $(this).val([splittedHours, splittedMinutes].map(function (item) {
1193                                             return item > 9 ? item : '0' + item;
1194                                         }).join(':'));
1195                                     } else {
1196                                         $(this).val(dateHelper.formatDate(_xdsoft_datetime.now(), options.format));
1197                                     }
1198                                 }
1199                                 datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val());
1200                             }
1201 
1202                             datetimepicker.trigger('changedatetime.xdsoft');
1203                             datetimepicker.trigger('close.xdsoft');
1204                         });
1205                 }
1206                 options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
1207 
1208                 datetimepicker
1209                     .trigger('xchange.xdsoft')
1210                     .trigger('afterOpen.xdsoft');
1211             };
1212 
1213             datetimepicker
1214                 .data('options', options)
1215                 .on('touchstart mousedown.xdsoft', function (event) {
1216                     event.stopPropagation();
1217                     event.preventDefault();
1218                     yearselect.hide();
1219                     monthselect.hide();
1220                     return false;
1221                 });
1222 
1223             //scroll_element = timepicker.find('.xdsoft_time_box');
1224             timeboxparent.append(timebox);
1225             timeboxparent.xdsoftScroller();
1226 
1227             datetimepicker.on('afterOpen.xdsoft', function () {
1228                 timeboxparent.xdsoftScroller();
1229             });
1230 
1231             datetimepicker
1232                 .append(datepicker)
1233                 .append(timepicker);
1234 
1235             if (options.withoutCopyright !== true) {
1236                 datetimepicker
1237                     .append(xdsoft_copyright);
1238             }
1239 
1240             datepicker
1241                 .append(mounth_picker)
1242                 .append(calendar)
1243                 .append(applyButton);
1244 
1245             $(options.parentID)
1246                 .append(datetimepicker);
1247 
1248             XDSoft_datetime = function () {
1249                 var _this = this;
1250                 _this.now = function (norecursion) {
1251                     var d = new Date(),
1252                         date,
1253                         time;
1254 
1255                     if (!norecursion && options.defaultDate) {
1256                         date = _this.strToDateTime(options.defaultDate);
1257                         d.setFullYear(date.getFullYear());
1258                         d.setMonth(date.getMonth());
1259                         d.setDate(date.getDate());
1260                     }
1261 
1262                     if (options.yearOffset) {
1263                         d.setFullYear(d.getFullYear() + options.yearOffset);
1264                     }
1265 
1266                     if (!norecursion && options.defaultTime) {
1267                         time = _this.strtotime(options.defaultTime);
1268                         d.setHours(time.getHours());
1269                         d.setMinutes(time.getMinutes());
1270                     }
1271                     return d;
1272                 };
1273 
1274                 _this.isValidDate = function (d) {
1275                     if (Object.prototype.toString.call(d) !== "[object Date]") {
1276                         return false;
1277                     }
1278                     return !isNaN(d.getTime());
1279                 };
1280 
1281                 _this.setCurrentTime = function (dTime) {
1282                     _this.currentTime = (typeof dTime === 'string') ? _this.strToDateTime(dTime) : _this.isValidDate(dTime) ? dTime : _this.now();
1283                     datetimepicker.trigger('xchange.xdsoft');
1284                 };
1285 
1286                 _this.empty = function () {
1287                     _this.currentTime = null;
1288                 };
1289 
1290                 _this.getCurrentTime = function (dTime) {
1291                     return _this.currentTime;
1292                 };
1293 
1294                 _this.nextMonth = function () {
1295 
1296                     if (_this.currentTime === undefined || _this.currentTime === null) {
1297                         _this.currentTime = _this.now();
1298                     }
1299 
1300                     var month = _this.currentTime.getMonth() + 1,
1301                         year;
1302                     if (month === 12) {
1303                         _this.currentTime.setFullYear(_this.currentTime.getFullYear() + 1);
1304                         month = 0;
1305                     }
1306 
1307                     year = _this.currentTime.getFullYear();
1308 
1309                     _this.currentTime.setDate(
1310                         Math.min(
1311                             new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1312                             _this.currentTime.getDate()
1313                         )
1314                     );
1315                     _this.currentTime.setMonth(month);
1316 
1317                     if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1318                         options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1319                     }
1320 
1321                     if (year !== _this.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1322                         options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1323                     }
1324 
1325                     datetimepicker.trigger('xchange.xdsoft');
1326                     return month;
1327                 };
1328 
1329                 _this.prevMonth = function () {
1330 
1331                     if (_this.currentTime === undefined || _this.currentTime === null) {
1332                         _this.currentTime = _this.now();
1333                     }
1334 
1335                     var month = _this.currentTime.getMonth() - 1;
1336                     if (month === -1) {
1337                         _this.currentTime.setFullYear(_this.currentTime.getFullYear() - 1);
1338                         month = 11;
1339                     }
1340                     _this.currentTime.setDate(
1341                         Math.min(
1342                             new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1343                             _this.currentTime.getDate()
1344                         )
1345                     );
1346                     _this.currentTime.setMonth(month);
1347                     if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1348                         options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1349                     }
1350                     datetimepicker.trigger('xchange.xdsoft');
1351                     return month;
1352                 };
1353 
1354                 _this.getWeekOfYear = function (datetime) {
1355                     if (options.onGetWeekOfYear && $.isFunction(options.onGetWeekOfYear)) {
1356                         var week = options.onGetWeekOfYear.call(datetimepicker, datetime);
1357                         if (typeof week !== 'undefined') {
1358                             return week;
1359                         }
1360                     }
1361                     var onejan = new Date(datetime.getFullYear(), 0, 1);
1362                     //First week of the year is th one with the first Thursday according to ISO8601
1363                     if(onejan.getDay()!=4)
1364                         onejan.setMonth(0, 1 + ((4 - onejan.getDay()+ 7) % 7));
1365                     return Math.ceil((((datetime - onejan) / 86400000) + onejan.getDay() + 1) / 7);
1366                 };
1367 
1368                 _this.strToDateTime = function (sDateTime) {
1369                     var tmpDate = [], timeOffset, currentTime;
1370 
1371                     if (sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime)) {
1372                         return sDateTime;
1373                     }
1374 
1375                     tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime);
1376                     if (tmpDate) {
1377                         tmpDate[2] = dateHelper.parseDate(tmpDate[2], options.formatDate);
1378                     }
1379                     if (tmpDate  && tmpDate[2]) {
1380                         timeOffset = tmpDate[2].getTime() - (tmpDate[2].getTimezoneOffset()) * 60000;
1381                         currentTime = new Date((_this.now(true)).getTime() + parseInt(tmpDate[1] + '1', 10) * timeOffset);
1382                     } else {
1383                         currentTime = sDateTime ? dateHelper.parseDate(sDateTime, options.format) : _this.now();
1384                     }
1385 
1386                     if (!_this.isValidDate(currentTime)) {
1387                         currentTime = _this.now();
1388                     }
1389 
1390                     return currentTime;
1391                 };
1392 
1393                 _this.strToDate = function (sDate) {
1394                     if (sDate && sDate instanceof Date && _this.isValidDate(sDate)) {
1395                         return sDate;
1396                     }
1397 
1398                     var currentTime = sDate ? dateHelper.parseDate(sDate, options.formatDate) : _this.now(true);
1399                     if (!_this.isValidDate(currentTime)) {
1400                         currentTime = _this.now(true);
1401                     }
1402                     return currentTime;
1403                 };
1404 
1405                 _this.strtotime = function (sTime) {
1406                     if (sTime && sTime instanceof Date && _this.isValidDate(sTime)) {
1407                         return sTime;
1408                     }
1409                     var currentTime = sTime ? dateHelper.parseDate(sTime, options.formatTime) : _this.now(true);
1410                     if (!_this.isValidDate(currentTime)) {
1411                         currentTime = _this.now(true);
1412                     }
1413                     return currentTime;
1414                 };
1415 
1416                 _this.str = function () {
1417                     return dateHelper.formatDate(_this.currentTime, options.format);
1418                 };
1419                 _this.currentTime = this.now();
1420             };
1421 
1422             _xdsoft_datetime = new XDSoft_datetime();
1423 
1424             applyButton.on('touchend click', function (e) {//pathbrite
1425                 e.preventDefault();
1426                 datetimepicker.data('changed', true);
1427                 _xdsoft_datetime.setCurrentTime(getCurrentValue());
1428                 input.val(_xdsoft_datetime.str());
1429                 datetimepicker.trigger('close.xdsoft');
1430             });
1431             mounth_picker
1432                 .find('.xdsoft_today_button')
1433                 .on('touchend mousedown.xdsoft', function () {
1434                     datetimepicker.data('changed', true);
1435                     _xdsoft_datetime.setCurrentTime(0);
1436                     datetimepicker.trigger('afterOpen.xdsoft');
1437                 }).on('dblclick.xdsoft', function () {
1438                     var currentDate = _xdsoft_datetime.getCurrentTime(), minDate, maxDate;
1439                     currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
1440                     minDate = _xdsoft_datetime.strToDate(options.minDate);
1441                     minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
1442                     if (currentDate < minDate) {
1443                         return;
1444                     }
1445                     maxDate = _xdsoft_datetime.strToDate(options.maxDate);
1446                     maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());
1447                     if (currentDate > maxDate) {
1448                         return;
1449                     }
1450                     input.val(_xdsoft_datetime.str());
1451                     input.trigger('change');
1452                     datetimepicker.trigger('close.xdsoft');
1453                 });
1454             mounth_picker
1455                 .find('.xdsoft_prev,.xdsoft_next')
1456                 .on('touchend mousedown.xdsoft', function () {
1457                     var $this = $(this),
1458                         timer = 0,
1459                         stop = false;
1460 
1461                     (function arguments_callee1(v) {
1462                         if ($this.hasClass(options.next)) {
1463                             _xdsoft_datetime.nextMonth();
1464                         } else if ($this.hasClass(options.prev)) {
1465                             _xdsoft_datetime.prevMonth();
1466                         }
1467                         if (options.monthChangeSpinner) {
1468                             if (!stop) {
1469                                 timer = setTimeout(arguments_callee1, v || 100);
1470                             }
1471                         }
1472                     }(500));
1473 
1474                     $([document.body, window]).on('touchend mouseup.xdsoft', function arguments_callee2() {
1475                         clearTimeout(timer);
1476                         stop = true;
1477                         $([document.body, window]).off('touchend mouseup.xdsoft', arguments_callee2);
1478                     });
1479                 });
1480 
1481             timepicker
1482                 .find('.xdsoft_prev,.xdsoft_next')
1483                 .on('touchend mousedown.xdsoft', function () {
1484                     var $this = $(this),
1485                         timer = 0,
1486                         stop = false,
1487                         period = 110;
1488                     (function arguments_callee4(v) {
1489                         var pheight = timeboxparent[0].clientHeight,
1490                             height = timebox[0].offsetHeight,
1491                             top = Math.abs(parseInt(timebox.css('marginTop'), 10));
1492                         if ($this.hasClass(options.next) && (height - pheight) - options.timeHeightInTimePicker >= top) {
1493                             timebox.css('marginTop', '-' + (top + options.timeHeightInTimePicker) + 'px');
1494                         } else if ($this.hasClass(options.prev) && top - options.timeHeightInTimePicker >= 0) {
1495                             timebox.css('marginTop', '-' + (top - options.timeHeightInTimePicker) + 'px');
1496                         }
1497                         /**
1498                          * Fixed bug:
1499                          * When using css3 transition, it will cause a bug that you cannot scroll the timepicker list.
1500                          * The reason is that the transition-duration time, if you set it to 0, all things fine, otherwise, this
1501                          * would cause a bug when you use jquery.css method.
1502                          * Let's say: * { transition: all .5s ease; }
1503                          * jquery timebox.css('marginTop') will return the original value which is before you clicking the next/prev button,
1504                          * meanwhile the timebox[0].style.marginTop will return the right value which is after you clicking the
1505                          * next/prev button.
1506                          * 
1507                          * What we should do:
1508                          * Replace timebox.css('marginTop') with timebox[0].style.marginTop.
1509                          */
1510                         timeboxparent.trigger('scroll_element.xdsoft_scroller', [Math.abs(parseInt(timebox[0].style.marginTop, 10) / (height - pheight))]);
1511                         period = (period > 10) ? 10 : period - 10;
1512                         if (!stop) {
1513                             timer = setTimeout(arguments_callee4, v || period);
1514                         }
1515                     }(500));
1516                     $([document.body, window]).on('touchend mouseup.xdsoft', function arguments_callee5() {
1517                         clearTimeout(timer);
1518                         stop = true;
1519                         $([document.body, window])
1520                             .off('touchend mouseup.xdsoft', arguments_callee5);
1521                     });
1522                 });
1523 
1524             xchangeTimer = 0;
1525             // base handler - generating a calendar and timepicker
1526             datetimepicker
1527                 .on('xchange.xdsoft', function (event) {
1528                     clearTimeout(xchangeTimer);
1529                     xchangeTimer = setTimeout(function () {
1530 
1531                         if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
1532                             _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1533                         }
1534 
1535                         var table =    '',
1536                             start = new Date(_xdsoft_datetime.currentTime.getFullYear(), _xdsoft_datetime.currentTime.getMonth(), 1, 12, 0, 0),
1537                             i = 0,
1538                             j,
1539                             today = _xdsoft_datetime.now(),
1540                             maxDate = false,
1541                             minDate = false,
1542                             hDate,
1543                             day,
1544                             d,
1545                             y,
1546                             m,
1547                             w,
1548                             classes = [],
1549                             customDateSettings,
1550                             newRow = true,
1551                             time = '',
1552                             h = '',
1553                             line_time,
1554                             description;
1555 
1556                         while (start.getDay() !== options.dayOfWeekStart) {
1557                             start.setDate(start.getDate() - 1);
1558                         }
1559 
1560                         table += '<table><thead><tr>';
1561 
1562                         if (options.weeks) {
1563                             table += '<th></th>';
1564                         }
1565 
1566                         for (j = 0; j < 7; j += 1) {
1567                             table += '<th>' + options.i18n[globalLocale].dayOfWeekShort[(j + options.dayOfWeekStart) % 7] + '</th>';
1568                         }
1569 
1570                         table += '</tr></thead>';
1571                         table += '<tbody>';
1572 
1573                         if (options.maxDate !== false) {
1574                             maxDate = _xdsoft_datetime.strToDate(options.maxDate);
1575                             maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59, 59, 999);
1576                         }
1577 
1578                         if (options.minDate !== false) {
1579                             minDate = _xdsoft_datetime.strToDate(options.minDate);
1580                             minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
1581                         }
1582 
1583                         while (i < _xdsoft_datetime.currentTime.countDaysInMonth() || start.getDay() !== options.dayOfWeekStart || _xdsoft_datetime.currentTime.getMonth() === start.getMonth()) {
1584                             classes = [];
1585                             i += 1;
1586 
1587                             day = start.getDay();
1588                             d = start.getDate();
1589                             y = start.getFullYear();
1590                             m = start.getMonth();
1591                             w = _xdsoft_datetime.getWeekOfYear(start);
1592                             description = '';
1593 
1594                             classes.push('xdsoft_date');
1595 
1596                             if (options.beforeShowDay && $.isFunction(options.beforeShowDay.call)) {
1597                                 customDateSettings = options.beforeShowDay.call(datetimepicker, start);
1598                             } else {
1599                                 customDateSettings = null;
1600                             }
1601 
1602                             if(options.allowDateRe && Object.prototype.toString.call(options.allowDateRe) === "[object RegExp]"){
1603                                 if(!options.allowDateRe.test(dateHelper.formatDate(start, options.formatDate))){
1604                                     classes.push('xdsoft_disabled');
1605                                 }
1606                             } else if(options.allowDates && options.allowDates.length>0){
1607                                 if(options.allowDates.indexOf(dateHelper.formatDate(start, options.formatDate)) === -1){
1608                                     classes.push('xdsoft_disabled');
1609                                 }
1610                             } else if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
1611                                 classes.push('xdsoft_disabled');
1612                             } else if (options.disabledDates.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
1613                                 classes.push('xdsoft_disabled');
1614                             } else if (options.disabledWeekDays.indexOf(day) !== -1) {
1615                                 classes.push('xdsoft_disabled');
1616                             }else if (input.is('[readonly]')) {
1617                                 classes.push('xdsoft_disabled');
1618                             }
1619 
1620                             if (customDateSettings && customDateSettings[1] !== "") {
1621                                 classes.push(customDateSettings[1]);
1622                             }
1623 
1624                             if (_xdsoft_datetime.currentTime.getMonth() !== m) {
1625                                 classes.push('xdsoft_other_month');
1626                             }
1627 
1628                             if ((options.defaultSelect || datetimepicker.data('changed')) && dateHelper.formatDate(_xdsoft_datetime.currentTime, options.formatDate) === dateHelper.formatDate(start, options.formatDate)) {
1629                                 classes.push('xdsoft_current');
1630                             }
1631 
1632                             if (dateHelper.formatDate(today, options.formatDate) === dateHelper.formatDate(start, options.formatDate)) {
1633                                 classes.push('xdsoft_today');
1634                             }
1635 
1636                             if (start.getDay() === 0 || start.getDay() === 6 || options.weekends.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
1637                                 classes.push('xdsoft_weekend');
1638                             }
1639 
1640                             if (options.highlightedDates[dateHelper.formatDate(start, options.formatDate)] !== undefined) {
1641                                 hDate = options.highlightedDates[dateHelper.formatDate(start, options.formatDate)];
1642                                 classes.push(hDate.style === undefined ? 'xdsoft_highlighted_default' : hDate.style);
1643                                 description = hDate.desc === undefined ? '' : hDate.desc;
1644                             }
1645 
1646                             if (options.beforeShowDay && $.isFunction(options.beforeShowDay)) {
1647                                 classes.push(options.beforeShowDay(start));
1648                             }
1649 
1650                             if (newRow) {
1651                                 table += '<tr>';
1652                                 newRow = false;
1653                                 if (options.weeks) {
1654                                     table += '<th>' + w + '</th>';
1655                                 }
1656                             }
1657 
1658                             table += '<td data-date="' + d + '" data-month="' + m + '" data-year="' + y + '"' + ' class="xdsoft_date xdsoft_day_of_week' + start.getDay() + ' ' + classes.join(' ') + '" title="' + description + '">' +
1659                                         '<div>' + d + '</div>' +
1660                                     '</td>';
1661 
1662                             if (start.getDay() === options.dayOfWeekStartPrev) {
1663                                 table += '</tr>';
1664                                 newRow = true;
1665                             }
1666 
1667                             start.setDate(d + 1);
1668                         }
1669                         table += '</tbody></table>';
1670 
1671                         calendar.html(table);
1672 
1673                         mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[globalLocale].months[_xdsoft_datetime.currentTime.getMonth()]);
1674                         mounth_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear());
1675 
1676                         // generate timebox
1677                         time = '';
1678                         h = '';
1679                         m = '';
1680 
1681                         line_time = function line_time(h, m) {
1682                             var now = _xdsoft_datetime.now(), optionDateTime, current_time,
1683                                 isALlowTimesInit = options.allowTimes && $.isArray(options.allowTimes) && options.allowTimes.length;
1684                             now.setHours(h);
1685                             h = parseInt(now.getHours(), 10);
1686                             now.setMinutes(m);
1687                             m = parseInt(now.getMinutes(), 10);
1688                             optionDateTime = new Date(_xdsoft_datetime.currentTime);
1689                             optionDateTime.setHours(h);
1690                             optionDateTime.setMinutes(m);
1691                             classes = [];            
1692                             if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || (options.maxTime !== false && _xdsoft_datetime.strtotime(options.maxTime).getTime() < now.getTime()) || (options.minTime !== false && _xdsoft_datetime.strtotime(options.minTime).getTime() > now.getTime())) {
1693                                 classes.push('xdsoft_disabled');
1694                             } else if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || ((options.disabledMinTime !== false && now.getTime() > _xdsoft_datetime.strtotime(options.disabledMinTime).getTime()) && (options.disabledMaxTime !== false && now.getTime() < _xdsoft_datetime.strtotime(options.disabledMaxTime).getTime()))) {
1695                                 classes.push('xdsoft_disabled');
1696                             } else if (input.is('[readonly]')) {
1697                                 classes.push('xdsoft_disabled');
1698                             }
1699 
1700                             current_time = new Date(_xdsoft_datetime.currentTime);
1701                             current_time.setHours(parseInt(_xdsoft_datetime.currentTime.getHours(), 10));
1702 
1703                             if (!isALlowTimesInit) {
1704                                 current_time.setMinutes(Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes() / options.step) * options.step);
1705                             }
1706 
1707                             if ((options.initTime || options.defaultSelect || datetimepicker.data('changed')) && current_time.getHours() === parseInt(h, 10) && ((!isALlowTimesInit && options.step > 59) || current_time.getMinutes() === parseInt(m, 10))) {
1708                                 if (options.defaultSelect || datetimepicker.data('changed')) {
1709                                     classes.push('xdsoft_current');
1710                                 } else if (options.initTime) {
1711                                     classes.push('xdsoft_init_time');
1712                                 }
1713                             }
1714                             if (parseInt(today.getHours(), 10) === parseInt(h, 10) && parseInt(today.getMinutes(), 10) === parseInt(m, 10)) {
1715                                 classes.push('xdsoft_today');
1716                             }
1717                             time += '<div class="xdsoft_time ' + classes.join(' ') + '" data-hour="' + h + '" data-minute="' + m + '">' + dateHelper.formatDate(now, options.formatTime) + '</div>';
1718                         };
1719 
1720                         if (!options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length) {
1721                             for (i = 0, j = 0; i < (options.hours12 ? 12 : 24); i += 1) {
1722                                 for (j = 0; j < 60; j += options.step) {
1723                                     h = (i < 10 ? '0' : '') + i;
1724                                     m = (j < 10 ? '0' : '') + j;
1725                                     line_time(h, m);
1726                                 }
1727                             }
1728                         } else {
1729                             for (i = 0; i < options.allowTimes.length; i += 1) {
1730                                 h = _xdsoft_datetime.strtotime(options.allowTimes[i]).getHours();
1731                                 m = _xdsoft_datetime.strtotime(options.allowTimes[i]).getMinutes();
1732                                 line_time(h, m);
1733                             }
1734                         }
1735 
1736                         timebox.html(time);
1737 
1738                         opt = '';
1739                         i = 0;
1740 
1741                         for (i = parseInt(options.yearStart, 10) + options.yearOffset; i <= parseInt(options.yearEnd, 10) + options.yearOffset; i += 1) {
1742                             opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getFullYear() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + i + '</div>';
1743                         }
1744                         yearselect.children().eq(0)
1745                                                 .html(opt);
1746 
1747                         for (i = parseInt(options.monthStart, 10), opt = ''; i <= parseInt(options.monthEnd, 10); i += 1) {
1748                             opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getMonth() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + options.i18n[globalLocale].months[i] + '</div>';
1749                         }
1750                         monthselect.children().eq(0).html(opt);
1751                         $(datetimepicker)
1752                             .trigger('generate.xdsoft');
1753                     }, 10);
1754                     event.stopPropagation();
1755                 })
1756                 .on('afterOpen.xdsoft', function () {
1757                     if (options.timepicker) {
1758                         var classType, pheight, height, top;
1759                         if (timebox.find('.xdsoft_current').length) {
1760                             classType = '.xdsoft_current';
1761                         } else if (timebox.find('.xdsoft_init_time').length) {
1762                             classType = '.xdsoft_init_time';
1763                         }
1764                         if (classType) {
1765                             pheight = timeboxparent[0].clientHeight;
1766                             height = timebox[0].offsetHeight;
1767                             top = timebox.find(classType).index() * options.timeHeightInTimePicker + 1;
1768                             if ((height - pheight) < top) {
1769                                 top = height - pheight;
1770                             }
1771                             timeboxparent.trigger('scroll_element.xdsoft_scroller', [parseInt(top, 10) / (height - pheight)]);
1772                         } else {
1773                             timeboxparent.trigger('scroll_element.xdsoft_scroller', [0]);
1774                         }
1775                     }
1776                 });
1777 
1778             timerclick = 0;
1779             calendar
1780                 .on('touchend click.xdsoft', 'td', function (xdevent) {
1781                     xdevent.stopPropagation();  // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap
1782                     timerclick += 1;
1783                     var $this = $(this),
1784                         currentTime = _xdsoft_datetime.currentTime;
1785 
1786                     if (currentTime === undefined || currentTime === null) {
1787                         _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1788                         currentTime = _xdsoft_datetime.currentTime;
1789                     }
1790 
1791                     if ($this.hasClass('xdsoft_disabled')) {
1792                         return false;
1793                     }
1794 
1795                     currentTime.setDate(1);
1796                     currentTime.setFullYear($this.data('year'));
1797                     currentTime.setMonth($this.data('month'));
1798                     currentTime.setDate($this.data('date'));
1799 
1800                     datetimepicker.trigger('select.xdsoft', [currentTime]);
1801 
1802                     input.val(_xdsoft_datetime.str());
1803 
1804                     if (options.onSelectDate &&    $.isFunction(options.onSelectDate)) {
1805                         options.onSelectDate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
1806                     }
1807 
1808                     datetimepicker.data('changed', true);
1809                     datetimepicker.trigger('xchange.xdsoft');
1810                     datetimepicker.trigger('changedatetime.xdsoft');
1811                     if ((timerclick > 1 || (options.closeOnDateSelect === true || (options.closeOnDateSelect === false && !options.timepicker))) && !options.inline) {
1812                         datetimepicker.trigger('close.xdsoft');
1813                     }
1814                     setTimeout(function () {
1815                         timerclick = 0;
1816                     }, 200);
1817                 });
1818 
1819             timebox
1820                 .on('touchend click.xdsoft', 'div', function (xdevent) {
1821                     xdevent.stopPropagation();
1822                     var $this = $(this),
1823                         currentTime = _xdsoft_datetime.currentTime;
1824 
1825                     if (currentTime === undefined || currentTime === null) {
1826                         _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1827                         currentTime = _xdsoft_datetime.currentTime;
1828                     }
1829 
1830                     if ($this.hasClass('xdsoft_disabled')) {
1831                         return false;
1832                     }
1833                     currentTime.setHours($this.data('hour'));
1834                     currentTime.setMinutes($this.data('minute'));
1835                     datetimepicker.trigger('select.xdsoft', [currentTime]);
1836 
1837                     datetimepicker.data('input').val(_xdsoft_datetime.str());
1838 
1839                     if (options.onSelectTime && $.isFunction(options.onSelectTime)) {
1840                         options.onSelectTime.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
1841                     }
1842                     datetimepicker.data('changed', true);
1843                     datetimepicker.trigger('xchange.xdsoft');
1844                     datetimepicker.trigger('changedatetime.xdsoft');
1845                     if (options.inline !== true && options.closeOnTimeSelect === true) {
1846                         datetimepicker.trigger('close.xdsoft');
1847                     }
1848                 });
1849 
1850             datepicker
1851                 .on('mousewheel.xdsoft', function (event) {
1852                     if (!options.scrollMonth) {
1853                         return true;
1854                     }
1855                     if (event.deltaY < 0) {
1856                         _xdsoft_datetime.nextMonth();
1857                     } else {
1858                         _xdsoft_datetime.prevMonth();
1859                     }
1860                     return false;
1861                 });
1862 
1863             input
1864                 .on('mousewheel.xdsoft', function (event) {
1865                     if (!options.scrollInput) {
1866                         return true;
1867                     }
1868                     if (!options.datepicker && options.timepicker) {
1869                         current_time_index = timebox.find('.xdsoft_current').length ? timebox.find('.xdsoft_current').eq(0).index() : 0;
1870                         if (current_time_index + event.deltaY >= 0 && current_time_index + event.deltaY < timebox.children().length) {
1871                             current_time_index += event.deltaY;
1872                         }
1873                         if (timebox.children().eq(current_time_index).length) {
1874                             timebox.children().eq(current_time_index).trigger('mousedown');
1875                         }
1876                         return false;
1877                     }
1878                     if (options.datepicker && !options.timepicker) {
1879                         datepicker.trigger(event, [event.deltaY, event.deltaX, event.deltaY]);
1880                         if (input.val) {
1881                             input.val(_xdsoft_datetime.str());
1882                         }
1883                         datetimepicker.trigger('changedatetime.xdsoft');
1884                         return false;
1885                     }
1886                 });
1887 
1888             datetimepicker
1889                 .on('changedatetime.xdsoft', function (event) {
1890                     if (options.onChangeDateTime && $.isFunction(options.onChangeDateTime)) {
1891                         var $input = datetimepicker.data('input');
1892                         options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input, event);
1893                         delete options.value;
1894                         $input.trigger('change');
1895                     }
1896                 })
1897                 .on('generate.xdsoft', function () {
1898                     if (options.onGenerate && $.isFunction(options.onGenerate)) {
1899                         options.onGenerate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1900                     }
1901                     if (triggerAfterOpen) {
1902                         datetimepicker.trigger('afterOpen.xdsoft');
1903                         triggerAfterOpen = false;
1904                     }
1905                 })
1906                 .on('click.xdsoft', function (xdevent) {
1907                     xdevent.stopPropagation();
1908                 });
1909 
1910             current_time_index = 0;
1911 
1912             /**
1913              * Runs the callback for each of the specified node's ancestors.
1914              *
1915              * Return FALSE from the callback to stop ascending.
1916              *
1917              * @param {DOMNode} node
1918              * @param {Function} callback
1919              * @returns {undefined}
1920              */
1921             forEachAncestorOf = function (node, callback) {
1922                 do {
1923                     node = node.parentNode;
1924 
1925                     if (callback(node) === false) {
1926                         break;
1927                     }
1928                 } while (node.nodeName !== 'HTML');
1929             };
1930 
1931             /**
1932              * Sets the position of the picker.
1933              *
1934              * @returns {undefined}
1935              */
1936             setPos = function () {
1937                 var dateInputOffset,
1938                     dateInputElem,
1939                     verticalPosition,
1940                     left,
1941                     position,
1942                     datetimepickerElem,
1943                     dateInputHasFixedAncestor,
1944                     $dateInput,
1945                     windowWidth,
1946                     verticalAnchorEdge,
1947                     datetimepickerCss,
1948                     windowHeight,
1949                     windowScrollTop;
1950 
1951                 $dateInput = datetimepicker.data('input');
1952                 dateInputOffset = $dateInput.offset();
1953                 dateInputElem = $dateInput[0];
1954 
1955                 verticalAnchorEdge = 'top';
1956                 verticalPosition = (dateInputOffset.top + dateInputElem.offsetHeight) - 1;
1957                 left = dateInputOffset.left;
1958                 position = "absolute";
1959 
1960                 windowWidth = $(window).width();
1961                 windowHeight = $(window).height();
1962                 windowScrollTop = $(window).scrollTop();
1963 
1964                 if ((document.documentElement.clientWidth - dateInputOffset.left) < datepicker.parent().outerWidth(true)) {
1965                     var diff = datepicker.parent().outerWidth(true) - dateInputElem.offsetWidth;
1966                     left = left - diff;
1967                 }
1968 
1969                 if ($dateInput.parent().css('direction') === 'rtl') {
1970                     left -= (datetimepicker.outerWidth() - $dateInput.outerWidth());
1971                 }
1972 
1973                 if (options.fixed) {
1974                     verticalPosition -= windowScrollTop;
1975                     left -= $(window).scrollLeft();
1976                     position = "fixed";
1977                 } else {
1978                     dateInputHasFixedAncestor = false;
1979 
1980                     forEachAncestorOf(dateInputElem, function (ancestorNode) {
1981                         if (window.getComputedStyle(ancestorNode).getPropertyValue('position') === 'fixed') {
1982                             dateInputHasFixedAncestor = true;
1983                             return false;
1984                         }
1985                     });
1986 
1987                     if (dateInputHasFixedAncestor) {
1988                         position = 'fixed';
1989 
1990                         //If the picker won't fit entirely within the viewport then display it above the date input.
1991                         if (verticalPosition + datetimepicker.outerHeight() > windowHeight + windowScrollTop) {
1992                             verticalAnchorEdge = 'bottom';
1993                             verticalPosition = (windowHeight + windowScrollTop) - dateInputOffset.top;
1994                         } else {
1995                             verticalPosition -= windowScrollTop;
1996                         }
1997                     } else {
1998                         if (verticalPosition + dateInputElem.offsetHeight > windowHeight + windowScrollTop) {
1999                             verticalPosition = dateInputOffset.top - dateInputElem.offsetHeight + 1;
2000                         }
2001                     }
2002 
2003                     if (verticalPosition < 0) {
2004                         verticalPosition = 0;
2005                     }
2006 
2007                     if (left + dateInputElem.offsetWidth > windowWidth) {
2008                         left = windowWidth - dateInputElem.offsetWidth;
2009                     }
2010                 }
2011 
2012                 datetimepickerElem = datetimepicker[0];
2013 
2014                 forEachAncestorOf(datetimepickerElem, function (ancestorNode) {
2015                     var ancestorNodePosition;
2016 
2017                     ancestorNodePosition = window.getComputedStyle(ancestorNode).getPropertyValue('position');
2018 
2019                     if (ancestorNodePosition === 'relative' && windowWidth >= ancestorNode.offsetWidth) {
2020                         left = left - ((windowWidth - ancestorNode.offsetWidth) / 2);
2021                         return false;
2022                     }
2023                 });
2024 
2025                 datetimepickerCss = {
2026                     position: position,
2027                     left: left,
2028                     top: '',  //Initialize to prevent previous values interfering with new ones.
2029                     bottom: ''  //Initialize to prevent previous values interfering with new ones.
2030                 };
2031 
2032                 datetimepickerCss[verticalAnchorEdge] = verticalPosition;
2033 
2034                 datetimepicker.css(datetimepickerCss);
2035             };
2036 
2037             datetimepicker
2038                 .on('open.xdsoft', function (event) {
2039                     var onShow = true;
2040                     if (options.onShow && $.isFunction(options.onShow)) {
2041                         onShow = options.onShow.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
2042                     }
2043                     if (onShow !== false) {
2044                         datetimepicker.show();
2045                         setPos();
2046                         $(window)
2047                             .off('resize.xdsoft', setPos)
2048                             .on('resize.xdsoft', setPos);
2049 
2050                         if (options.closeOnWithoutClick) {
2051                             $([document.body, window]).on('touchstart mousedown.xdsoft', function arguments_callee6() {
2052                                 datetimepicker.trigger('close.xdsoft');
2053                                 $([document.body, window]).off('touchstart mousedown.xdsoft', arguments_callee6);
2054                             });
2055                         }
2056                     }
2057                 })
2058                 .on('close.xdsoft', function (event) {
2059                     var onClose = true;
2060                     mounth_picker
2061                         .find('.xdsoft_month,.xdsoft_year')
2062                             .find('.xdsoft_select')
2063                                 .hide();
2064                     if (options.onClose && $.isFunction(options.onClose)) {
2065                         onClose = options.onClose.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
2066                     }
2067                     if (onClose !== false && !options.opened && !options.inline) {
2068                         datetimepicker.hide();
2069                     }
2070                     event.stopPropagation();
2071                 })
2072                 .on('toggle.xdsoft', function () {
2073                     if (datetimepicker.is(':visible')) {
2074                         datetimepicker.trigger('close.xdsoft');
2075                     } else {
2076                         datetimepicker.trigger('open.xdsoft');
2077                     }
2078                 })
2079                 .data('input', input);
2080 
2081             timer = 0;
2082 
2083             datetimepicker.data('xdsoft_datetime', _xdsoft_datetime);
2084             datetimepicker.setOptions(options);
2085 
2086             function getCurrentValue() {
2087                 var ct = false, time;
2088 
2089                 if (options.startDate) {
2090                     ct = _xdsoft_datetime.strToDate(options.startDate);
2091                 } else {
2092                     ct = options.value || ((input && input.val && input.val()) ? input.val() : '');
2093                     if (ct) {
2094                         ct = _xdsoft_datetime.strToDateTime(ct);
2095                     } else if (options.defaultDate) {
2096                         ct = _xdsoft_datetime.strToDateTime(options.defaultDate);
2097                         if (options.defaultTime) {
2098                             time = _xdsoft_datetime.strtotime(options.defaultTime);
2099                             ct.setHours(time.getHours());
2100                             ct.setMinutes(time.getMinutes());
2101                         }
2102                     }
2103                 }
2104 
2105                 if (ct && _xdsoft_datetime.isValidDate(ct)) {
2106                     datetimepicker.data('changed', true);
2107                 } else {
2108                     ct = '';
2109                 }
2110 
2111                 return ct || 0;
2112             }
2113 
2114             function setMask(options) {
2115 
2116                 var isValidValue = function (mask, value) {
2117                     var reg = mask
2118                         .replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
2119                         .replace(/_/g, '{digit+}')
2120                         .replace(/([0-9]{1})/g, '{digit$1}')
2121                         .replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
2122                         .replace(/\{digit[\+]\}/g, '[0-9_]{1}');
2123                     return (new RegExp(reg)).test(value);
2124                 },
2125                 getCaretPos = function (input) {
2126                     try {
2127                         if (document.selection && document.selection.createRange) {
2128                             var range = document.selection.createRange();
2129                             return range.getBookmark().charCodeAt(2) - 2;
2130                         }
2131                         if (input.setSelectionRange) {
2132                             return input.selectionStart;
2133                         }
2134                     } catch (e) {
2135                         return 0;
2136                     }
2137                 },
2138                 setCaretPos = function (node, pos) {
2139                     node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
2140                     if (!node) {
2141                         return false;
2142                     }
2143                     if (node.createTextRange) {
2144                         var textRange = node.createTextRange();
2145                         textRange.collapse(true);
2146                         textRange.moveEnd('character', pos);
2147                         textRange.moveStart('character', pos);
2148                         textRange.select();
2149                         return true;
2150                     }
2151                     if (node.setSelectionRange) {
2152                         node.setSelectionRange(pos, pos);
2153                         return true;
2154                     }
2155                     return false;
2156                 };
2157                 if(options.mask) {
2158                     input.off('keydown.xdsoft');
2159                 }
2160                 if (options.mask === true) {
2161                                                         if (typeof moment != 'undefined') {
2162                                                                     options.mask = options.format
2163                                                                             .replace(/Y{4}/g, '9999')
2164                                                                             .replace(/Y{2}/g, '99')
2165                                                                             .replace(/M{2}/g, '19')
2166                                                                             .replace(/D{2}/g, '39')
2167                                                                             .replace(/H{2}/g, '29')
2168                                                                             .replace(/m{2}/g, '59')
2169                                                                             .replace(/s{2}/g, '59');
2170                                                         } else {
2171                                                                     options.mask = options.format
2172                                                                             .replace(/Y/g, '9999')
2173                                                                             .replace(/F/g, '9999')
2174                                                                             .replace(/m/g, '19')
2175                                                                             .replace(/d/g, '39')
2176                                                                             .replace(/H/g, '29')
2177                                                                             .replace(/i/g, '59')
2178                                                                             .replace(/s/g, '59');
2179                                                         }
2180                 }
2181 
2182                 if ($.type(options.mask) === 'string') {
2183                     if (!isValidValue(options.mask, input.val())) {
2184                         input.val(options.mask.replace(/[0-9]/g, '_'));
2185                         setCaretPos(input[0], 0);
2186                     }
2187 
2188                     input.on('keydown.xdsoft', function (event) {
2189                         var val = this.value,
2190                             key = event.which,
2191                             pos,
2192                             digit;
2193 
2194                         if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
2195                             pos = getCaretPos(this);
2196                             digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
2197 
2198                             if ((key === BACKSPACE || key === DEL) && pos) {
2199                                 pos -= 1;
2200                                 digit = '_';
2201                             }
2202 
2203                             while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
2204                                 pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
2205                             }
2206 
2207                             val = val.substr(0, pos) + digit + val.substr(pos + 1);
2208                             if ($.trim(val) === '') {
2209                                 val = options.mask.replace(/[0-9]/g, '_');
2210                             } else {
2211                                 if (pos === options.mask.length) {
2212                                     event.preventDefault();
2213                                     return false;
2214                                 }
2215                             }
2216 
2217                             pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
2218                             while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
2219                                 pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
2220                             }
2221 
2222                             if (isValidValue(options.mask, val)) {
2223                                 this.value = val;
2224                                 setCaretPos(this, pos);
2225                             } else if ($.trim(val) === '') {
2226                                 this.value = options.mask.replace(/[0-9]/g, '_');
2227                             } else {
2228                                 input.trigger('error_input.xdsoft');
2229                             }
2230                         } else {
2231                             if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
2232                                 return true;
2233                             }
2234                         }
2235 
2236                         event.preventDefault();
2237                         return false;
2238                     });
2239                 }
2240             }
2241 
2242             _xdsoft_datetime.setCurrentTime(getCurrentValue());
2243 
2244             input
2245                 .data('xdsoft_datetimepicker', datetimepicker)
2246                 .on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function () {
2247                     if (input.is(':disabled') || (input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick)) {
2248                         return;
2249                     }
2250                     clearTimeout(timer);
2251                     timer = setTimeout(function () {
2252                         if (input.is(':disabled')) {
2253                             return;
2254                         }
2255 
2256                         triggerAfterOpen = true;
2257                         _xdsoft_datetime.setCurrentTime(getCurrentValue());
2258                         if(options.mask) {
2259                             setMask(options);
2260                         }
2261                         datetimepicker.trigger('open.xdsoft');
2262                     }, 100);
2263                 })
2264                 .on('keydown.xdsoft', function (event) {
2265                     var elementSelector,
2266                         key = event.which;
2267                     if ([ENTER].indexOf(key) !== -1 && options.enterLikeTab) {
2268                         elementSelector = $("input:visible,textarea:visible,button:visible,a:visible");
2269                         datetimepicker.trigger('close.xdsoft');
2270                         elementSelector.eq(elementSelector.index(this) + 1).focus();
2271                         return false;
2272                     }
2273                     if ([TAB].indexOf(key) !== -1) {
2274                         datetimepicker.trigger('close.xdsoft');
2275                         return true;
2276                     }
2277                 })
2278                 .on('blur.xdsoft', function () {
2279                     datetimepicker.trigger('close.xdsoft');
2280                 });
2281         };
2282         destroyDateTimePicker = function (input) {
2283             var datetimepicker = input.data('xdsoft_datetimepicker');
2284             if (datetimepicker) {
2285                 datetimepicker.data('xdsoft_datetime', null);
2286                 datetimepicker.remove();
2287                 input
2288                     .data('xdsoft_datetimepicker', null)
2289                     .off('.xdsoft');
2290                 $(window).off('resize.xdsoft');
2291                 $([window, document.body]).off('mousedown.xdsoft touchstart');
2292                 if (input.unmousewheel) {
2293                     input.unmousewheel();
2294                 }
2295             }
2296         };
2297         $(document)
2298             .off('keydown.xdsoftctrl keyup.xdsoftctrl')
2299             .on('keydown.xdsoftctrl', function (e) {
2300                 if (e.keyCode === CTRLKEY) {
2301                     ctrlDown = true;
2302                 }
2303             })
2304             .on('keyup.xdsoftctrl', function (e) {
2305                 if (e.keyCode === CTRLKEY) {
2306                     ctrlDown = false;
2307                 }
2308             });
2309 
2310         this.each(function () {
2311             var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
2312             if (datetimepicker) {
2313                 if ($.type(opt) === 'string') {
2314                     switch (opt) {
2315                     case 'show':
2316                         $(this).select().focus();
2317                         datetimepicker.trigger('open.xdsoft');
2318                         break;
2319                     case 'hide':
2320                         datetimepicker.trigger('close.xdsoft');
2321                         break;
2322                     case 'toggle':
2323                         datetimepicker.trigger('toggle.xdsoft');
2324                         break;
2325                     case 'destroy':
2326                         destroyDateTimePicker($(this));
2327                         break;
2328                     case 'reset':
2329                         this.value = this.defaultValue;
2330                         if (!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(dateHelper.parseDate(this.value, options.format))) {
2331                             datetimepicker.data('changed', false);
2332                         }
2333                         datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value);
2334                         break;
2335                     case 'validate':
2336                         $input = datetimepicker.data('input');
2337                         $input.trigger('blur.xdsoft');
2338                         break;
2339                     default:
2340                         if (datetimepicker[opt] && $.isFunction(datetimepicker[opt])) {
2341                             result = datetimepicker[opt](opt2);
2342                         }
2343                     }
2344                 } else {
2345                     datetimepicker
2346                         .setOptions(opt);
2347                 }
2348                 return 0;
2349             }
2350             if ($.type(opt) !== 'string') {
2351                 if (!options.lazyInit || options.open || options.inline) {
2352                     createDateTimePicker($(this));
2353                 } else {
2354                     lazyInit($(this));
2355                 }
2356             }
2357         });
2358 
2359         return result;
2360     };
2361 
2362     $.fn.datetimepicker.defaults = default_options;
2363 
2364     function HighlightedDate(date, desc, style) {
2365         "use strict";
2366         this.date = date;
2367         this.desc = desc;
2368         this.style = style;
2369     }
2370 }));
jquery.datetimepicker.js
1 /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
2 //@ sourceMappingURL=jquery-1.10.2.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.2",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=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):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=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(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 kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(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 ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(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.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(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=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(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=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(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=K.test(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},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 pt(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?pt(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:lt,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=mt(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())?lt(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:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(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:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(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:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(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 yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(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 bt(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 xt(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 wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(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=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(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=[vt(bt(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 wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(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=xt(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?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(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&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),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!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],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="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",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></: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="<table><tr><td></td><td>t</td></tr></table>",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="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
5 }({});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;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):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 t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}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=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},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></$2>");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></$2>")+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)?"<table>"!==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){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){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,order:!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("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
jquery.js
1 /*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
2 !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
3 a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),
4 null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r});
jquery-3.2.1.min.js

 

posted @ 2018-04-01 17:16  dream-子皿  阅读(1312)  评论(0)    收藏  举报