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/'
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 ]
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)
项目表注册:

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)
项目权限之登录操作:

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")
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
权限数据结构生成:

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
中间件拦截:

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')
前端模板:
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>
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
使用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)
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>
自定义标签模板:

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 %}
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 %}
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 %}
展示页面:

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 %}
外键关联字段添加内容:

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>
成绩录入页面:

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¤t_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>
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>
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>
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>
静态文件配置:
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 }

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 }

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 }

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 }

1 body{ 2 background-color: lightgrey; 3 } 4 .container{ 5 padding-top:100px; 6 }
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 }

1 function pop(url){ 2 window.open(url,"","width=400,height=300,top=200,left=500") 3 }

1 $('#datetimepicker').datetimepicker({ 2 format: "Y-m-d", 3 timepicker: false,//是否开启精确到小时按钮 4 todayButton: true,//是否开启返回今天的home键 5 }); 6 7 $.datetimepicker.setLocale('ch');//中文显示

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 });
还有一个柱状图的配置文件,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(/</g,"\x3c").replace(/>/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});

1 /*! 2 * @copyright Copyright © 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 }));

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 }));

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);

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});