Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
fef22445
Commit
fef22445
authored
Mar 19, 2015
by
halcyon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
鉴权
parent
9348a0de
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1412 additions
and
97 deletions
+1412
-97
connect.py
connect.py
+4
-2
AddUserAsset.py
docs/AddUserAsset.py
+8
-9
views.py
jasset/views.py
+64
-30
models.py
jlog/models.py
+1
-0
views.py
jlog/views.py
+60
-17
api.py
jumpserver/api.py
+7
-0
context_processors.py
jumpserver/context_processors.py
+5
-1
mytags.py
jumpserver/templatetags/mytags.py
+0
-16
fullcalendar.css
static/css/plugins/fullcalendar/fullcalendar.css
+977
-0
fullcalendar.print.css
static/css/plugins/fullcalendar/fullcalendar.print.css
+202
-0
fullcalendar.min.js
static/js/plugins/fullcalendar/fullcalendar.min.js
+9
-0
moment.min.js
static/js/plugins/fullcalendar/moment.min.js
+8
-0
foot_script.html
templates/foot_script.html
+2
-0
group_add.html
templates/jasset/group_add.html
+4
-4
host_add.html
templates/jasset/host_add.html
+0
-10
host_add_multi.html
templates/jasset/host_add_multi.html
+1
-1
log_offline.html
templates/jlog/log_offline.html
+3
-1
log_online.html
templates/jlog/log_online.html
+2
-0
log_search.html
templates/jlog/log_search.html
+2
-0
link_css.html
templates/link_css.html
+1
-0
nav.html
templates/nav.html
+52
-6
No files found.
connect.py
View file @
fef22445
...
...
@@ -43,7 +43,8 @@ LOG_DIR = os.path.join(BASE_DIR, 'logs')
SSH_KEY_DIR
=
os
.
path
.
join
(
BASE_DIR
,
'keys'
)
SERVER_KEY_DIR
=
os
.
path
.
join
(
SSH_KEY_DIR
,
'server'
)
KEY
=
CONF
.
get
(
'web'
,
'key'
)
LOGIN_NAME
=
getpass
.
getuser
()
#LOGIN_NAME = getpass.getuser()
LOGIN_NAME
=
'wy01'
def
color_print
(
msg
,
color
=
'blue'
):
...
...
@@ -103,6 +104,7 @@ def log_record(username, host):
today_connect_log_dir
=
os
.
path
.
join
(
connect_log_dir
,
today
)
log_filename
=
'
%
s_
%
s_
%
s.log'
%
(
username
,
host
,
time_now
)
log_file_path
=
os
.
path
.
join
(
today_connect_log_dir
,
log_filename
)
dept_name
=
User
.
objects
.
get
(
username
=
username
)
.
dept
pid
=
os
.
getpid
()
ip_list
=
[]
remote_ip
=
os
.
popen
(
"who |grep `ps aux |gawk '{if ($2==
%
s) print $1}'` |gawk '{print $5}'|tr -d '()'"
%
pid
)
.
readlines
()
...
...
@@ -122,7 +124,7 @@ def log_record(username, host):
except
IOError
:
raise
ServerError
(
'Create logfile failed, Please modify
%
s permission.'
%
today_connect_log_dir
)
log
=
Log
(
user
=
username
,
host
=
host
,
remote_ip
=
ip_list
,
log_path
=
log_file_path
,
start_time
=
datetime
.
now
(),
pid
=
pid
)
log
=
Log
(
user
=
username
,
host
=
host
,
remote_ip
=
ip_list
,
dept_name
=
dept_name
,
log_path
=
log_file_path
,
start_time
=
datetime
.
now
(),
pid
=
pid
)
log_file
.
write
(
'Starttime is
%
s
\n
'
%
datetime
.
now
())
log
.
save
()
return
log_file
,
log
...
...
docs/AddUserAsset.py
View file @
fef22445
...
...
@@ -13,7 +13,6 @@ django.setup()
from
juser.views
import
db_add_user
,
md5_crypt
,
CRYPTOR
,
db_add_group
from
jasset.models
import
Asset
,
IDC
,
BisGroup
from
juser.models
import
UserGroup
,
DEPT
,
User
from
jasset.views
import
jasset_group_add
from
jperm.models
import
CmdGroup
from
jlog.models
import
Log
...
...
@@ -123,18 +122,18 @@ def test_add_log():
end_time
=
datetime
.
datetime
.
now
()
log_path
=
'/var/log/jumpserver/test.log'
host
=
'192.168.1.'
+
str
(
ip
)
Log
.
objects
.
create
(
user
=
user
,
host
=
host
,
log_path
=
log_path
,
pid
=
168
,
start_time
=
start_time
,
Log
.
objects
.
create
(
user
=
user
,
host
=
host
,
remote_ip
=
'8.8.8.8'
,
dept_name
=
'运维部'
,
log_path
=
log_path
,
pid
=
168
,
start_time
=
start_time
,
is_finished
=
1
,
log_finished
=
1
,
end_time
=
end_time
)
if
__name__
==
'__main__'
:
install
()
test_add_dept
()
test_add_group
()
test_add_user
()
test_add_idc
()
test_add_asset_group
()
test_add_asset
()
#
install()
#
test_add_dept()
#
test_add_group()
#
test_add_user()
#
test_add_idc()
#
test_add_asset_group()
#
test_add_asset()
test_add_log
()
...
...
jasset/views.py
View file @
fef22445
# coding:utf-8
import
ast
from
django.db.models
import
Q
from
django.http
import
HttpResponseRedirect
from
django.template
import
RequestContext
from
django.shortcuts
import
render_to_response
from
models
import
IDC
,
Asset
,
BisGroup
from
juser.models
import
UserGroup
,
DEPT
,
User
from
juser.models
import
UserGroup
,
DEPT
from
connect
import
PyCrypt
,
KEY
from
jlog.models
import
Log
from
jumpserver.views
import
jasset_host_edit
,
pages
from
jumpserver.api
import
asset_perm_api
from
jumpserver.api
import
user_perm_group_api
,
require_login
,
require_super_user
,
\
require_admin
,
is_group_admin
,
is_super_user
,
get_user_dept
require_admin
,
is_group_admin
,
is_super_user
,
is_common_user
,
get_user_dept
cryptor
=
PyCrypt
(
KEY
)
...
...
@@ -61,7 +63,7 @@ def add_host(request):
eidc
=
IDC
.
objects
.
all
()
if
is_super_user
(
request
):
edept
=
DEPT
.
objects
.
all
()
egroup
=
BisGroup
.
objects
.
all
(
)
egroup
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
eusergroup
=
UserGroup
.
objects
.
all
()
elif
is_group_admin
(
request
):
dept_id
=
get_user_dept
(
request
)
...
...
@@ -93,21 +95,20 @@ def add_host(request):
return
render_to_response
(
'jasset/host_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
add_host_multi
(
request
):
header_title
,
path1
,
path2
=
u'批量添加主机'
,
u'资产管理'
,
u'批量添加主机'
login_types
=
{
'LDAP'
:
'L'
,
'
SSH_KEY'
:
'S'
,
'PASSWORD'
:
'P'
,
'
MAP'
:
'M'
}
j_group
=
[]
login_types
=
{
'LDAP'
:
'L'
,
'MAP'
:
'M'
}
dept_id
=
get_user_dept
(
request
)
if
request
.
method
==
'POST'
:
multi_hosts
=
request
.
POST
.
get
(
'j_multi'
)
.
split
(
'
\n
'
)
for
host
in
multi_hosts
:
if
host
==
''
:
break
j_ip
,
j_port
,
j_type
,
j_idc
,
j_groups
,
j_active
,
j_comment
=
host
.
split
()
j_ip
,
j_port
,
j_type
,
j_idc
,
j_groups
,
j_
depts
,
j_
active
,
j_comment
=
host
.
split
()
j_type
=
login_types
[
j_type
]
j_groups
=
j_groups
.
split
(
','
)
for
group
in
j_groups
:
g
=
group
.
strip
(
'[]'
)
.
encode
(
'utf-8'
)
.
strip
()
j_group
.
append
(
g
)
j_group
=
ast
.
literal_eval
(
j_groups
)
j_dept
=
ast
.
literal_eval
(
j_depts
)
if
Asset
.
objects
.
filter
(
ip
=
str
(
j_ip
)):
emg
=
u'该IP
%
s 已存在!'
%
j_ip
...
...
@@ -117,9 +118,9 @@ def add_host_multi(request):
if
j_type
==
'M'
:
j_user
=
request
.
POST
.
get
(
'j_user'
)
j_password
=
cryptor
.
encrypt
(
request
.
POST
.
get
(
'j_password'
))
f_add_host
(
j_ip
,
j_port
,
j_idc
,
j_type
,
j_group
,
j_active
,
j_comment
,
j_user
,
j_password
)
f_add_host
(
j_ip
,
j_port
,
j_idc
,
j_type
,
j_group
,
j_
dept
,
j_
active
,
j_comment
,
j_user
,
j_password
)
else
:
f_add_host
(
j_ip
,
j_port
,
j_idc
,
j_type
,
j_group
,
j_active
,
j_comment
)
f_add_host
(
j_ip
,
j_port
,
j_idc
,
j_type
,
j_group
,
j_
dept
,
j_
active
,
j_comment
)
smg
=
u'批量添加添加成功'
return
HttpResponseRedirect
(
'/jasset/host_list/'
)
...
...
@@ -127,6 +128,7 @@ def add_host_multi(request):
return
render_to_response
(
'jasset/host_add_multi.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
batch_host_edit
(
request
):
if
request
.
method
==
'POST'
:
len_table
=
request
.
POST
.
get
(
'len_table'
)
...
...
@@ -161,7 +163,8 @@ def batch_host_edit(request):
return
render_to_response
(
'jasset/host_list.html'
)
@require_admin
@require_login
def
list_host
(
request
):
header_title
,
path1
,
path2
=
u'查看主机'
,
u'资产管理'
,
u'查看主机'
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
...
...
@@ -172,22 +175,23 @@ def list_host(request):
if
keyword
:
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
distinct
()
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
else
:
posts
=
Asset
.
objects
.
all
()
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
filter
(
dept
=
dept
)
.
distinct
()
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
else
:
posts
=
Asset
.
objects
.
all
()
.
filter
(
dept
=
dept
)
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
is_common_user
(
request
):
pass
return
render_to_response
(
'jasset/host_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
host_del
(
request
,
offset
):
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
...
...
@@ -205,6 +209,7 @@ def host_del(request, offset):
return
HttpResponseRedirect
(
'/jasset/host_list/'
)
@require_admin
def
host_edit
(
request
):
actives
=
{
1
:
u'激活'
,
0
:
u'禁用'
}
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
...
...
@@ -271,6 +276,7 @@ def host_edit(request):
return
render_to_response
(
'jasset/host_edit.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_login
def
jlist_ip
(
request
,
offset
):
header_title
,
path1
,
path2
=
u'主机详细信息'
,
u'资产管理'
,
u'主机详情'
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
...
...
@@ -280,6 +286,7 @@ def jlist_ip(request, offset):
return
render_to_response
(
'jasset/jlist_ip.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_super_user
def
add_idc
(
request
):
header_title
,
path1
,
path2
=
u'添加IDC'
,
u'资产管理'
,
u'添加IDC'
if
request
.
method
==
'POST'
:
...
...
@@ -295,6 +302,7 @@ def add_idc(request):
return
render_to_response
(
'jasset/idc_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
list_idc
(
request
):
header_title
,
path1
,
path2
=
u'查看IDC'
,
u'资产管理'
,
u'查看IDC'
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
...
...
@@ -306,6 +314,7 @@ def list_idc(request):
return
render_to_response
(
'jasset/idc_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_super_user
def
edit_idc
(
request
):
header_title
,
path1
,
path2
=
u'编辑IDC'
,
u'资产管理'
,
u'编辑IDC'
edit
=
1
...
...
@@ -334,6 +343,7 @@ def edit_idc(request):
return
render_to_response
(
'jasset/idc_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_super_user
def
del_idc
(
request
,
offset
):
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
...
...
@@ -387,14 +397,14 @@ def list_group(request):
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
if
is_super_user
(
request
):
if
keyword
:
posts
=
BisGroup
.
objects
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
posts
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
else
:
posts
=
BisGroup
.
objects
.
all
(
)
.
order_by
(
'id'
)
posts
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
.
order_by
(
'id'
)
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
BisGroup
.
objects
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
filter
(
dept
=
dept
)
else
:
posts
=
BisGroup
.
objects
.
all
()
.
filter
(
dept
=
dept
)
.
order_by
(
'id'
)
posts
=
BisGroup
.
objects
.
filter
(
dept
=
dept
)
.
order_by
(
'id'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
render_to_response
(
'jasset/group_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
...
@@ -406,14 +416,17 @@ def edit_group(request):
group
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
all
=
Asset
.
objects
.
all
()
dept_id
=
get_user_dept
(
request
)
edept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
eposts
=
contact_list
=
Asset
.
objects
.
filter
(
bis_group
=
group
)
.
order_by
(
'ip'
)
if
is_super_user
(
request
):
edept
=
DEPT
.
objects
.
all
()
posts
=
[
g
for
g
in
all
if
g
not
in
eposts
]
elif
is_group_admin
(
request
):
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
all_dept
=
Asset
.
objects
.
filter
(
dept
=
dept
)
posts
=
[
g
for
g
in
all_dept
if
g
not
in
eposts
]
if
request
.
method
==
'POST'
:
j_group
=
request
.
POST
.
get
(
'j_group'
)
j_hosts
=
request
.
POST
.
getlist
(
'j_hosts'
)
...
...
@@ -430,30 +443,43 @@ def edit_group(request):
return
render_to_response
(
'jasset/group_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
detail_group
(
request
):
header_title
,
path1
,
path2
=
u'主机组详情'
,
u'资产管理'
,
u'主机组详情'
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
dept_id
=
get_user_dept
(
request
)
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
group_id
=
request
.
GET
.
get
(
'id'
)
group_name
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
.
name
b
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
posts
=
Asset
.
objects
.
filter
(
bis_group
=
b
)
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
if
is_super_user
(
request
):
posts
=
Asset
.
objects
.
filter
(
bis_group
=
b
)
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
is_group_admin
(
request
):
posts
=
Asset
.
objects
.
filter
(
bis_group
=
b
)
.
filter
(
dept
=
dept
)
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
render_to_response
(
'jasset/group_detail.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
def
detail_idc
(
request
):
header_title
,
path1
,
path2
=
u'IDC详情'
,
u'资产管理'
,
u'IDC详情'
login_types
=
{
'L'
:
'LDAP'
,
'
S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'
M'
:
'MAP'
}
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
idc_id
=
request
.
GET
.
get
(
'id'
)
idc_name
=
IDC
.
objects
.
get
(
id
=
idc_id
)
.
name
b
=
IDC
.
objects
.
get
(
id
=
idc_id
)
posts
=
Asset
.
objects
.
filter
(
idc
=
b
)
.
order_by
(
'ip'
)
dept_id
=
get_user_dept
(
request
)
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
if
is_super_user
(
request
):
posts
=
Asset
.
objects
.
filter
(
idc
=
b
)
.
order_by
(
'ip'
)
elif
is_group_admin
(
request
):
posts
=
Asset
.
objects
.
filter
(
idc
=
b
)
.
filter
(
dept
=
dept
)
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
render_to_response
(
'jasset/idc_detail.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
group_del_host
(
request
,
offset
):
if
request
.
method
==
'POST'
:
group_name
=
request
.
POST
.
get
(
'group_name'
)
...
...
@@ -475,6 +501,7 @@ def group_del_host(request, offset):
return
HttpResponseRedirect
(
'/jasset/
%
s_detail/?id=
%
s'
%
(
offset
,
group
.
id
))
@require_admin
def
group_del
(
request
,
offset
):
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
...
...
@@ -490,10 +517,17 @@ def group_del(request, offset):
def
host_search
(
request
):
keyword
=
request
.
GET
.
get
(
'keyword'
)
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
distinct
()
.
order_by
(
'ip'
)
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
dept_id
=
get_user_dept
(
request
)
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
if
is_super_user
(
request
):
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
distinct
()
.
order_by
(
'ip'
)
elif
is_group_admin
(
request
):
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
filter
(
dept
=
dept
)
.
distinct
()
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
render_to_response
(
'jasset/host_search.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
...
jlog/models.py
View file @
fef22445
...
...
@@ -5,6 +5,7 @@ class Log(models.Model):
user
=
models
.
CharField
(
max_length
=
20
,
null
=
True
)
host
=
models
.
CharField
(
max_length
=
20
,
null
=
True
)
remote_ip
=
models
.
CharField
(
max_length
=
100
)
dept_name
=
models
.
CharField
(
max_length
=
20
)
log_path
=
models
.
CharField
(
max_length
=
100
)
start_time
=
models
.
DateTimeField
(
null
=
True
)
pid
=
models
.
IntegerField
(
max_length
=
10
)
...
...
jlog/views.py
View file @
fef22445
...
...
@@ -12,6 +12,8 @@ from django.shortcuts import render_to_response
from
connect
import
BASE_DIR
from
jlog.models
import
Log
from
jumpserver.views
import
pages
from
juser.models
import
User
,
DEPT
from
jumpserver.api
import
get_user_dept
,
is_super_user
,
is_group_admin
,
is_common_user
CONF
=
ConfigParser
.
ConfigParser
()
CONF
.
read
(
'
%
s/jumpserver.conf'
%
BASE_DIR
)
...
...
@@ -21,14 +23,30 @@ def log_list_online(request):
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'在线用户'
keyword
=
request
.
GET
.
get
(
'keyword'
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
if
keyword
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
dept_id
=
get_user_dept
(
request
)
dept_name
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
.
name
user_id
=
request
.
session
.
get
(
'user_id'
)
username
=
User
.
objects
.
get
(
id
=
user_id
)
.
username
if
is_super_user
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
0
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
is_common_user
(
request
):
posts
=
Log
.
objects
.
filter
(
is_finished
=
0
)
.
filter
(
user
=
username
)
.
order_by
(
'-start_time'
)
return
render_to_response
(
'jlog/log_online.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
...
@@ -36,14 +54,29 @@ def log_list_offline(request):
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'历史记录'
keyword
=
request
.
GET
.
get
(
'keyword'
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
if
keyword
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
dept_id
=
get_user_dept
(
request
)
dept_name
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
.
name
user_id
=
request
.
session
.
get
(
'user_id'
)
username
=
User
.
objects
.
get
(
id
=
user_id
)
.
username
if
is_super_user
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
1
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
is_common_user
(
request
):
posts
=
Log
.
objects
.
filter
(
is_finished
=
1
)
.
filter
(
user
=
username
)
.
order_by
(
'-start_time'
)
return
render_to_response
(
'jlog/log_offline.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
...
@@ -70,13 +103,23 @@ def log_history(request):
def
log_search
(
request
):
keyword
=
request
.
GET
.
get
(
'keyword'
)
env
=
request
.
GET
.
get
(
'env'
)
if
env
==
'online'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
env
==
'offline'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
dept_id
=
get_user_dept
(
request
)
dept_name
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
.
name
if
is_super_user
(
request
):
if
env
==
'online'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
elif
env
==
'offline'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
elif
is_group_admin
(
request
):
if
env
==
'online'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
elif
env
==
'offline'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
render_to_response
(
'jlog/log_search.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
jumpserver/api.py
View file @
fef22445
...
...
@@ -94,6 +94,13 @@ def is_group_admin(request):
return
False
def
is_common_user
(
request
):
if
request
.
session
.
get
(
'role_id'
)
==
0
:
return
True
else
:
return
False
def
get_user_dept
(
request
):
user_id
=
request
.
session
.
get
(
'user_id'
)
if
user_id
:
...
...
jumpserver/context_processors.py
View file @
fef22445
from
juser.models
import
User
from
jasset.models
import
Asset
def
name_proc
(
request
):
...
...
@@ -6,8 +7,11 @@ def name_proc(request):
role_id
=
request
.
session
.
get
(
'role_id'
)
user_total_num
=
User
.
objects
.
all
()
.
count
()
user_active_num
=
User
.
objects
.
filter
(
is_active
=
True
)
.
count
()
host_total_num
=
Asset
.
objects
.
all
()
.
count
()
host_active_num
=
Asset
.
objects
.
filter
(
is_active
=
True
)
.
count
()
request
.
session
.
set_expiry
(
3600
)
return
{
'session_user_id'
:
user_id
,
'session_role_id'
:
role_id
,
'user_total_num'
:
user_total_num
,
'user_active_num'
:
user_active_num
}
'user_total_num'
:
user_total_num
,
'user_active_num'
:
user_active_num
,
'host_total_num'
:
host_total_num
,
'host_active_num'
:
host_active_num
}
jumpserver/templatetags/mytags.py
View file @
fef22445
...
...
@@ -159,22 +159,6 @@ def string_length(string, length):
return
'
%
s ...'
%
string
[
0
:
length
]
@register.filter
(
name
=
'filter_private'
)
def
filter_private
(
group
):
agroup
=
[]
pattern
=
re
.
compile
(
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
)
p
=
BisGroup
.
objects
.
get
(
name
=
'ALL'
)
for
g
in
group
:
if
not
pattern
.
match
(
g
.
name
):
agroup
.
append
(
g
)
try
:
agroup
.
remove
(
p
)
except
ValueError
:
pass
return
agroup
@register.filter
(
name
=
'to_name'
)
def
to_name
(
user_id
):
try
:
...
...
static/css/plugins/fullcalendar/fullcalendar.css
0 → 100755
View file @
fef22445
/*!
* FullCalendar v2.2.0 Stylesheet
* Docs & License: http://arshaw.com/fullcalendar/
* (c) 2013 Adam Shaw
*/
.fc
{
direction
:
ltr
;
text-align
:
left
;
}
.fc-rtl
{
text-align
:
right
;
}
body
.fc
{
/* extra precedence to overcome jqui */
font-size
:
1em
;
}
/* Colors
--------------------------------------------------------------------------------------------------*/
.fc-unthemed
th
,
.fc-unthemed
td
,
.fc-unthemed
hr
,
.fc-unthemed
thead
,
.fc-unthemed
tbody
,
.fc-unthemed
.fc-row
,
.fc-unthemed
.fc-popover
{
border-color
:
#ddd
;
}
.fc-unthemed
.fc-popover
{
background-color
:
#fff
;
}
.fc-unthemed
hr
,
.fc-unthemed
.fc-popover
.fc-header
{
background
:
#eee
;
}
.fc-unthemed
.fc-popover
.fc-header
.fc-close
{
color
:
#666
;
}
.fc-unthemed
.fc-today
{
background
:
#fcf8e3
;
}
.fc-highlight
{
/* when user is selecting cells */
background
:
#bce8f1
;
opacity
:
.3
;
filter
:
alpha
(
opacity
=
30
);
/* for IE */
}
.fc-bgevent
{
/* default look for background events */
background
:
rgb
(
143
,
223
,
130
);
opacity
:
.3
;
filter
:
alpha
(
opacity
=
30
);
/* for IE */
}
.fc-nonbusiness
{
/* default look for non-business-hours areas */
/* will inherit .fc-bgevent's styles */
background
:
#ccc
;
}
/* Icons (inline elements with styled text that mock arrow icons)
--------------------------------------------------------------------------------------------------*/
.fc-icon
{
display
:
inline-block
;
font-size
:
2em
;
line-height
:
.5em
;
height
:
.5em
;
/* will make the total height 1em */
font-family
:
"Courier New"
,
Courier
,
monospace
;
}
.fc-icon-left-single-arrow
:after
{
content
:
"\02039"
;
font-weight
:
bold
;
}
.fc-icon-right-single-arrow
:after
{
content
:
"\0203A"
;
font-weight
:
bold
;
}
.fc-icon-left-double-arrow
:after
{
content
:
"\000AB"
;
}
.fc-icon-right-double-arrow
:after
{
content
:
"\000BB"
;
}
.fc-icon-x
:after
{
content
:
"\000D7"
;
}
/* Buttons (styled <button> tags, normalized to work cross-browser)
--------------------------------------------------------------------------------------------------*/
.fc
button
{
/* force height to include the border and padding */
-moz-box-sizing
:
border-box
;
-webkit-box-sizing
:
border-box
;
box-sizing
:
border-box
;
/* dimensions */
margin
:
0
;
height
:
2.1em
;
padding
:
0
.6em
;
/* text & cursor */
font-size
:
1em
;
/* normalize */
white-space
:
nowrap
;
cursor
:
pointer
;
}
/* Firefox has an annoying inner border */
.fc
button
::-moz-focus-inner
{
margin
:
0
;
padding
:
0
;
}
.fc-state-default
{
/* non-theme */
border
:
1px
solid
;
}
.fc-state-default.fc-corner-left
{
/* non-theme */
border-top-left-radius
:
4px
;
border-bottom-left-radius
:
4px
;
}
.fc-state-default.fc-corner-right
{
/* non-theme */
border-top-right-radius
:
4px
;
border-bottom-right-radius
:
4px
;
}
/* icons in buttons */
.fc
button
.fc-icon
{
/* non-theme */
position
:
relative
;
top
:
.05em
;
/* seems to be a good adjustment across browsers */
margin
:
0
.1em
;
}
/*
button states
borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)
*/
.fc-state-default
{
background-color
:
#f5f5f5
;
background-image
:
-moz-linear-gradient
(
top
,
#ffffff
,
#e6e6e6
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#ffffff
),
to
(
#e6e6e6
));
background-image
:
-webkit-linear-gradient
(
top
,
#ffffff
,
#e6e6e6
);
background-image
:
-o-linear-gradient
(
top
,
#ffffff
,
#e6e6e6
);
background-image
:
linear-gradient
(
to
bottom
,
#ffffff
,
#e6e6e6
);
background-repeat
:
repeat-x
;
border-color
:
#e6e6e6
#e6e6e6
#bfbfbf
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
color
:
#333
;
text-shadow
:
0
1px
1px
rgba
(
255
,
255
,
255
,
0.75
);
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
}
.fc-state-hover
,
.fc-state-down
,
.fc-state-active
,
.fc-state-disabled
{
color
:
#333333
;
background-color
:
#e6e6e6
;
}
.fc-state-hover
{
color
:
#333333
;
text-decoration
:
none
;
background-position
:
0
-15px
;
-webkit-transition
:
background-position
0.1s
linear
;
-moz-transition
:
background-position
0.1s
linear
;
-o-transition
:
background-position
0.1s
linear
;
transition
:
background-position
0.1s
linear
;
}
.fc-state-down
,
.fc-state-active
{
background-color
:
#cccccc
;
background-image
:
none
;
box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
}
.fc-state-disabled
{
cursor
:
default
;
background-image
:
none
;
opacity
:
0.65
;
filter
:
alpha
(
opacity
=
65
);
box-shadow
:
none
;
}
/* Buttons Groups
--------------------------------------------------------------------------------------------------*/
.fc-button-group
{
display
:
inline-block
;
}
/*
every button that is not first in a button group should scootch over one pixel and cover the
previous button's border...
*/
.fc
.fc-button-group
>
*
{
/* extra precedence b/c buttons have margin set to zero */
float
:
left
;
margin
:
0
0
0
-1px
;
}
.fc
.fc-button-group
>
:first-child
{
/* same */
margin-left
:
0
;
}
/* Popover
--------------------------------------------------------------------------------------------------*/
.fc-popover
{
position
:
absolute
;
box-shadow
:
0
2px
6px
rgba
(
0
,
0
,
0
,
.15
);
}
.fc-popover
.fc-header
{
padding
:
2px
4px
;
}
.fc-popover
.fc-header
.fc-title
{
margin
:
0
2px
;
}
.fc-popover
.fc-header
.fc-close
{
cursor
:
pointer
;
}
.fc-ltr
.fc-popover
.fc-header
.fc-title
,
.fc-rtl
.fc-popover
.fc-header
.fc-close
{
float
:
left
;
}
.fc-rtl
.fc-popover
.fc-header
.fc-title
,
.fc-ltr
.fc-popover
.fc-header
.fc-close
{
float
:
right
;
}
/* unthemed */
.fc-unthemed
.fc-popover
{
border-width
:
1px
;
border-style
:
solid
;
}
.fc-unthemed
.fc-popover
.fc-header
.fc-close
{
font-size
:
25px
;
margin-top
:
4px
;
}
/* jqui themed */
.fc-popover
>
.ui-widget-header
+
.ui-widget-content
{
border-top
:
0
;
/* where they meet, let the header have the border */
}
/* Misc Reusable Components
--------------------------------------------------------------------------------------------------*/
.fc
hr
{
height
:
0
;
margin
:
0
;
padding
:
0
0
2px
;
/* height is unreliable across browsers, so use padding */
border-style
:
solid
;
border-width
:
1px
0
;
}
.fc-clear
{
clear
:
both
;
}
.fc-bg
,
.fc-bgevent-skeleton
,
.fc-highlight-skeleton
,
.fc-helper-skeleton
{
/* these element should always cling to top-left/right corners */
position
:
absolute
;
top
:
0
;
left
:
0
;
right
:
0
;
}
.fc-bg
{
bottom
:
0
;
/* strech bg to bottom edge */
}
.fc-bg
table
{
height
:
100%
;
/* strech bg to bottom edge */
}
/* Tables
--------------------------------------------------------------------------------------------------*/
.fc
table
{
width
:
100%
;
table-layout
:
fixed
;
border-collapse
:
collapse
;
border-spacing
:
0
;
font-size
:
1em
;
/* normalize cross-browser */
}
.fc
th
{
text-align
:
center
;
}
.fc
th
,
.fc
td
{
border-style
:
solid
;
border-width
:
1px
;
padding
:
0
;
vertical-align
:
top
;
}
.fc
td
.fc-today
{
border-style
:
double
;
/* overcome neighboring borders */
}
/* Fake Table Rows
--------------------------------------------------------------------------------------------------*/
.fc
.fc-row
{
/* extra precedence to overcome themes w/ .ui-widget-content forcing a 1px border */
/* no visible border by default. but make available if need be (scrollbar width compensation) */
border-style
:
solid
;
border-width
:
0
;
}
.fc-row
table
{
/* don't put left/right border on anything within a fake row.
the outer tbody will worry about this */
border-left
:
0
hidden
transparent
;
border-right
:
0
hidden
transparent
;
/* no bottom borders on rows */
border-bottom
:
0
hidden
transparent
;
}
.fc-row
:first-child
table
{
border-top
:
0
hidden
transparent
;
/* no top border on first row */
}
/* Day Row (used within the header and the DayGrid)
--------------------------------------------------------------------------------------------------*/
.fc-row
{
position
:
relative
;
}
.fc-row
.fc-bg
{
z-index
:
1
;
}
/* highlighting cells & background event skeleton */
.fc-row
.fc-bgevent-skeleton
,
.fc-row
.fc-highlight-skeleton
{
bottom
:
0
;
/* stretch skeleton to bottom of row */
}
.fc-row
.fc-bgevent-skeleton
table
,
.fc-row
.fc-highlight-skeleton
table
{
height
:
100%
;
/* stretch skeleton to bottom of row */
}
.fc-row
.fc-highlight-skeleton
td
,
.fc-row
.fc-bgevent-skeleton
td
{
border-color
:
transparent
;
}
.fc-row
.fc-bgevent-skeleton
{
z-index
:
2
;
}
.fc-row
.fc-highlight-skeleton
{
z-index
:
3
;
}
/*
row content (which contains day/week numbers and events) as well as "helper" (which contains
temporary rendered events).
*/
.fc-row
.fc-content-skeleton
{
position
:
relative
;
z-index
:
4
;
padding-bottom
:
2px
;
/* matches the space above the events */
}
.fc-row
.fc-helper-skeleton
{
z-index
:
5
;
}
.fc-row
.fc-content-skeleton
td
,
.fc-row
.fc-helper-skeleton
td
{
/* see-through to the background below */
background
:
none
;
/* in case <td>s are globally styled */
border-color
:
transparent
;
/* don't put a border between events and/or the day number */
border-bottom
:
0
;
}
.fc-row
.fc-content-skeleton
tbody
td
,
/* cells with events inside (so NOT the day number cell) */
.fc-row
.fc-helper-skeleton
tbody
td
{
/* don't put a border between event cells */
border-top
:
0
;
}
/* Scrolling Container
--------------------------------------------------------------------------------------------------*/
.fc-scroller
{
/* this class goes on elements for guaranteed vertical scrollbars */
overflow-y
:
scroll
;
overflow-x
:
hidden
;
}
.fc-scroller
>
*
{
/* we expect an immediate inner element */
position
:
relative
;
/* re-scope all positions */
width
:
100%
;
/* hack to force re-sizing this inner element when scrollbars appear/disappear */
overflow
:
hidden
;
/* don't let negative margins or absolute positioning create further scroll */
}
/* Global Event Styles
--------------------------------------------------------------------------------------------------*/
.fc-event
{
position
:
relative
;
/* for resize handle and other inner positioning */
display
:
block
;
/* make the <a> tag block */
font-size
:
.85em
;
line-height
:
1.3
;
border-radius
:
3px
;
border
:
1px
solid
#3a87ad
;
/* default BORDER color */
background-color
:
#3a87ad
;
/* default BACKGROUND color */
font-weight
:
normal
;
/* undo jqui's ui-widget-header bold */
}
/* overpower some of bootstrap's and jqui's styles on <a> tags */
.fc-event
,
.fc-event
:hover
,
.ui-widget
.fc-event
{
color
:
#fff
;
/* default TEXT color */
text-decoration
:
none
;
/* if <a> has an href */
}
.fc-event
[
href
],
.fc-event.fc-draggable
{
cursor
:
pointer
;
/* give events with links and draggable events a hand mouse pointer */
}
.fc-not-allowed
,
/* causes a "warning" cursor. applied on body */
.fc-not-allowed
.fc-event
{
/* to override an event's custom cursor */
cursor
:
not-allowed
;
}
/* DayGrid events
----------------------------------------------------------------------------------------------------
We use the full "fc-day-grid-event" class instead of using descendants because the event won't
be a descendant of the grid when it is being dragged.
*/
.fc-day-grid-event
{
margin
:
1px
2px
0
;
/* spacing between events and edges */
padding
:
0
1px
;
}
/* events that are continuing to/from another week. kill rounded corners and butt up against edge */
.fc-ltr
.fc-day-grid-event.fc-not-start
,
.fc-rtl
.fc-day-grid-event.fc-not-end
{
margin-left
:
0
;
border-left-width
:
0
;
padding-left
:
1px
;
/* replace the border with padding */
border-top-left-radius
:
0
;
border-bottom-left-radius
:
0
;
}
.fc-ltr
.fc-day-grid-event.fc-not-end
,
.fc-rtl
.fc-day-grid-event.fc-not-start
{
margin-right
:
0
;
border-right-width
:
0
;
padding-right
:
1px
;
/* replace the border with padding */
border-top-right-radius
:
0
;
border-bottom-right-radius
:
0
;
}
.fc-day-grid-event
>
.fc-content
{
/* force events to be one-line tall */
white-space
:
nowrap
;
overflow
:
hidden
;
}
.fc-day-grid-event
.fc-time
{
font-weight
:
bold
;
}
/* resize handle (outside of fc-content, so can go outside of bounds) */
.fc-day-grid-event
.fc-resizer
{
position
:
absolute
;
top
:
0
;
bottom
:
0
;
width
:
7px
;
}
.fc-ltr
.fc-day-grid-event
.fc-resizer
{
right
:
-3px
;
cursor
:
e-resize
;
}
.fc-rtl
.fc-day-grid-event
.fc-resizer
{
left
:
-3px
;
cursor
:
w-resize
;
}
/* Event Limiting
--------------------------------------------------------------------------------------------------*/
/* "more" link that represents hidden events */
a
.fc-more
{
margin
:
1px
3px
;
font-size
:
.85em
;
cursor
:
pointer
;
text-decoration
:
none
;
}
a
.fc-more
:hover
{
text-decoration
:
underline
;
}
.fc-limited
{
/* rows and cells that are hidden because of a "more" link */
display
:
none
;
}
/* popover that appears when "more" link is clicked */
.fc-day-grid
.fc-row
{
z-index
:
1
;
/* make the "more" popover one higher than this */
}
.fc-more-popover
{
z-index
:
2
;
width
:
220px
;
}
.fc-more-popover
.fc-event-container
{
padding
:
10px
;
}
/* Toolbar
--------------------------------------------------------------------------------------------------*/
.fc-toolbar
{
text-align
:
center
;
margin-bottom
:
1em
;
}
.fc-toolbar
.fc-left
{
float
:
left
;
}
.fc-toolbar
.fc-right
{
float
:
right
;
}
.fc-toolbar
.fc-center
{
display
:
inline-block
;
}
/* the things within each left/right/center section */
.fc
.fc-toolbar
>
*
>
*
{
/* extra precedence to override button border margins */
float
:
left
;
margin-left
:
.75em
;
}
/* the first thing within each left/center/right section */
.fc
.fc-toolbar
>
*
>
:first-child
{
/* extra precedence to override button border margins */
margin-left
:
0
;
}
/* title text */
.fc-toolbar
h2
{
margin
:
0
;
}
/* button layering (for border precedence) */
.fc-toolbar
button
{
position
:
relative
;
}
.fc-toolbar
.fc-state-hover
,
.fc-toolbar
.ui-state-hover
{
z-index
:
2
;
}
.fc-toolbar
.fc-state-down
{
z-index
:
3
;
}
.fc-toolbar
.fc-state-active
,
.fc-toolbar
.ui-state-active
{
z-index
:
4
;
}
.fc-toolbar
button
:focus
{
z-index
:
5
;
}
/* View Structure
--------------------------------------------------------------------------------------------------*/
/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
.fc-view-container
*,
.fc-view-container
*
:before
,
.fc-view-container
*
:after
{
-webkit-box-sizing
:
content-box
;
-moz-box-sizing
:
content-box
;
box-sizing
:
content-box
;
}
.fc-view
,
/* scope positioning and z-index's for everything within the view */
.fc-view
>
table
{
/* so dragged elements can be above the view's main element */
position
:
relative
;
z-index
:
1
;
}
/* BasicView
--------------------------------------------------------------------------------------------------*/
/* day row structure */
.fc-basicWeek-view
.fc-content-skeleton
,
.fc-basicDay-view
.fc-content-skeleton
{
/* we are sure there are no day numbers in these views, so... */
padding-top
:
1px
;
/* add a pixel to make sure there are 2px padding above events */
padding-bottom
:
1em
;
/* ensure a space at bottom of cell for user selecting/clicking */
}
.fc-basic-view
tbody
.fc-row
{
min-height
:
4em
;
/* ensure that all rows are at least this tall */
}
/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */
.fc-row.fc-rigid
{
overflow
:
hidden
;
}
.fc-row.fc-rigid
.fc-content-skeleton
{
position
:
absolute
;
top
:
0
;
left
:
0
;
right
:
0
;
}
/* week and day number styling */
.fc-basic-view
.fc-week-number
,
.fc-basic-view
.fc-day-number
{
padding
:
0
2px
;
}
.fc-basic-view
td
.fc-week-number
span
,
.fc-basic-view
td
.fc-day-number
{
padding-top
:
2px
;
padding-bottom
:
2px
;
}
.fc-basic-view
.fc-week-number
{
text-align
:
center
;
}
.fc-basic-view
.fc-week-number
span
{
/* work around the way we do column resizing and ensure a minimum width */
display
:
inline-block
;
min-width
:
1.25em
;
}
.fc-ltr
.fc-basic-view
.fc-day-number
{
text-align
:
right
;
}
.fc-rtl
.fc-basic-view
.fc-day-number
{
text-align
:
left
;
}
.fc-day-number.fc-other-month
{
opacity
:
0.3
;
filter
:
alpha
(
opacity
=
30
);
/* for IE */
/* opacity with small font can sometimes look too faded
might want to set the 'color' property instead
making day-numbers bold also fixes the problem */
}
/* AgendaView all-day area
--------------------------------------------------------------------------------------------------*/
.fc-agenda-view
.fc-day-grid
{
position
:
relative
;
z-index
:
2
;
/* so the "more.." popover will be over the time grid */
}
.fc-agenda-view
.fc-day-grid
.fc-row
{
min-height
:
3em
;
/* all-day section will never get shorter than this */
}
.fc-agenda-view
.fc-day-grid
.fc-row
.fc-content-skeleton
{
padding-top
:
1px
;
/* add a pixel to make sure there are 2px padding above events */
padding-bottom
:
1em
;
/* give space underneath events for clicking/selecting days */
}
/* TimeGrid axis running down the side (for both the all-day area and the slot area)
--------------------------------------------------------------------------------------------------*/
.fc
.fc-axis
{
/* .fc to overcome default cell styles */
vertical-align
:
middle
;
padding
:
0
4px
;
white-space
:
nowrap
;
}
.fc-ltr
.fc-axis
{
text-align
:
right
;
}
.fc-rtl
.fc-axis
{
text-align
:
left
;
}
.ui-widget
td
.fc-axis
{
font-weight
:
normal
;
/* overcome jqui theme making it bold */
}
/* TimeGrid Structure
--------------------------------------------------------------------------------------------------*/
.fc-time-grid-container
,
/* so scroll container's z-index is below all-day */
.fc-time-grid
{
/* so slats/bg/content/etc positions get scoped within here */
position
:
relative
;
z-index
:
1
;
}
.fc-time-grid
{
min-height
:
100%
;
/* so if height setting is 'auto', .fc-bg stretches to fill height */
}
.fc-time-grid
table
{
/* don't put outer borders on slats/bg/content/etc */
border
:
0
hidden
transparent
;
}
.fc-time-grid
>
.fc-bg
{
z-index
:
1
;
}
.fc-time-grid
.fc-slats
,
.fc-time-grid
>
hr
{
/* the <hr> AgendaView injects when grid is shorter than scroller */
position
:
relative
;
z-index
:
2
;
}
.fc-time-grid
.fc-bgevent-skeleton
,
.fc-time-grid
.fc-content-skeleton
{
position
:
absolute
;
top
:
0
;
left
:
0
;
right
:
0
;
}
.fc-time-grid
.fc-bgevent-skeleton
{
z-index
:
3
;
}
.fc-time-grid
.fc-highlight-skeleton
{
z-index
:
4
;
}
.fc-time-grid
.fc-content-skeleton
{
z-index
:
5
;
}
.fc-time-grid
.fc-helper-skeleton
{
z-index
:
6
;
}
/* TimeGrid Slats (lines that run horizontally)
--------------------------------------------------------------------------------------------------*/
.fc-slats
td
{
height
:
1.5em
;
border-bottom
:
0
;
/* each cell is responsible for its top border */
}
.fc-slats
.fc-minor
td
{
border-top-style
:
dotted
;
}
.fc-slats
.ui-widget-content
{
/* for jqui theme */
background
:
none
;
/* see through to fc-bg */
}
/* TimeGrid Highlighting Slots
--------------------------------------------------------------------------------------------------*/
.fc-time-grid
.fc-highlight-container
{
/* a div within a cell within the fc-highlight-skeleton */
position
:
relative
;
/* scopes the left/right of the fc-highlight to be in the column */
}
.fc-time-grid
.fc-highlight
{
position
:
absolute
;
left
:
0
;
right
:
0
;
/* top and bottom will be in by JS */
}
/* TimeGrid Event Containment
--------------------------------------------------------------------------------------------------*/
.fc-time-grid
.fc-event-container
,
/* a div within a cell within the fc-content-skeleton */
.fc-time-grid
.fc-bgevent-container
{
/* a div within a cell within the fc-bgevent-skeleton */
position
:
relative
;
}
.fc-ltr
.fc-time-grid
.fc-event-container
{
/* space on the sides of events for LTR (default) */
margin
:
0
2.5%
0
2px
;
}
.fc-rtl
.fc-time-grid
.fc-event-container
{
/* space on the sides of events for RTL */
margin
:
0
2px
0
2.5%
;
}
.fc-time-grid
.fc-event
,
.fc-time-grid
.fc-bgevent
{
position
:
absolute
;
z-index
:
1
;
/* scope inner z-index's */
}
.fc-time-grid
.fc-bgevent
{
/* background events always span full width */
left
:
0
;
right
:
0
;
}
/* TimeGrid Event Styling
----------------------------------------------------------------------------------------------------
We use the full "fc-time-grid-event" class instead of using descendants because the event won't
be a descendant of the grid when it is being dragged.
*/
.fc-time-grid-event.fc-not-start
{
/* events that are continuing from another day */
/* replace space made by the top border with padding */
border-top-width
:
0
;
padding-top
:
1px
;
/* remove top rounded corners */
border-top-left-radius
:
0
;
border-top-right-radius
:
0
;
}
.fc-time-grid-event.fc-not-end
{
/* replace space made by the top border with padding */
border-bottom-width
:
0
;
padding-bottom
:
1px
;
/* remove bottom rounded corners */
border-bottom-left-radius
:
0
;
border-bottom-right-radius
:
0
;
}
.fc-time-grid-event
{
overflow
:
hidden
;
/* don't let the bg flow over rounded corners */
}
.fc-time-grid-event
>
.fc-content
{
/* contains the time and title, but no bg and resizer */
position
:
relative
;
z-index
:
2
;
/* above the bg */
}
.fc-time-grid-event
.fc-time
,
.fc-time-grid-event
.fc-title
{
padding
:
0
1px
;
}
.fc-time-grid-event
.fc-time
{
font-size
:
.85em
;
white-space
:
nowrap
;
}
.fc-time-grid-event
.fc-bg
{
z-index
:
1
;
background
:
#fff
;
opacity
:
.25
;
filter
:
alpha
(
opacity
=
25
);
/* for IE */
}
/* short mode, where time and title are on the same line */
.fc-time-grid-event.fc-short
.fc-content
{
/* don't wrap to second line (now that contents will be inline) */
white-space
:
nowrap
;
}
.fc-time-grid-event.fc-short
.fc-time
,
.fc-time-grid-event.fc-short
.fc-title
{
/* put the time and title on the same line */
display
:
inline-block
;
vertical-align
:
top
;
}
.fc-time-grid-event.fc-short
.fc-time
span
{
display
:
none
;
/* don't display the full time text... */
}
.fc-time-grid-event.fc-short
.fc-time
:before
{
content
:
attr
(
data-start
);
/* ...instead, display only the start time */
}
.fc-time-grid-event.fc-short
.fc-time
:after
{
content
:
"\000A0-\000A0"
;
/* seperate with a dash, wrapped in nbsp's */
}
.fc-time-grid-event.fc-short
.fc-title
{
font-size
:
.85em
;
/* make the title text the same size as the time */
padding
:
0
;
/* undo padding from above */
}
/* resizer */
.fc-time-grid-event
.fc-resizer
{
position
:
absolute
;
z-index
:
3
;
/* above content */
left
:
0
;
right
:
0
;
bottom
:
0
;
height
:
8px
;
overflow
:
hidden
;
line-height
:
8px
;
font-size
:
11px
;
font-family
:
monospace
;
text-align
:
center
;
cursor
:
s-resize
;
}
.fc-time-grid-event
.fc-resizer
:after
{
content
:
"="
;
}
static/css/plugins/fullcalendar/fullcalendar.print.css
0 → 100755
View file @
fef22445
/*!
* FullCalendar v2.2.0 Print Stylesheet
* Docs & License: http://arshaw.com/fullcalendar/
* (c) 2013 Adam Shaw
*/
/*
* Include this stylesheet on your page to get a more printer-friendly calendar.
* When including this stylesheet, use the media='print' attribute of the <link> tag.
* Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
*/
.fc
{
max-width
:
100%
!important
;
}
/* Global Event Restyling
--------------------------------------------------------------------------------------------------*/
.fc-event
{
background
:
#fff
!important
;
color
:
#000
!important
;
page-break-inside
:
avoid
;
}
.fc-event
.fc-resizer
{
display
:
none
;
}
/* Table & Day-Row Restyling
--------------------------------------------------------------------------------------------------*/
th
,
td
,
hr
,
thead
,
tbody
,
.fc-row
{
border-color
:
#ccc
!important
;
background
:
#fff
!important
;
}
/* kill the overlaid, absolutely-positioned common components */
.fc-bg
,
.fc-bgevent-skeleton
,
.fc-highlight-skeleton
,
.fc-helper-skeleton
{
display
:
none
;
}
/* don't force a min-height on rows (for DayGrid) */
.fc
tbody
.fc-row
{
height
:
auto
!important
;
/* undo height that JS set in distributeHeight */
min-height
:
0
!important
;
/* undo the min-height from each view's specific stylesheet */
}
.fc
tbody
.fc-row
.fc-content-skeleton
{
position
:
static
;
/* undo .fc-rigid */
padding-bottom
:
0
!important
;
/* use a more border-friendly method for this... */
}
.fc
tbody
.fc-row
.fc-content-skeleton
tbody
tr
:last-child
td
{
/* only works in newer browsers */
padding-bottom
:
1em
;
/* ...gives space within the skeleton. also ensures min height in a way */
}
.fc
tbody
.fc-row
.fc-content-skeleton
table
{
/* provides a min-height for the row, but only effective for IE, which exaggerates this value,
making it look more like 3em. for other browers, it will already be this tall */
height
:
1em
;
}
/* Undo month-view event limiting. Display all events and hide the "more" links
--------------------------------------------------------------------------------------------------*/
.fc-more-cell
,
.fc-more
{
display
:
none
!important
;
}
.fc
tr
.fc-limited
{
display
:
table-row
!important
;
}
.fc
td
.fc-limited
{
display
:
table-cell
!important
;
}
.fc-popover
{
display
:
none
;
/* never display the "more.." popover in print mode */
}
/* TimeGrid Restyling
--------------------------------------------------------------------------------------------------*/
/* undo the min-height 100% trick used to fill the container's height */
.fc-time-grid
{
min-height
:
0
!important
;
}
/* don't display the side axis at all ("all-day" and time cells) */
.fc-agenda-view
.fc-axis
{
display
:
none
;
}
/* don't display the horizontal lines */
.fc-slats
,
.fc-time-grid
hr
{
/* this hr is used when height is underused and needs to be filled */
display
:
none
!important
;
/* important overrides inline declaration */
}
/* let the container that holds the events be naturally positioned and create real height */
.fc-time-grid
.fc-content-skeleton
{
position
:
static
;
}
/* in case there are no events, we still want some height */
.fc-time-grid
.fc-content-skeleton
table
{
height
:
4em
;
}
/* kill the horizontal spacing made by the event container. event margins will be done below */
.fc-time-grid
.fc-event-container
{
margin
:
0
!important
;
}
/* TimeGrid *Event* Restyling
--------------------------------------------------------------------------------------------------*/
/* naturally position events, vertically stacking them */
.fc-time-grid
.fc-event
{
position
:
static
!important
;
margin
:
3px
2px
!important
;
}
/* for events that continue to a future day, give the bottom border back */
.fc-time-grid
.fc-event.fc-not-end
{
border-bottom-width
:
1px
!important
;
}
/* indicate the event continues via "..." text */
.fc-time-grid
.fc-event.fc-not-end
:after
{
content
:
"..."
;
}
/* for events that are continuations from previous days, give the top border back */
.fc-time-grid
.fc-event.fc-not-start
{
border-top-width
:
1px
!important
;
}
/* indicate the event is a continuation via "..." text */
.fc-time-grid
.fc-event.fc-not-start
:before
{
content
:
"..."
;
}
/* time */
/* undo a previous declaration and let the time text span to a second line */
.fc-time-grid
.fc-event
.fc-time
{
white-space
:
normal
!important
;
}
/* hide the the time that is normally displayed... */
.fc-time-grid
.fc-event
.fc-time
span
{
display
:
none
;
}
/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
.fc-time-grid
.fc-event
.fc-time
:after
{
content
:
attr
(
data-full
);
}
/* Vertical Scroller & Containers
--------------------------------------------------------------------------------------------------*/
/* kill the scrollbars and allow natural height */
.fc-scroller
,
.fc-day-grid-container
,
/* these divs might be assigned height, which we need to cleared */
.fc-time-grid-container
{
/* */
overflow
:
visible
!important
;
height
:
auto
!important
;
}
/* kill the horizontal border/padding used to compensate for scrollbars */
.fc-row
{
border
:
0
!important
;
margin
:
0
!important
;
}
/* Button Controls
--------------------------------------------------------------------------------------------------*/
.fc-button-group
,
.fc
button
{
display
:
none
;
/* don't display any button-related controls */
}
static/js/plugins/fullcalendar/fullcalendar.min.js
0 → 100755
View file @
fef22445
/*!
* FullCalendar v2.2.0
* Docs & License: http://arshaw.com/fullcalendar/
* (c) 2013 Adam Shaw
*/
(
function
(
t
){
"function"
==
typeof
define
&&
define
.
amd
?
define
([
"jquery"
,
"moment"
],
t
):
t
(
jQuery
,
moment
)})(
function
(
t
,
e
){
function
n
(
t
,
e
){
return
e
.
longDateFormat
(
"LT"
).
replace
(
":mm"
,
"(:mm)"
).
replace
(
/
(\W
mm
)
$/
,
"($1)"
).
replace
(
/
\s
*a$/i
,
"t"
)}
function
i
(
t
,
e
){
var
n
=
e
.
longDateFormat
(
"L"
);
return
n
=
n
.
replace
(
/^Y+
[^\w\s]
*|
[^\w\s]
*Y+$/g
,
""
),
t
.
isRTL
?
n
+=
" ddd"
:
n
=
"ddd "
+
n
,
n
}
function
r
(
t
){
s
(
Fe
,
t
)}
function
s
(
e
){
function
n
(
n
,
i
){
t
.
isPlainObject
(
i
)
&&
t
.
isPlainObject
(
e
[
n
])
&&!
o
(
n
)?
e
[
n
]
=
s
({},
e
[
n
],
i
):
void
0
!==
i
&&
(
e
[
n
]
=
i
)}
for
(
var
i
=
1
;
arguments
.
length
>
i
;
i
++
)
t
.
each
(
arguments
[
i
],
n
);
return
e
}
function
o
(
t
){
return
/
(
Time|Duration
)
$/
.
test
(
t
)}
function
l
(
n
,
i
){
function
r
(
t
){
var
n
=
e
.
localeData
||
e
.
langData
;
return
n
.
call
(
e
,
t
)
||
n
.
call
(
e
,
"en"
)}
function
o
(
t
){
ne
?
u
()
&&
(
p
(),
f
(
t
)):
l
()}
function
l
(){
ie
=
K
.
theme
?
"ui"
:
"fc"
,
n
.
addClass
(
"fc"
),
K
.
isRTL
?
n
.
addClass
(
"fc-rtl"
):
n
.
addClass
(
"fc-ltr"
),
K
.
theme
?
n
.
addClass
(
"ui-widget"
):
n
.
addClass
(
"fc-unthemed"
),
ne
=
t
(
"<div class='fc-view-container'/>"
).
prependTo
(
n
),
te
=
new
a
(
q
,
K
),
ee
=
te
.
render
(),
ee
&&
n
.
prepend
(
ee
),
h
(
K
.
defaultView
),
K
.
handleWindowResize
&&
(
oe
=
_
(
v
,
K
.
windowResizeDelay
),
t
(
window
).
resize
(
oe
))}
function
d
(){
re
&&
re
.
destroy
(),
te
.
destroy
(),
ne
.
remove
(),
n
.
removeClass
(
"fc fc-ltr fc-rtl fc-unthemed ui-widget"
),
t
(
window
).
unbind
(
"resize"
,
oe
)}
function
u
(){
return
n
.
is
(
":visible"
)}
function
h
(
t
){
f
(
0
,
t
)}
function
f
(
e
,
n
){
ue
++
,
re
&&
n
&&
re
.
name
!==
n
&&
(
te
.
deactivateButton
(
re
.
name
),
B
(),
re
.
start
&&
re
.
destroy
(),
re
.
el
.
remove
(),
re
=
null
),
!
re
&&
n
&&
(
re
=
new
Ge
[
n
](
q
),
re
.
el
=
t
(
"<div class='fc-view fc-"
+
n
+
"-view' />"
).
appendTo
(
ne
),
te
.
activateButton
(
n
)),
re
&&
(
e
&&
(
le
=
re
.
incrementDate
(
le
,
e
)),
re
.
start
&&!
e
&&
le
.
isWithin
(
re
.
intervalStart
,
re
.
intervalEnd
)
||
u
()
&&
(
B
(),
re
.
start
&&
re
.
destroy
(),
re
.
render
(
le
),
I
(),
C
(),
H
(),
b
())),
I
(),
ue
--
}
function
g
(
t
){
return
u
()?(
t
&&
m
(),
ue
++
,
re
.
updateSize
(
!
0
),
ue
--
,
!
0
):
void
0
}
function
p
(){
u
()
&&
m
()}
function
m
(){
se
=
"number"
==
typeof
K
.
contentHeight
?
K
.
contentHeight
:
"number"
==
typeof
K
.
height
?
K
.
height
-
(
ee
?
ee
.
outerHeight
(
!
0
):
0
):
Math
.
round
(
ne
.
width
()
/
Math
.
max
(
K
.
aspectRatio
,.
5
))}
function
v
(
t
){
!
ue
&&
t
.
target
===
window
&&
re
.
start
&&
g
(
!
0
)
&&
re
.
trigger
(
"windowResize"
,
de
)}
function
y
(){
S
(),
E
()}
function
w
(){
u
()
&&
(
B
(),
re
.
destroyEvents
(),
re
.
renderEvents
(
he
),
I
())}
function
S
(){
B
(),
re
.
destroyEvents
(),
I
()}
function
b
(){
!
K
.
lazyFetching
||
ae
(
re
.
start
,
re
.
end
)?
E
():
w
()}
function
E
(){
ce
(
re
.
start
,
re
.
end
)}
function
D
(
t
){
he
=
t
,
w
()}
function
T
(){
w
()}
function
C
(){
te
.
updateTitle
(
re
.
title
)}
function
H
(){
var
t
=
q
.
getNow
();
t
.
isWithin
(
re
.
intervalStart
,
re
.
intervalEnd
)?
te
.
disableButton
(
"today"
):
te
.
enableButton
(
"today"
)}
function
x
(
t
,
e
){
t
=
q
.
moment
(
t
),
e
=
e
?
q
.
moment
(
e
):
t
.
hasTime
()?
t
.
clone
().
add
(
q
.
defaultTimedEventDuration
):
t
.
clone
().
add
(
q
.
defaultAllDayEventDuration
),
re
.
select
(
t
,
e
)}
function
k
(){
re
&&
re
.
unselect
()}
function
R
(){
f
(
-
1
)}
function
P
(){
f
(
1
)}
function
F
(){
le
.
add
(
-
1
,
"years"
),
f
()}
function
L
(){
le
.
add
(
1
,
"years"
),
f
()}
function
G
(){
le
=
q
.
getNow
(),
f
()}
function
N
(
t
){
le
=
q
.
moment
(
t
),
f
()}
function
A
(
t
){
le
.
add
(
e
.
duration
(
t
)),
f
()}
function
Y
(
t
,
e
){
var
n
,
i
;
e
&&
void
0
!==
Ge
[
e
]
||
(
e
=
e
||
"day"
,
n
=
te
.
getViewsWithButtons
().
join
(
" "
),
i
=
n
.
match
(
RegExp
(
"
\\
w+"
+
z
(
e
))),
i
||
(
i
=
n
.
match
(
/
\w
+Day/
)),
e
=
i
?
i
[
0
]:
"agendaDay"
),
le
=
t
,
h
(
e
)}
function
V
(){
return
le
.
clone
()}
function
B
(){
ne
.
css
({
width
:
"100%"
,
height
:
ne
.
height
(),
overflow
:
"hidden"
})}
function
I
(){
ne
.
css
({
width
:
""
,
height
:
""
,
overflow
:
""
})}
function
Z
(){
return
q
}
function
j
(){
return
re
}
function
X
(
t
,
e
){
return
void
0
===
e
?
K
[
t
]:((
"height"
==
t
||
"contentHeight"
==
t
||
"aspectRatio"
==
t
)
&&
(
K
[
t
]
=
e
,
g
(
!
0
)),
void
0
)}
function
$
(
t
,
e
){
return
K
[
t
]?
K
[
t
].
apply
(
e
||
de
,
Array
.
prototype
.
slice
.
call
(
arguments
,
2
)):
void
0
}
var
q
=
this
;
i
=
i
||
{};
var
U
,
K
=
s
({},
Fe
,
i
);
U
=
K
.
lang
in
Le
?
Le
[
K
.
lang
]:
Le
[
Fe
.
lang
],
U
&&
(
K
=
s
({},
Fe
,
U
,
i
)),
K
.
isRTL
&&
(
K
=
s
({},
Fe
,
ze
,
U
||
{},
i
)),
q
.
options
=
K
,
q
.
render
=
o
,
q
.
destroy
=
d
,
q
.
refetchEvents
=
y
,
q
.
reportEvents
=
D
,
q
.
reportEventChange
=
T
,
q
.
rerenderEvents
=
w
,
q
.
changeView
=
h
,
q
.
select
=
x
,
q
.
unselect
=
k
,
q
.
prev
=
R
,
q
.
next
=
P
,
q
.
prevYear
=
F
,
q
.
nextYear
=
L
,
q
.
today
=
G
,
q
.
gotoDate
=
N
,
q
.
incrementDate
=
A
,
q
.
zoomTo
=
Y
,
q
.
getDate
=
V
,
q
.
getCalendar
=
Z
,
q
.
getView
=
j
,
q
.
option
=
X
,
q
.
trigger
=
$
;
var
Q
=
M
(
r
(
K
.
lang
));
if
(
K
.
monthNames
&&
(
Q
.
_months
=
K
.
monthNames
),
K
.
monthNamesShort
&&
(
Q
.
_monthsShort
=
K
.
monthNamesShort
),
K
.
dayNames
&&
(
Q
.
_weekdays
=
K
.
dayNames
),
K
.
dayNamesShort
&&
(
Q
.
_weekdaysShort
=
K
.
dayNamesShort
),
null
!=
K
.
firstDay
){
var
J
=
M
(
Q
.
_week
);
J
.
dow
=
K
.
firstDay
,
Q
.
_week
=
J
}
q
.
defaultAllDayEventDuration
=
e
.
duration
(
K
.
defaultAllDayEventDuration
),
q
.
defaultTimedEventDuration
=
e
.
duration
(
K
.
defaultTimedEventDuration
),
q
.
moment
=
function
(){
var
t
;
return
"local"
===
K
.
timezone
?(
t
=
_e
.
moment
.
apply
(
null
,
arguments
),
t
.
hasTime
()
&&
t
.
local
()):
t
=
"UTC"
===
K
.
timezone
?
_e
.
moment
.
utc
.
apply
(
null
,
arguments
):
_e
.
moment
.
parseZone
.
apply
(
null
,
arguments
),
"_locale"
in
t
?
t
.
_locale
=
Q
:
t
.
_lang
=
Q
,
t
},
q
.
getIsAmbigTimezone
=
function
(){
return
"local"
!==
K
.
timezone
&&
"UTC"
!==
K
.
timezone
},
q
.
rezoneDate
=
function
(
t
){
return
q
.
moment
(
t
.
toArray
())},
q
.
getNow
=
function
(){
var
t
=
K
.
now
;
return
"function"
==
typeof
t
&&
(
t
=
t
()),
q
.
moment
(
t
)},
q
.
calculateWeekNumber
=
function
(
t
){
var
e
=
K
.
weekNumberCalculation
;
return
"function"
==
typeof
e
?
e
(
t
):
"local"
===
e
?
t
.
week
():
"ISO"
===
e
.
toUpperCase
()?
t
.
isoWeek
():
void
0
},
q
.
getEventEnd
=
function
(
t
){
return
t
.
end
?
t
.
end
.
clone
():
q
.
getDefaultEventEnd
(
t
.
allDay
,
t
.
start
)},
q
.
getDefaultEventEnd
=
function
(
t
,
e
){
var
n
=
e
.
clone
();
return
t
?
n
.
stripTime
().
add
(
q
.
defaultAllDayEventDuration
):
n
.
add
(
q
.
defaultTimedEventDuration
),
q
.
getIsAmbigTimezone
()
&&
n
.
stripZone
(),
n
},
q
.
formatRange
=
function
(
t
,
e
,
n
){
return
"function"
==
typeof
n
&&
(
n
=
n
.
call
(
q
,
K
,
Q
)),
W
(
t
,
e
,
n
,
null
,
K
.
isRTL
)},
q
.
formatDate
=
function
(
t
,
e
){
return
"function"
==
typeof
e
&&
(
e
=
e
.
call
(
q
,
K
,
Q
)),
O
(
t
,
e
)},
c
.
call
(
q
,
K
);
var
te
,
ee
,
ne
,
ie
,
re
,
se
,
oe
,
le
,
ae
=
q
.
isFetchNeeded
,
ce
=
q
.
fetchEvents
,
de
=
n
[
0
],
ue
=
0
,
he
=
[];
le
=
null
!=
K
.
defaultDate
?
q
.
moment
(
K
.
defaultDate
):
q
.
getNow
(),
q
.
getSuggestedViewHeight
=
function
(){
return
void
0
===
se
&&
p
(),
se
},
q
.
isHeightAuto
=
function
(){
return
"auto"
===
K
.
contentHeight
||
"auto"
===
K
.
height
}}
function
a
(
e
,
n
){
function
i
(){
var
e
=
n
.
header
;
return
f
=
n
.
theme
?
"ui"
:
"fc"
,
e
?
g
=
t
(
"<div class='fc-toolbar'/>"
).
append
(
s
(
"left"
)).
append
(
s
(
"right"
)).
append
(
s
(
"center"
)).
append
(
'<div class="fc-clear"/>'
):
void
0
}
function
r
(){
g
.
remove
()}
function
s
(
i
){
var
r
=
t
(
'<div class="fc-'
+
i
+
'"/>'
),
s
=
n
.
header
[
i
];
return
s
&&
t
.
each
(
s
.
split
(
" "
),
function
(){
var
i
,
s
=
t
(),
o
=!
0
;
t
.
each
(
this
.
split
(
","
),
function
(
i
,
r
){
var
l
,
a
,
c
,
d
,
u
,
h
,
g
,
m
;
"title"
==
r
?(
s
=
s
.
add
(
t
(
"<h2> </h2>"
)),
o
=!
1
):(
e
[
r
]?
l
=
function
(){
e
[
r
]()}:
Ge
[
r
]
&&
(
l
=
function
(){
e
.
changeView
(
r
)},
p
.
push
(
r
)),
l
&&
(
a
=
T
(
n
.
themeButtonIcons
,
r
),
c
=
T
(
n
.
buttonIcons
,
r
),
d
=
T
(
n
.
defaultButtonText
,
r
),
u
=
T
(
n
.
buttonText
,
r
),
h
=
u
?
F
(
u
):
a
&&
n
.
theme
?
"<span class='ui-icon ui-icon-"
+
a
+
"'></span>"
:
c
&&!
n
.
theme
?
"<span class='fc-icon fc-icon-"
+
c
+
"'></span>"
:
F
(
d
||
r
),
g
=
[
"fc-"
+
r
+
"-button"
,
f
+
"-button"
,
f
+
"-state-default"
],
m
=
t
(
'<button type="button" class="'
+
g
.
join
(
" "
)
+
'">'
+
h
+
"</button>"
).
click
(
function
(){
m
.
hasClass
(
f
+
"-state-disabled"
)
||
(
l
(),(
m
.
hasClass
(
f
+
"-state-active"
)
||
m
.
hasClass
(
f
+
"-state-disabled"
))
&&
m
.
removeClass
(
f
+
"-state-hover"
))}).
mousedown
(
function
(){
m
.
not
(
"."
+
f
+
"-state-active"
).
not
(
"."
+
f
+
"-state-disabled"
).
addClass
(
f
+
"-state-down"
)}).
mouseup
(
function
(){
m
.
removeClass
(
f
+
"-state-down"
)}).
hover
(
function
(){
m
.
not
(
"."
+
f
+
"-state-active"
).
not
(
"."
+
f
+
"-state-disabled"
).
addClass
(
f
+
"-state-hover"
)},
function
(){
m
.
removeClass
(
f
+
"-state-hover"
).
removeClass
(
f
+
"-state-down"
)}),
s
=
s
.
add
(
m
)))}),
o
&&
s
.
first
().
addClass
(
f
+
"-corner-left"
).
end
().
last
().
addClass
(
f
+
"-corner-right"
).
end
(),
s
.
length
>
1
?(
i
=
t
(
"<div/>"
),
o
&&
i
.
addClass
(
"fc-button-group"
),
i
.
append
(
s
),
r
.
append
(
i
)):
r
.
append
(
s
)}),
r
}
function
o
(
t
){
g
.
find
(
"h2"
).
text
(
t
)}
function
l
(
t
){
g
.
find
(
".fc-"
+
t
+
"-button"
).
addClass
(
f
+
"-state-active"
)}
function
a
(
t
){
g
.
find
(
".fc-"
+
t
+
"-button"
).
removeClass
(
f
+
"-state-active"
)}
function
c
(
t
){
g
.
find
(
".fc-"
+
t
+
"-button"
).
attr
(
"disabled"
,
"disabled"
).
addClass
(
f
+
"-state-disabled"
)}
function
d
(
t
){
g
.
find
(
".fc-"
+
t
+
"-button"
).
removeAttr
(
"disabled"
).
removeClass
(
f
+
"-state-disabled"
)}
function
u
(){
return
p
}
var
h
=
this
;
h
.
render
=
i
,
h
.
destroy
=
r
,
h
.
updateTitle
=
o
,
h
.
activateButton
=
l
,
h
.
deactivateButton
=
a
,
h
.
disableButton
=
c
,
h
.
enableButton
=
d
,
h
.
getViewsWithButtons
=
u
;
var
f
,
g
=
t
(),
p
=
[]}
function
c
(
n
){
function
i
(
t
,
e
){
return
!
A
||
t
.
clone
().
stripZone
()
<
A
.
clone
().
stripZone
()
||
e
.
clone
().
stripZone
()
>
Y
.
clone
().
stripZone
()}
function
r
(
t
,
e
){
A
=
t
,
Y
=
e
,
q
=
[];
var
n
=++
j
,
i
=
Z
.
length
;
X
=
i
;
for
(
var
r
=
0
;
i
>
r
;
r
++
)
s
(
Z
[
r
],
n
)}
function
s
(
e
,
n
){
o
(
e
,
function
(
i
){
var
r
,
s
,
o
,
l
=
t
.
isArray
(
e
.
events
);
if
(
n
==
j
){
if
(
i
)
for
(
r
=
0
;
i
.
length
>
r
;
r
++
)
s
=
i
[
r
],
o
=
l
?
s
:
S
(
s
,
e
),
o
&&
q
.
push
.
apply
(
q
,
E
(
o
));
X
--
,
X
||
B
(
q
)}})}
function
o
(
e
,
i
){
var
r
,
s
,
l
=
_e
.
sourceFetchers
;
for
(
r
=
0
;
l
.
length
>
r
;
r
++
){
if
(
s
=
l
[
r
].
call
(
N
,
e
,
A
.
clone
(),
Y
.
clone
(),
n
.
timezone
,
i
),
s
===!
0
)
return
;
if
(
"object"
==
typeof
s
)
return
o
(
s
,
i
),
void
0
}
var
a
=
e
.
events
;
if
(
a
)
t
.
isFunction
(
a
)?(
y
(),
a
.
call
(
N
,
A
.
clone
(),
Y
.
clone
(),
n
.
timezone
,
function
(
t
){
i
(
t
),
w
()})):
t
.
isArray
(
a
)?
i
(
a
):
i
();
else
{
var
c
=
e
.
url
;
if
(
c
){
var
d
,
u
=
e
.
success
,
h
=
e
.
error
,
f
=
e
.
complete
;
d
=
t
.
isFunction
(
e
.
data
)?
e
.
data
():
e
.
data
;
var
g
=
t
.
extend
({},
d
||
{}),
p
=
P
(
e
.
startParam
,
n
.
startParam
),
m
=
P
(
e
.
endParam
,
n
.
endParam
),
v
=
P
(
e
.
timezoneParam
,
n
.
timezoneParam
);
p
&&
(
g
[
p
]
=
A
.
format
()),
m
&&
(
g
[
m
]
=
Y
.
format
()),
n
.
timezone
&&
"local"
!=
n
.
timezone
&&
(
g
[
v
]
=
n
.
timezone
),
y
(),
t
.
ajax
(
t
.
extend
({},
Ne
,
e
,{
data
:
g
,
success
:
function
(
e
){
e
=
e
||
[];
var
n
=
R
(
u
,
this
,
arguments
);
t
.
isArray
(
n
)
&&
(
e
=
n
),
i
(
e
)},
error
:
function
(){
R
(
h
,
this
,
arguments
),
i
()},
complete
:
function
(){
R
(
f
,
this
,
arguments
),
w
()}}))}
else
i
()}}
function
l
(
t
){
var
e
=
a
(
t
);
e
&&
(
Z
.
push
(
e
),
X
++
,
s
(
e
,
j
))}
function
a
(
e
){
var
n
,
i
,
r
=
_e
.
sourceNormalizers
;
if
(
t
.
isFunction
(
e
)
||
t
.
isArray
(
e
)?
n
=
{
events
:
e
}:
"string"
==
typeof
e
?
n
=
{
url
:
e
}:
"object"
==
typeof
e
&&
(
n
=
t
.
extend
({},
e
)),
n
){
for
(
n
.
className
?
"string"
==
typeof
n
.
className
&&
(
n
.
className
=
n
.
className
.
split
(
/
\s
+/
)):
n
.
className
=
[],
t
.
isArray
(
n
.
events
)
&&
(
n
.
origArray
=
n
.
events
,
n
.
events
=
t
.
map
(
n
.
events
,
function
(
t
){
return
S
(
t
,
n
)})),
i
=
0
;
r
.
length
>
i
;
i
++
)
r
[
i
].
call
(
N
,
n
);
return
n
}}
function
c
(
e
){
Z
=
t
.
grep
(
Z
,
function
(
t
){
return
!
u
(
t
,
e
)}),
q
=
t
.
grep
(
q
,
function
(
t
){
return
!
u
(
t
.
source
,
e
)}),
B
(
q
)}
function
u
(
t
,
e
){
return
t
&&
e
&&
h
(
t
)
==
h
(
e
)}
function
h
(
t
){
return
(
"object"
==
typeof
t
?
t
.
origArray
||
t
.
url
||
t
.
events
:
null
)
||
t
}
function
f
(
t
){
t
.
start
=
N
.
moment
(
t
.
start
),
t
.
end
&&
(
t
.
end
=
N
.
moment
(
t
.
end
)),
D
(
t
),
g
(
t
),
B
(
q
)}
function
g
(
t
){
var
e
,
n
,
i
,
r
;
for
(
e
=
0
;
q
.
length
>
e
;
e
++
)
if
(
n
=
q
[
e
],
n
.
_id
==
t
.
_id
&&
n
!==
t
)
for
(
i
=
0
;
U
.
length
>
i
;
i
++
)
r
=
U
[
i
],
void
0
!==
t
[
r
]
&&
(
n
[
r
]
=
t
[
r
])}
function
p
(
t
,
e
){
var
n
,
i
,
r
,
s
=
S
(
t
);
if
(
s
){
for
(
n
=
E
(
s
),
i
=
0
;
n
.
length
>
i
;
i
++
)
r
=
n
[
i
],
r
.
source
||
(
e
&&
(
W
.
events
.
push
(
r
),
r
.
source
=
W
),
q
.
push
(
r
));
return
B
(
q
),
n
}
return
[]}
function
m
(
e
){
var
n
,
i
;
for
(
null
==
e
?
e
=
function
(){
return
!
0
}:
t
.
isFunction
(
e
)
||
(
n
=
e
+
""
,
e
=
function
(
t
){
return
t
.
_id
==
n
}),
q
=
t
.
grep
(
q
,
e
,
!
0
),
i
=
0
;
Z
.
length
>
i
;
i
++
)
t
.
isArray
(
Z
[
i
].
events
)
&&
(
Z
[
i
].
events
=
t
.
grep
(
Z
[
i
].
events
,
e
,
!
0
));
B
(
q
)}
function
v
(
e
){
return
t
.
isFunction
(
e
)?
t
.
grep
(
q
,
e
):
null
!=
e
?(
e
+=
""
,
t
.
grep
(
q
,
function
(
t
){
return
t
.
_id
==
e
})):
q
}
function
y
(){
$
++||
V
(
"loading"
,
null
,
!
0
,
O
())}
function
w
(){
--
$
||
V
(
"loading"
,
null
,
!
1
,
O
())}
function
S
(
i
,
r
){
var
s
,
o
,
l
,
a
,
c
=
{};
if
(
n
.
eventDataTransform
&&
(
i
=
n
.
eventDataTransform
(
i
)),
r
&&
r
.
eventDataTransform
&&
(
i
=
r
.
eventDataTransform
(
i
)),
t
.
extend
(
c
,
i
),
r
&&
(
c
.
source
=
r
),
c
.
_id
=
i
.
_id
||
(
void
0
===
i
.
id
?
"_fc"
+
Ae
++
:
i
.
id
+
""
),
c
.
className
=
i
.
className
?
"string"
==
typeof
i
.
className
?
i
.
className
.
split
(
/
\s
+/
):
i
.
className
:[],
s
=
i
.
start
||
i
.
date
,
o
=
i
.
end
,
k
(
s
)
&&
(
s
=
e
.
duration
(
s
)),
k
(
o
)
&&
(
o
=
e
.
duration
(
o
)),
i
.
dow
||
e
.
isDuration
(
s
)
||
e
.
isDuration
(
o
))
c
.
start
=
s
?
e
.
duration
(
s
):
null
,
c
.
end
=
o
?
e
.
duration
(
o
):
null
,
c
.
_recurring
=!
0
;
else
{
if
(
s
&&
(
s
=
N
.
moment
(
s
),
!
s
.
isValid
()))
return
!
1
;
if
(
o
&&
(
o
=
N
.
moment
(
o
),
!
o
.
isValid
()))
return
!
1
;
l
=
i
.
allDay
,
void
0
===
l
&&
(
a
=
P
(
r
?
r
.
allDayDefault
:
void
0
,
n
.
allDayDefault
),
l
=
void
0
!==
a
?
a
:
!
(
s
.
hasTime
()
||
o
&&
o
.
hasTime
())),
b
(
s
,
o
,
l
,
c
)}
return
c
}
function
b
(
t
,
e
,
i
,
r
){
i
?(
t
.
hasTime
()
&&
t
.
stripTime
(),
e
&&
e
.
hasTime
()
&&
e
.
stripTime
()):(
t
.
hasTime
()
||
(
t
=
N
.
rezoneDate
(
t
)),
e
&&!
e
.
hasTime
()
&&
(
e
=
N
.
rezoneDate
(
e
))),
r
.
allDay
=
i
,
r
.
start
=
t
,
r
.
end
=
e
||
null
,
n
.
forceEventDuration
&&!
r
.
end
&&
(
r
.
end
=
I
(
r
)),
d
(
r
)}
function
E
(
e
){
var
n
,
i
,
r
,
s
,
o
,
l
,
a
,
c
,
d
,
u
,
h
=
[],
f
=
A
,
g
=
Y
;
if
(
f
&&
g
||
(
n
=
N
.
getView
(),
f
=
n
.
start
,
g
=
n
.
end
),
e
)
if
(
e
.
_recurring
){
if
(
r
=
e
.
dow
)
for
(
i
=
{},
s
=
0
;
r
.
length
>
s
;
s
++
)
i
[
r
[
s
]]
=!
0
;
for
(
o
=
f
.
clone
().
stripTime
();
o
.
isBefore
(
g
);)(
!
i
||
i
[
o
.
day
()])
&&
(
l
=
e
.
start
,
a
=
e
.
end
,
c
=
o
.
clone
(),
d
=
null
,
l
&&
(
c
=
c
.
time
(
l
)),
a
&&
(
d
=
o
.
clone
().
time
(
a
)),
u
=
t
.
extend
({},
e
),
b
(
c
,
d
,
!
l
&&!
a
,
u
),
h
.
push
(
u
)),
o
.
add
(
1
,
"days"
)}
else
h
.
push
(
e
);
return
h
}
function
D
(
t
,
e
,
n
){
var
i
,
r
,
s
,
o
,
l
=
t
.
_allDay
,
a
=
t
.
_start
,
c
=
t
.
_end
,
d
=!
1
;
return
e
||
n
||
(
e
=
t
.
start
,
n
=
t
.
end
),
i
=
t
.
allDay
!=
l
?
t
.
allDay
:
!
(
e
||
n
).
hasTime
(),
i
&&
(
e
&&
(
e
=
e
.
clone
().
stripTime
()),
n
&&
(
n
=
n
.
clone
().
stripTime
())),
e
&&
(
r
=
i
?
C
(
e
,
a
.
clone
().
stripTime
()):
C
(
e
,
a
)),
i
!=
l
?
d
=!
0
:
n
&&
(
s
=
C
(
n
||
N
.
getDefaultEventEnd
(
i
,
e
||
a
),
e
||
a
).
subtract
(
C
(
c
||
N
.
getDefaultEventEnd
(
l
,
a
),
a
))),
o
=
T
(
v
(
t
.
_id
),
d
,
i
,
r
,
s
),{
dateDelta
:
r
,
durationDelta
:
s
,
undo
:
o
}}
function
T
(
e
,
i
,
r
,
s
,
o
){
var
l
=
N
.
getIsAmbigTimezone
(),
a
=
[];
return
t
.
each
(
e
,
function
(
t
,
e
){
var
c
=
e
.
_allDay
,
u
=
e
.
_start
,
h
=
e
.
_end
,
f
=
null
!=
r
?
r
:
c
,
g
=
u
.
clone
(),
p
=!
i
&&
h
?
h
.
clone
():
null
;
f
?(
g
.
stripTime
(),
p
&&
p
.
stripTime
()):(
g
.
hasTime
()
||
(
g
=
N
.
rezoneDate
(
g
)),
p
&&!
p
.
hasTime
()
&&
(
p
=
N
.
rezoneDate
(
p
))),
p
||!
n
.
forceEventDuration
&&!+
o
||
(
p
=
N
.
getDefaultEventEnd
(
f
,
g
)),
g
.
add
(
s
),
p
&&
p
.
add
(
s
).
add
(
o
),
l
&&
(
+
s
||+
o
)
&&
(
g
.
stripZone
(),
p
&&
p
.
stripZone
()),
e
.
allDay
=
f
,
e
.
start
=
g
,
e
.
end
=
p
,
d
(
e
),
a
.
push
(
function
(){
e
.
allDay
=
c
,
e
.
start
=
u
,
e
.
end
=
h
,
d
(
e
)})}),
function
(){
for
(
var
t
=
0
;
a
.
length
>
t
;
t
++
)
a
[
t
]()}}
function
H
(){
var
e
,
i
=
n
.
businessHours
,
r
=
{
className
:
"fc-nonbusiness"
,
start
:
"09:00"
,
end
:
"17:00"
,
dow
:[
1
,
2
,
3
,
4
,
5
],
rendering
:
"inverse-background"
};
return
i
&&
(
e
=
"object"
==
typeof
i
?
t
.
extend
({},
r
,
i
):
r
),
e
?
E
(
S
(
e
)):[]}
function
x
(
t
,
e
,
i
){
var
r
=
t
.
source
||
{},
s
=
P
(
t
.
constraint
,
r
.
constraint
,
n
.
eventConstraint
),
o
=
P
(
t
.
overlap
,
r
.
overlap
,
n
.
eventOverlap
);
return
L
(
e
,
i
,
s
,
o
,
t
)}
function
M
(
t
,
e
){
return
L
(
t
,
e
,
n
.
selectConstraint
,
n
.
selectOverlap
)}
function
F
(
t
,
e
,
n
){
var
i
;
return
n
&&
(
i
=
E
(
S
(
n
))[
0
])?
x
(
i
,
t
,
e
):
M
(
t
,
e
)}
function
L
(
t
,
e
,
n
,
i
,
r
){
var
s
,
o
,
l
,
a
,
c
;
if
(
t
=
t
.
clone
().
stripZone
(),
e
=
e
.
clone
().
stripZone
(),
null
!=
n
){
for
(
s
=
z
(
n
),
o
=!
1
,
l
=
0
;
s
.
length
>
l
;
l
++
)
if
(
_
(
s
[
l
],
t
,
e
)){
o
=!
0
;
break
}
if
(
!
o
)
return
!
1
}
for
(
l
=
0
;
q
.
length
>
l
;
l
++
)
if
(
a
=
q
[
l
],(
!
r
||
r
.
_id
!==
a
.
_id
)
&&
G
(
a
,
t
,
e
)){
if
(
i
===!
1
)
return
!
1
;
if
(
"function"
==
typeof
i
&&!
i
(
a
,
r
))
return
!
1
;
if
(
r
){
if
(
c
=
P
(
a
.
overlap
,(
a
.
source
||
{}).
overlap
),
c
===!
1
)
return
!
1
;
if
(
"function"
==
typeof
c
&&!
c
(
r
,
a
))
return
!
1
}}
return
!
0
}
function
z
(
t
){
return
"businessHours"
===
t
?
H
():
"object"
==
typeof
t
?
E
(
S
(
t
)):
v
(
t
)}
function
_
(
t
,
e
,
n
){
var
i
=
t
.
start
.
clone
().
stripZone
(),
r
=
N
.
getEventEnd
(
t
).
stripZone
();
return
e
>=
i
&&
r
>=
n
}
function
G
(
t
,
e
,
n
){
var
i
=
t
.
start
.
clone
().
stripZone
(),
r
=
N
.
getEventEnd
(
t
).
stripZone
();
return
r
>
e
&&
n
>
i
}
var
N
=
this
;
N
.
isFetchNeeded
=
i
,
N
.
fetchEvents
=
r
,
N
.
addEventSource
=
l
,
N
.
removeEventSource
=
c
,
N
.
updateEvent
=
f
,
N
.
renderEvent
=
p
,
N
.
removeEvents
=
m
,
N
.
clientEvents
=
v
,
N
.
mutateEvent
=
D
;
var
A
,
Y
,
V
=
N
.
trigger
,
O
=
N
.
getView
,
B
=
N
.
reportEvents
,
I
=
N
.
getEventEnd
,
W
=
{
events
:[]},
Z
=
[
W
],
j
=
0
,
X
=
0
,
$
=
0
,
q
=
[];
t
.
each
((
n
.
events
?[
n
.
events
]:[]).
concat
(
n
.
eventSources
||
[]),
function
(
t
,
e
){
var
n
=
a
(
e
);
n
&&
Z
.
push
(
n
)});
var
U
=
[
"title"
,
"url"
,
"allDay"
,
"className"
,
"editable"
,
"color"
,
"backgroundColor"
,
"borderColor"
,
"textColor"
];
N
.
getBusinessHoursEvents
=
H
,
N
.
isEventAllowedInRange
=
x
,
N
.
isSelectionAllowedInRange
=
M
,
N
.
isExternalDragAllowedInRange
=
F
}
function
d
(
t
){
t
.
_allDay
=
t
.
allDay
,
t
.
_start
=
t
.
start
.
clone
(),
t
.
_end
=
t
.
end
?
t
.
end
.
clone
():
null
}
function
u
(
t
,
e
){
e
.
left
&&
t
.
css
({
"border-left-width"
:
1
,
"margin-left"
:
e
.
left
-
1
}),
e
.
right
&&
t
.
css
({
"border-right-width"
:
1
,
"margin-right"
:
e
.
right
-
1
})}
function
h
(
t
){
t
.
css
({
"margin-left"
:
""
,
"margin-right"
:
""
,
"border-left-width"
:
""
,
"border-right-width"
:
""
})}
function
f
(){
t
(
"body"
).
addClass
(
"fc-not-allowed"
)}
function
g
(){
t
(
"body"
).
removeClass
(
"fc-not-allowed"
)}
function
p
(
e
,
n
,
i
){
var
r
=
Math
.
floor
(
n
/
e
.
length
),
s
=
Math
.
floor
(
n
-
r
*
(
e
.
length
-
1
)),
o
=
[],
l
=
[],
a
=
[],
c
=
0
;
m
(
e
),
e
.
each
(
function
(
n
,
i
){
var
d
=
n
===
e
.
length
-
1
?
s
:
r
,
u
=
t
(
i
).
outerHeight
(
!
0
);
d
>
u
?(
o
.
push
(
i
),
l
.
push
(
u
),
a
.
push
(
t
(
i
).
height
())):
c
+=
u
}),
i
&&
(
n
-=
c
,
r
=
Math
.
floor
(
n
/
o
.
length
),
s
=
Math
.
floor
(
n
-
r
*
(
o
.
length
-
1
))),
t
(
o
).
each
(
function
(
e
,
n
){
var
i
=
e
===
o
.
length
-
1
?
s
:
r
,
c
=
l
[
e
],
d
=
a
[
e
],
u
=
i
-
(
c
-
d
);
i
>
c
&&
t
(
n
).
height
(
u
)})}
function
m
(
t
){
t
.
height
(
""
)}
function
v
(
e
){
var
n
=
0
;
return
e
.
find
(
"> *"
).
each
(
function
(
e
,
i
){
var
r
=
t
(
i
).
outerWidth
();
r
>
n
&&
(
n
=
r
)}),
n
++
,
e
.
width
(
n
),
n
}
function
y
(
t
,
e
){
return
t
.
height
(
e
).
addClass
(
"fc-scroller"
),
t
[
0
].
scrollHeight
-
1
>
t
[
0
].
clientHeight
?
!
0
:(
w
(
t
),
!
1
)}
function
w
(
t
){
t
.
height
(
""
).
removeClass
(
"fc-scroller"
)}
function
S
(
e
){
var
n
=
e
.
css
(
"position"
),
i
=
e
.
parents
().
filter
(
function
(){
var
e
=
t
(
this
);
return
/
(
auto|scroll
)
/
.
test
(
e
.
css
(
"overflow"
)
+
e
.
css
(
"overflow-y"
)
+
e
.
css
(
"overflow-x"
))}).
eq
(
0
);
return
"fixed"
!==
n
&&
i
.
length
?
i
:
t
(
e
[
0
].
ownerDocument
||
document
)}
function
b
(
t
){
var
e
=
t
.
offset
().
left
,
n
=
e
+
t
.
width
(),
i
=
t
.
children
(),
r
=
i
.
offset
().
left
,
s
=
r
+
i
.
outerWidth
();
return
{
left
:
r
-
e
,
right
:
n
-
s
}}
function
E
(
t
){
return
1
==
t
.
which
&&!
t
.
ctrlKey
}
function
D
(
t
,
e
,
n
,
i
){
var
r
,
s
,
o
,
l
;
return
e
>
n
&&
i
>
t
?(
t
>=
n
?(
r
=
t
.
clone
(),
o
=!
0
):(
r
=
n
.
clone
(),
o
=!
1
),
i
>=
e
?(
s
=
e
.
clone
(),
l
=!
0
):(
s
=
i
.
clone
(),
l
=!
1
),{
start
:
r
,
end
:
s
,
isStart
:
o
,
isEnd
:
l
}):
void
0
}
function
T
(
t
,
e
){
if
(
t
=
t
||
{},
void
0
!==
t
[
e
])
return
t
[
e
];
for
(
var
n
,
i
=
e
.
split
(
/
(?=[
A-Z
])
/
),
r
=
i
.
length
-
1
;
r
>=
0
;
r
--
)
if
(
n
=
t
[
i
[
r
].
toLowerCase
()],
void
0
!==
n
)
return
n
;
return
t
[
"default"
]}
function
C
(
t
,
n
){
return
e
.
duration
({
days
:
t
.
clone
().
stripTime
().
diff
(
n
.
clone
().
stripTime
(),
"days"
),
ms
:
t
.
time
()
-
n
.
time
()})}
function
H
(
t
){
return
"[object Date]"
===
Object
.
prototype
.
toString
.
call
(
t
)
||
t
instanceof
Date
}
function
x
(
t
,
e
){
return
t
-
e
}
function
k
(
t
){
return
/^
\d
+
\:\d
+
(?:\:\d
+
\.?(?:\d{3})?)?
$/
.
test
(
t
)}
function
M
(
t
){
var
e
=
function
(){};
return
e
.
prototype
=
t
,
new
e
}
function
R
(
e
,
n
,
i
){
if
(
t
.
isFunction
(
e
)
&&
(
e
=
[
e
]),
e
){
var
r
,
s
;
for
(
r
=
0
;
e
.
length
>
r
;
r
++
)
s
=
e
[
r
].
apply
(
n
,
i
)
||
s
;
return
s
}}
function
P
(){
for
(
var
t
=
0
;
arguments
.
length
>
t
;
t
++
)
if
(
void
0
!==
arguments
[
t
])
return
arguments
[
t
]}
function
F
(
t
){
return
(
t
+
""
).
replace
(
/&/g
,
"&"
).
replace
(
/</g
,
"<"
).
replace
(
/>/g
,
">"
).
replace
(
/'/g
,
"'"
).
replace
(
/"/g
,
"""
).
replace
(
/
\n
/g
,
"<br />"
)}
function
L
(
t
){
return
t
.
replace
(
/&.*
?
;/g
,
""
)}
function
z
(
t
){
return
t
.
charAt
(
0
).
toUpperCase
()
+
t
.
slice
(
1
)}
function
_
(
t
,
e
){
var
n
,
i
,
r
,
s
,
o
=
function
(){
var
l
=+
new
Date
-
s
;
e
>
l
&&
l
>
0
?
n
=
setTimeout
(
o
,
e
-
l
):(
n
=
null
,
t
.
apply
(
r
,
i
),
n
||
(
r
=
i
=
null
))};
return
function
(){
r
=
this
,
i
=
arguments
,
s
=+
new
Date
,
n
||
(
n
=
setTimeout
(
o
,
e
))}}
function
G
(
n
,
i
,
r
){
var
s
,
o
,
l
,
a
,
c
=
n
[
0
],
d
=
1
==
n
.
length
&&
"string"
==
typeof
c
;
return
e
.
isMoment
(
c
)?(
a
=
e
.
apply
(
null
,
n
),
A
(
c
,
a
)):
H
(
c
)
||
void
0
===
c
?
a
=
e
.
apply
(
null
,
n
):(
s
=!
1
,
o
=!
1
,
d
?
Ie
.
test
(
c
)?(
c
+=
"-01"
,
n
=
[
c
],
s
=!
0
,
o
=!
0
):(
l
=
We
.
exec
(
c
))
&&
(
s
=!
l
[
5
],
o
=!
0
):
t
.
isArray
(
c
)
&&
(
o
=!
0
),
a
=
i
?
e
.
utc
.
apply
(
e
,
n
):
e
.
apply
(
null
,
n
),
s
?(
a
.
_ambigTime
=!
0
,
a
.
_ambigZone
=!
0
):
r
&&
(
o
?
a
.
_ambigZone
=!
0
:
d
&&
a
.
zone
(
c
))),
a
.
_fullCalendar
=!
0
,
a
}
function
N
(
t
,
e
){
var
n
,
i
=
[],
r
=!
1
,
s
=!
1
;
for
(
n
=
0
;
t
.
length
>
n
;
n
++
)
i
.
push
(
_e
.
moment
.
parseZone
(
t
[
n
])),
r
=
r
||
i
[
n
].
_ambigTime
,
s
=
s
||
i
[
n
].
_ambigZone
;
for
(
n
=
0
;
i
.
length
>
n
;
n
++
)
r
&&!
e
?
i
[
n
].
stripTime
():
s
&&
i
[
n
].
stripZone
();
return
i
}
function
A
(
t
,
e
){
t
.
_ambigTime
?
e
.
_ambigTime
=!
0
:
e
.
_ambigTime
&&
(
e
.
_ambigTime
=!
1
),
t
.
_ambigZone
?
e
.
_ambigZone
=!
0
:
e
.
_ambigZone
&&
(
e
.
_ambigZone
=!
1
)}
function
Y
(
t
,
e
){
t
.
year
(
e
[
0
]
||
0
).
month
(
e
[
1
]
||
0
).
date
(
e
[
2
]
||
0
).
hours
(
e
[
3
]
||
0
).
minutes
(
e
[
4
]
||
0
).
seconds
(
e
[
5
]
||
0
).
milliseconds
(
e
[
6
]
||
0
)}
function
V
(
t
,
e
){
return
je
.
format
.
call
(
t
,
e
)}
function
O
(
t
,
e
){
return
B
(
t
,
X
(
e
))}
function
B
(
t
,
e
){
var
n
,
i
=
""
;
for
(
n
=
0
;
e
.
length
>
n
;
n
++
)
i
+=
I
(
t
,
e
[
n
]);
return
i
}
function
I
(
t
,
e
){
var
n
,
i
;
return
"string"
==
typeof
e
?
e
:(
n
=
e
.
token
)?
Xe
[
n
]?
Xe
[
n
](
t
):
V
(
t
,
n
):
e
.
maybe
&&
(
i
=
B
(
t
,
e
.
maybe
),
i
.
match
(
/
[
1-9
]
/
))?
i
:
""
}
function
W
(
t
,
e
,
n
,
i
,
r
){
var
s
;
return
t
=
_e
.
moment
.
parseZone
(
t
),
e
=
_e
.
moment
.
parseZone
(
e
),
s
=
(
t
.
localeData
||
t
.
lang
).
call
(
t
),
n
=
s
.
longDateFormat
(
n
)
||
n
,
i
=
i
||
" - "
,
Z
(
t
,
e
,
X
(
n
),
i
,
r
)}
function
Z
(
t
,
e
,
n
,
i
,
r
){
var
s
,
o
,
l
,
a
,
c
=
""
,
d
=
""
,
u
=
""
,
h
=
""
,
f
=
""
;
for
(
o
=
0
;
n
.
length
>
o
&&
(
s
=
j
(
t
,
e
,
n
[
o
]),
s
!==!
1
);
o
++
)
c
+=
s
;
for
(
l
=
n
.
length
-
1
;
l
>
o
&&
(
s
=
j
(
t
,
e
,
n
[
l
]),
s
!==!
1
);
l
--
)
d
=
s
+
d
;
for
(
a
=
o
;
l
>=
a
;
a
++
)
u
+=
I
(
t
,
n
[
a
]),
h
+=
I
(
e
,
n
[
a
]);
return
(
u
||
h
)
&&
(
f
=
r
?
h
+
i
+
u
:
u
+
i
+
h
),
c
+
f
+
d
}
function
j
(
t
,
e
,
n
){
var
i
,
r
;
return
"string"
==
typeof
n
?
n
:(
i
=
n
.
token
)
&&
(
r
=
$e
[
i
.
charAt
(
0
)],
r
&&
t
.
isSame
(
e
,
r
))?
V
(
t
,
i
):
!
1
}
function
X
(
t
){
return
t
in
qe
?
qe
[
t
]:
qe
[
t
]
=
$
(
t
)}
function
$
(
t
){
for
(
var
e
,
n
=
[],
i
=
/
\[([^\]]
*
)\]
|
\(([^\)]
*
)\)
|
(
LT|
(\w)\4
*o
?)
|
([^\w\[\(]
+
)
/g
;
e
=
i
.
exec
(
t
);)
e
[
1
]?
n
.
push
(
e
[
1
]):
e
[
2
]?
n
.
push
({
maybe
:
$
(
e
[
2
])}):
e
[
3
]?
n
.
push
({
token
:
e
[
3
]}):
e
[
5
]
&&
n
.
push
(
e
[
5
]);
return
n
}
function
q
(
t
){
this
.
options
=
t
||
{}}
function
U
(
t
){
this
.
grid
=
t
}
function
K
(
t
){
this
.
coordMaps
=
t
}
function
Q
(
t
,
e
){
this
.
coordMap
=
t
,
this
.
options
=
e
||
{}}
function
J
(
t
,
e
){
return
t
||
e
?
t
&&
e
?
t
.
grid
===
e
.
grid
&&
t
.
row
===
e
.
row
&&
t
.
col
===
e
.
col
:
!
1
:
!
0
}
function
te
(
e
,
n
){
this
.
options
=
n
=
n
||
{},
this
.
sourceEl
=
e
,
this
.
parentEl
=
n
.
parentEl
?
t
(
n
.
parentEl
):
e
.
parent
()}
function
ee
(
t
){
this
.
view
=
t
}
function
ne
(
t
){
ee
.
call
(
this
,
t
),
this
.
coordMap
=
new
U
(
this
),
this
.
elsByFill
=
{}}
function
ie
(
t
){
var
e
=
se
(
t
);
return
"background"
===
e
||
"inverse-background"
===
e
}
function
re
(
t
){
return
"inverse-background"
===
se
(
t
)}
function
se
(
t
){
return
P
((
t
.
source
||
{}).
rendering
,
t
.
rendering
)}
function
oe
(
t
){
var
e
,
n
,
i
=
{};
for
(
e
=
0
;
t
.
length
>
e
;
e
++
)
n
=
t
[
e
],(
i
[
n
.
_id
]
||
(
i
[
n
.
_id
]
=
[])).
push
(
n
);
return
i
}
function
le
(
t
,
e
){
return
t
.
eventStartMS
-
e
.
eventStartMS
}
function
ae
(
t
,
e
){
return
t
.
eventStartMS
-
e
.
eventStartMS
||
e
.
eventDurationMS
-
t
.
eventDurationMS
||
e
.
event
.
allDay
-
t
.
event
.
allDay
||
(
t
.
event
.
title
||
""
).
localeCompare
(
e
.
event
.
title
)}
function
ce
(
t
){
ne
.
call
(
this
,
t
)}
function
de
(
t
,
e
){
var
n
,
i
;
for
(
n
=
0
;
e
.
length
>
n
;
n
++
)
if
(
i
=
e
[
n
],
i
.
leftCol
<=
t
.
rightCol
&&
i
.
rightCol
>=
t
.
leftCol
)
return
!
0
;
return
!
1
}
function
ue
(
t
,
e
){
return
t
.
leftCol
-
e
.
leftCol
}
function
he
(
t
){
ne
.
call
(
this
,
t
)}
function
fe
(
t
){
var
e
,
n
,
i
;
if
(
t
.
sort
(
ae
),
e
=
ge
(
t
),
pe
(
e
),
n
=
e
[
0
]){
for
(
i
=
0
;
n
.
length
>
i
;
i
++
)
me
(
n
[
i
]);
for
(
i
=
0
;
n
.
length
>
i
;
i
++
)
ve
(
n
[
i
],
0
,
0
)}}
function
ge
(
t
){
var
e
,
n
,
i
,
r
=
[];
for
(
e
=
0
;
t
.
length
>
e
;
e
++
){
for
(
n
=
t
[
e
],
i
=
0
;
r
.
length
>
i
&&
ye
(
n
,
r
[
i
]).
length
;
i
++
);
n
.
level
=
i
,(
r
[
i
]
||
(
r
[
i
]
=
[])).
push
(
n
)}
return
r
}
function
pe
(
t
){
var
e
,
n
,
i
,
r
,
s
;
for
(
e
=
0
;
t
.
length
>
e
;
e
++
)
for
(
n
=
t
[
e
],
i
=
0
;
n
.
length
>
i
;
i
++
)
for
(
r
=
n
[
i
],
r
.
forwardSegs
=
[],
s
=
e
+
1
;
t
.
length
>
s
;
s
++
)
ye
(
r
,
t
[
s
],
r
.
forwardSegs
)}
function
me
(
t
){
var
e
,
n
,
i
=
t
.
forwardSegs
,
r
=
0
;
if
(
void
0
===
t
.
forwardPressure
){
for
(
e
=
0
;
i
.
length
>
e
;
e
++
)
n
=
i
[
e
],
me
(
n
),
r
=
Math
.
max
(
r
,
1
+
n
.
forwardPressure
);
t
.
forwardPressure
=
r
}}
function
ve
(
t
,
e
,
n
){
var
i
,
r
=
t
.
forwardSegs
;
if
(
void
0
===
t
.
forwardCoord
)
for
(
r
.
length
?(
r
.
sort
(
Se
),
ve
(
r
[
0
],
e
+
1
,
n
),
t
.
forwardCoord
=
r
[
0
].
backwardCoord
):
t
.
forwardCoord
=
1
,
t
.
backwardCoord
=
t
.
forwardCoord
-
(
t
.
forwardCoord
-
n
)
/
(
e
+
1
),
i
=
0
;
r
.
length
>
i
;
i
++
)
ve
(
r
[
i
],
0
,
t
.
forwardCoord
)}
function
ye
(
t
,
e
,
n
){
n
=
n
||
[];
for
(
var
i
=
0
;
e
.
length
>
i
;
i
++
)
we
(
t
,
e
[
i
])
&&
n
.
push
(
e
[
i
]);
return
n
}
function
we
(
t
,
e
){
return
t
.
bottom
>
e
.
top
&&
t
.
top
<
e
.
bottom
}
function
Se
(
t
,
e
){
return
e
.
forwardPressure
-
t
.
forwardPressure
||
(
t
.
backwardCoord
||
0
)
-
(
e
.
backwardCoord
||
0
)
||
ae
(
t
,
e
)}
function
be
(
n
){
function
i
(
e
){
var
n
=
x
[
e
];
return
t
.
isPlainObject
(
n
)
&&!
o
(
e
)?
T
(
n
,
C
.
name
):
n
}
function
r
(
t
,
e
){
return
n
.
trigger
.
apply
(
n
,[
t
,
e
||
C
].
concat
(
Array
.
prototype
.
slice
.
call
(
arguments
,
2
),[
C
]))}
function
s
(
t
){
var
e
=
t
.
source
||
{};
return
P
(
t
.
startEditable
,
e
.
startEditable
,
i
(
"eventStartEditable"
),
t
.
editable
,
e
.
editable
,
i
(
"editable"
))}
function
l
(
t
){
var
e
=
t
.
source
||
{};
return
P
(
t
.
durationEditable
,
e
.
durationEditable
,
i
(
"eventDurationEditable"
),
t
.
editable
,
e
.
editable
,
i
(
"editable"
))}
function
a
(
t
,
e
,
i
,
s
){
var
o
=
n
.
mutateEvent
(
e
,
i
,
null
);
r
(
"eventDrop"
,
t
,
e
,
o
.
dateDelta
,
function
(){
o
.
undo
(),
H
()},
s
,{}),
H
()}
function
c
(
t
,
e
,
i
,
s
){
var
o
=
n
.
mutateEvent
(
e
,
null
,
i
);
r
(
"eventResize"
,
t
,
e
,
o
.
durationDelta
,
function
(){
o
.
undo
(),
H
()},
s
,{}),
H
()}
function
d
(
t
){
return
e
.
isMoment
(
t
)
&&
(
t
=
t
.
day
()),
F
[
t
]}
function
u
(){
return
M
}
function
h
(
t
,
e
,
n
){
var
i
=
t
.
clone
();
for
(
e
=
e
||
1
;
F
[(
i
.
day
()
+
(
n
?
e
:
0
)
+
7
)
%
7
];)
i
.
add
(
e
,
"days"
);
return
i
}
function
f
(){
var
t
=
g
.
apply
(
null
,
arguments
),
e
=
p
(
t
),
n
=
m
(
e
);
return
n
}
function
g
(
t
,
e
){
var
n
=
C
.
colCnt
,
i
=
_
?
-
1
:
1
,
r
=
_
?
n
-
1
:
0
;
"object"
==
typeof
t
&&
(
e
=
t
.
col
,
t
=
t
.
row
);
var
s
=
t
*
n
+
(
e
*
i
+
r
);
return
s
}
function
p
(
t
){
var
e
=
C
.
start
.
day
();
return
t
+=
L
[
e
],
7
*
Math
.
floor
(
t
/
M
)
+
z
[(
t
%
M
+
M
)
%
M
]
-
e
}
function
m
(
t
){
return
C
.
start
.
clone
().
add
(
t
,
"days"
)}
function
v
(
t
){
var
e
=
y
(
t
),
n
=
w
(
e
),
i
=
S
(
n
);
return
i
}
function
y
(
t
){
return
t
.
clone
().
stripTime
().
diff
(
C
.
start
,
"days"
)}
function
w
(
t
){
var
e
=
C
.
start
.
day
();
return
t
+=
e
,
Math
.
floor
(
t
/
7
)
*
M
+
L
[(
t
%
7
+
7
)
%
7
]
-
L
[
e
]}
function
S
(
t
){
var
e
=
C
.
colCnt
,
n
=
_
?
-
1
:
1
,
i
=
_
?
e
-
1
:
0
,
r
=
Math
.
floor
(
t
/
e
),
s
=
(
t
%
e
+
e
)
%
e
*
n
+
i
;
return
{
row
:
r
,
col
:
s
}}
function
b
(
t
,
e
){
for
(
var
n
=
C
.
rowCnt
,
i
=
C
.
colCnt
,
r
=
[],
s
=
E
(
t
,
e
),
o
=
y
(
s
.
start
),
l
=
y
(
s
.
end
),
a
=
w
(
o
),
c
=
w
(
l
)
-
1
,
d
=
0
;
n
>
d
;
d
++
){
var
u
=
d
*
i
,
h
=
u
+
i
-
1
,
f
=
Math
.
max
(
a
,
u
),
g
=
Math
.
min
(
c
,
h
);
if
(
g
>=
f
){
var
m
=
S
(
f
),
v
=
S
(
g
),
b
=
[
m
.
col
,
v
.
col
].
sort
(),
D
=
p
(
f
)
==
o
,
T
=
p
(
g
)
+
1
==
l
;
r
.
push
({
row
:
d
,
leftCol
:
b
[
0
],
rightCol
:
b
[
1
],
isStart
:
D
,
isEnd
:
T
})}}
return
r
}
function
E
(
t
,
e
){
var
n
,
i
,
r
=
t
.
clone
().
stripTime
();
return
e
&&
(
n
=
e
.
clone
().
stripTime
(),
i
=+
e
.
time
(),
i
&&
i
>=
k
&&
n
.
add
(
1
,
"days"
)),(
!
e
||
r
>=
n
)
&&
(
n
=
r
.
clone
().
add
(
1
,
"days"
)),{
start
:
r
,
end
:
n
}}
function
D
(
t
){
var
e
=
E
(
t
.
start
,
t
.
end
);
return
e
.
end
.
diff
(
e
.
start
,
"days"
)
>
1
}
var
C
=
this
;
C
.
calendar
=
n
,
C
.
opt
=
i
,
C
.
trigger
=
r
,
C
.
isEventDraggable
=
s
,
C
.
isEventResizable
=
l
,
C
.
eventDrop
=
a
,
C
.
eventResize
=
c
;
var
H
=
n
.
reportEventChange
,
x
=
n
.
options
,
k
=
e
.
duration
(
x
.
nextDayThreshold
);
C
.
init
(),
C
.
getEventTimeText
=
function
(
t
,
e
){
var
r
,
s
;
return
"object"
==
typeof
t
&&
"object"
==
typeof
e
?(
r
=
t
,
s
=
e
,
e
=
arguments
[
2
]):(
r
=
t
.
start
,
s
=
t
.
end
),
e
=
e
||
i
(
"timeFormat"
),
s
&&
i
(
"displayEventEnd"
)?
n
.
formatRange
(
r
,
s
,
e
):
n
.
formatDate
(
r
,
e
)},
C
.
isHiddenDay
=
d
,
C
.
skipHiddenDays
=
h
,
C
.
getCellsPerWeek
=
u
,
C
.
dateToCell
=
v
,
C
.
dateToDayOffset
=
y
,
C
.
dayOffsetToCellOffset
=
w
,
C
.
cellOffsetToCell
=
S
,
C
.
cellToDate
=
f
,
C
.
cellToCellOffset
=
g
,
C
.
cellOffsetToDayOffset
=
p
,
C
.
dayOffsetToDate
=
m
,
C
.
rangeToSegments
=
b
,
C
.
isMultiDayEvent
=
D
;
var
M
,
R
=
i
(
"hiddenDays"
)
||
[],
F
=
[],
L
=
[],
z
=
[],
_
=
i
(
"isRTL"
);(
function
(){
i
(
"weekends"
)
===!
1
&&
R
.
push
(
0
,
6
);
for
(
var
e
=
0
,
n
=
0
;
7
>
e
;
e
++
)
L
[
e
]
=
n
,
F
[
e
]
=-
1
!=
t
.
inArray
(
e
,
R
),
F
[
e
]
||
(
z
[
n
]
=
e
,
n
++
);
if
(
M
=
n
,
!
M
)
throw
"invalid hiddenDays"
})()}
function
Ee
(
n
){
var
i
,
r
,
s
,
o
,
l
=
_e
.
dataAttrPrefix
;
return
l
&&
(
l
+=
"-"
),
i
=
n
.
data
(
l
+
"event"
)
||
null
,
i
&&
(
i
=
"object"
==
typeof
i
?
t
.
extend
({},
i
):{},
r
=
i
.
start
,
null
==
r
&&
(
r
=
i
.
time
),
s
=
i
.
duration
,
o
=
i
.
stick
,
delete
i
.
start
,
delete
i
.
time
,
delete
i
.
duration
,
delete
i
.
stick
),
null
==
r
&&
(
r
=
n
.
data
(
l
+
"start"
)),
null
==
r
&&
(
r
=
n
.
data
(
l
+
"time"
)),
null
==
s
&&
(
s
=
n
.
data
(
l
+
"duration"
)),
null
==
o
&&
(
o
=
n
.
data
(
l
+
"stick"
)),
r
=
null
!=
r
?
e
.
duration
(
r
):
null
,
s
=
null
!=
s
?
e
.
duration
(
s
):
null
,
o
=
Boolean
(
o
),{
eventProps
:
i
,
startTime
:
r
,
duration
:
s
,
stick
:
o
}}
function
De
(
t
){
be
.
call
(
this
,
t
),
this
.
dayGrid
=
new
ce
(
this
),
this
.
coordMap
=
this
.
dayGrid
.
coordMap
}
function
Te
(
t
){
De
.
call
(
this
,
t
)}
function
Ce
(
t
){
De
.
call
(
this
,
t
)}
function
He
(
t
){
De
.
call
(
this
,
t
)}
function
xe
(
t
,
e
){
return
e
.
longDateFormat
(
"LT"
).
replace
(
":mm"
,
"(:mm)"
).
replace
(
/
(\W
mm
)
$/
,
"($1)"
).
replace
(
/
\s
*a$/i
,
"a"
)}
function
ke
(
t
,
e
){
return
e
.
longDateFormat
(
"LT"
).
replace
(
/
\s
*a$/i
,
""
)}
function
Me
(
t
){
be
.
call
(
this
,
t
),
this
.
timeGrid
=
new
he
(
this
),
this
.
opt
(
"allDaySlot"
)?(
this
.
dayGrid
=
new
ce
(
this
),
this
.
coordMap
=
new
K
([
this
.
dayGrid
.
coordMap
,
this
.
timeGrid
.
coordMap
])):
this
.
coordMap
=
this
.
timeGrid
.
coordMap
}
function
Re
(
t
){
Me
.
call
(
this
,
t
)}
function
Pe
(
t
){
Me
.
call
(
this
,
t
)}
var
Fe
=
{
lang
:
"en"
,
defaultTimedEventDuration
:
"02:00:00"
,
defaultAllDayEventDuration
:{
days
:
1
},
forceEventDuration
:
!
1
,
nextDayThreshold
:
"09:00:00"
,
defaultView
:
"month"
,
aspectRatio
:
1.35
,
header
:{
left
:
"title"
,
center
:
""
,
right
:
"today prev,next"
},
weekends
:
!
0
,
weekNumbers
:
!
1
,
weekNumberTitle
:
"W"
,
weekNumberCalculation
:
"local"
,
lazyFetching
:
!
0
,
startParam
:
"start"
,
endParam
:
"end"
,
timezoneParam
:
"timezone"
,
timezone
:
!
1
,
titleFormat
:{
month
:
"MMMM YYYY"
,
week
:
"ll"
,
day
:
"LL"
},
columnFormat
:{
month
:
"ddd"
,
week
:
i
,
day
:
"dddd"
},
timeFormat
:{
"default"
:
n
},
displayEventEnd
:{
month
:
!
1
,
basicWeek
:
!
1
,
"default"
:
!
0
},
isRTL
:
!
1
,
defaultButtonText
:{
prev
:
"prev"
,
next
:
"next"
,
prevYear
:
"prev year"
,
nextYear
:
"next year"
,
today
:
"today"
,
month
:
"month"
,
week
:
"week"
,
day
:
"day"
},
buttonIcons
:{
prev
:
"left-single-arrow"
,
next
:
"right-single-arrow"
,
prevYear
:
"left-double-arrow"
,
nextYear
:
"right-double-arrow"
},
theme
:
!
1
,
themeButtonIcons
:{
prev
:
"circle-triangle-w"
,
next
:
"circle-triangle-e"
,
prevYear
:
"seek-prev"
,
nextYear
:
"seek-next"
},
dragOpacity
:.
75
,
dragRevertDuration
:
500
,
dragScroll
:
!
0
,
unselectAuto
:
!
0
,
dropAccept
:
"*"
,
eventLimit
:
!
1
,
eventLimitText
:
"more"
,
eventLimitClick
:
"popover"
,
dayPopoverFormat
:
"LL"
,
handleWindowResize
:
!
0
,
windowResizeDelay
:
200
},
Le
=
{
en
:{
columnFormat
:{
week
:
"ddd M/D"
},
dayPopoverFormat
:
"dddd, MMMM D"
}},
ze
=
{
header
:{
left
:
"next,prev today"
,
center
:
""
,
right
:
"title"
},
buttonIcons
:{
prev
:
"right-single-arrow"
,
next
:
"left-single-arrow"
,
prevYear
:
"right-double-arrow"
,
nextYear
:
"left-double-arrow"
},
themeButtonIcons
:{
prev
:
"circle-triangle-e"
,
next
:
"circle-triangle-w"
,
nextYear
:
"seek-prev"
,
prevYear
:
"seek-next"
}},
_e
=
t
.
fullCalendar
=
{
version
:
"2.2.0"
},
Ge
=
_e
.
views
=
{};
t
.
fn
.
fullCalendar
=
function
(
e
){
var
n
=
Array
.
prototype
.
slice
.
call
(
arguments
,
1
),
i
=
this
;
return
this
.
each
(
function
(
r
,
s
){
var
o
,
a
=
t
(
s
),
c
=
a
.
data
(
"fullCalendar"
);
"string"
==
typeof
e
?
c
&&
t
.
isFunction
(
c
[
e
])
&&
(
o
=
c
[
e
].
apply
(
c
,
n
),
r
||
(
i
=
o
),
"destroy"
===
e
&&
a
.
removeData
(
"fullCalendar"
)):
c
||
(
c
=
new
l
(
a
,
e
),
a
.
data
(
"fullCalendar"
,
c
),
c
.
render
())}),
i
},
_e
.
langs
=
Le
,
_e
.
datepickerLang
=
function
(
e
,
n
,
i
){
var
r
=
Le
[
e
];
r
||
(
r
=
Le
[
e
]
=
{}),
s
(
r
,{
isRTL
:
i
.
isRTL
,
weekNumberTitle
:
i
.
weekHeader
,
titleFormat
:{
month
:
i
.
showMonthAfterYear
?
"YYYY["
+
i
.
yearSuffix
+
"] MMMM"
:
"MMMM YYYY["
+
i
.
yearSuffix
+
"]"
},
defaultButtonText
:{
prev
:
L
(
i
.
prevText
),
next
:
L
(
i
.
nextText
),
today
:
L
(
i
.
currentText
)}}),
t
.
datepicker
&&
(
t
.
datepicker
.
regional
[
n
]
=
t
.
datepicker
.
regional
[
e
]
=
i
,
t
.
datepicker
.
regional
.
en
=
t
.
datepicker
.
regional
[
""
],
t
.
datepicker
.
setDefaults
(
i
))},
_e
.
lang
=
function
(
t
,
e
){
var
n
;
e
&&
(
n
=
Le
[
t
],
n
||
(
n
=
Le
[
t
]
=
{}),
s
(
n
,
e
||
{})),
Fe
.
lang
=
t
},
_e
.
sourceNormalizers
=
[],
_e
.
sourceFetchers
=
[];
var
Ne
=
{
dataType
:
"json"
,
cache
:
!
1
},
Ae
=
1
,
Ye
=
[
"sun"
,
"mon"
,
"tue"
,
"wed"
,
"thu"
,
"fri"
,
"sat"
];
_e
.
applyAll
=
R
;
var
Ve
,
Oe
,
Be
,
Ie
=
/^
\s
*
\d{4}
-
\d\d
$/
,
We
=
/^
\s
*
\d{4}
-
(?:(\d\d
-
\d\d)
|
(
W
\d\d
$
)
|
(
W
\d\d
-
\d)
|
(\d\d\d))((
T|
)(\d\d(
:
\d\d(
:
\d\d(\.\d
+
)?)?)?)?)?
$/
,
Ze
=
e
.
fn
,
je
=
t
.
extend
({},
Ze
);
_e
.
moment
=
function
(){
return
G
(
arguments
)},
_e
.
moment
.
utc
=
function
(){
var
t
=
G
(
arguments
,
!
0
);
return
t
.
hasTime
()
&&
t
.
utc
(),
t
},
_e
.
moment
.
parseZone
=
function
(){
return
G
(
arguments
,
!
0
,
!
0
)},
Ze
.
clone
=
function
(){
var
t
=
je
.
clone
.
apply
(
this
,
arguments
);
return
A
(
this
,
t
),
this
.
_fullCalendar
&&
(
t
.
_fullCalendar
=!
0
),
t
},
Ze
.
time
=
function
(
t
){
if
(
!
this
.
_fullCalendar
)
return
je
.
time
.
apply
(
this
,
arguments
);
if
(
null
==
t
)
return
e
.
duration
({
hours
:
this
.
hours
(),
minutes
:
this
.
minutes
(),
seconds
:
this
.
seconds
(),
milliseconds
:
this
.
milliseconds
()});
this
.
_ambigTime
=!
1
,
e
.
isDuration
(
t
)
||
e
.
isMoment
(
t
)
||
(
t
=
e
.
duration
(
t
));
var
n
=
0
;
return
e
.
isDuration
(
t
)
&&
(
n
=
24
*
Math
.
floor
(
t
.
asDays
())),
this
.
hours
(
n
+
t
.
hours
()).
minutes
(
t
.
minutes
()).
seconds
(
t
.
seconds
()).
milliseconds
(
t
.
milliseconds
())},
Ze
.
stripTime
=
function
(){
var
t
=
this
.
toArray
();
return
this
.
utc
(),
Oe
(
this
,
t
.
slice
(
0
,
3
)),
this
.
_ambigTime
=!
0
,
this
.
_ambigZone
=!
0
,
this
},
Ze
.
hasTime
=
function
(){
return
!
this
.
_ambigTime
},
Ze
.
stripZone
=
function
(){
var
t
=
this
.
toArray
(),
e
=
this
.
_ambigTime
;
return
this
.
utc
(),
Oe
(
this
,
t
),
e
&&
(
this
.
_ambigTime
=!
0
),
this
.
_ambigZone
=!
0
,
this
},
Ze
.
hasZone
=
function
(){
return
!
this
.
_ambigZone
},
Ze
.
zone
=
function
(
t
){
return
null
!=
t
&&
(
this
.
_ambigTime
=!
1
,
this
.
_ambigZone
=!
1
),
je
.
zone
.
apply
(
this
,
arguments
)},
Ze
.
local
=
function
(){
var
t
=
this
.
toArray
(),
e
=
this
.
_ambigZone
;
return
je
.
local
.
apply
(
this
,
arguments
),
e
&&
Be
(
this
,
t
),
this
},
Ze
.
format
=
function
(){
return
this
.
_fullCalendar
&&
arguments
[
0
]?
O
(
this
,
arguments
[
0
]):
this
.
_ambigTime
?
V
(
this
,
"YYYY-MM-DD"
):
this
.
_ambigZone
?
V
(
this
,
"YYYY-MM-DD[T]HH:mm:ss"
):
je
.
format
.
apply
(
this
,
arguments
)},
Ze
.
toISOString
=
function
(){
return
this
.
_ambigTime
?
V
(
this
,
"YYYY-MM-DD"
):
this
.
_ambigZone
?
V
(
this
,
"YYYY-MM-DD[T]HH:mm:ss"
):
je
.
toISOString
.
apply
(
this
,
arguments
)},
Ze
.
isWithin
=
function
(
t
,
e
){
var
n
=
N
([
this
,
t
,
e
]);
return
n
[
0
]
>=
n
[
1
]
&&
n
[
0
]
<
n
[
2
]},
Ze
.
isSame
=
function
(
t
,
e
){
var
n
;
return
this
.
_fullCalendar
?
e
?(
n
=
N
([
this
,
t
],
!
0
),
je
.
isSame
.
call
(
n
[
0
],
n
[
1
],
e
)):(
t
=
_e
.
moment
.
parseZone
(
t
),
je
.
isSame
.
call
(
this
,
t
)
&&
Boolean
(
this
.
_ambigTime
)
===
Boolean
(
t
.
_ambigTime
)
&&
Boolean
(
this
.
_ambigZone
)
===
Boolean
(
t
.
_ambigZone
)):
je
.
isSame
.
apply
(
this
,
arguments
)},
t
.
each
([
"isBefore"
,
"isAfter"
],
function
(
t
,
e
){
Ze
[
e
]
=
function
(
t
,
n
){
var
i
;
return
this
.
_fullCalendar
?(
i
=
N
([
this
,
t
]),
je
[
e
].
call
(
i
[
0
],
i
[
1
],
n
)):
je
[
e
].
apply
(
this
,
arguments
)}}),
Ve
=
"_d"
in
e
()
&&
"updateOffset"
in
e
,
Oe
=
Ve
?
function
(
t
,
n
){
t
.
_d
.
setTime
(
Date
.
UTC
.
apply
(
Date
,
n
)),
e
.
updateOffset
(
t
,
!
1
)}:
Y
,
Be
=
Ve
?
function
(
t
,
n
){
t
.
_d
.
setTime
(
+
new
Date
(
n
[
0
]
||
0
,
n
[
1
]
||
0
,
n
[
2
]
||
0
,
n
[
3
]
||
0
,
n
[
4
]
||
0
,
n
[
5
]
||
0
,
n
[
6
]
||
0
)),
e
.
updateOffset
(
t
,
!
1
)}:
Y
;
var
Xe
=
{
t
:
function
(
t
){
return
V
(
t
,
"a"
).
charAt
(
0
)},
T
:
function
(
t
){
return
V
(
t
,
"A"
).
charAt
(
0
)}};
_e
.
formatRange
=
W
;
var
$e
=
{
Y
:
"year"
,
M
:
"month"
,
D
:
"day"
,
d
:
"day"
,
A
:
"second"
,
a
:
"second"
,
T
:
"second"
,
t
:
"second"
,
H
:
"second"
,
h
:
"second"
,
m
:
"second"
,
s
:
"second"
},
qe
=
{};
q
.
prototype
=
{
isHidden
:
!
0
,
options
:
null
,
el
:
null
,
documentMousedownProxy
:
null
,
margin
:
10
,
show
:
function
(){
this
.
isHidden
&&
(
this
.
el
||
this
.
render
(),
this
.
el
.
show
(),
this
.
position
(),
this
.
isHidden
=!
1
,
this
.
trigger
(
"show"
))},
hide
:
function
(){
this
.
isHidden
||
(
this
.
el
.
hide
(),
this
.
isHidden
=!
0
,
this
.
trigger
(
"hide"
))},
render
:
function
(){
var
e
=
this
,
n
=
this
.
options
;
this
.
el
=
t
(
'<div class="fc-popover"/>'
).
addClass
(
n
.
className
||
""
).
css
({
top
:
0
,
left
:
0
}).
append
(
n
.
content
).
appendTo
(
n
.
parentEl
),
this
.
el
.
on
(
"click"
,
".fc-close"
,
function
(){
e
.
hide
()}),
n
.
autoHide
&&
t
(
document
).
on
(
"mousedown"
,
this
.
documentMousedownProxy
=
t
.
proxy
(
this
,
"documentMousedown"
))},
documentMousedown
:
function
(
e
){
this
.
el
&&!
t
(
e
.
target
).
closest
(
this
.
el
).
length
&&
this
.
hide
()},
destroy
:
function
(){
this
.
hide
(),
this
.
el
&&
(
this
.
el
.
remove
(),
this
.
el
=
null
),
t
(
document
).
off
(
"mousedown"
,
this
.
documentMousedownProxy
)
},
position
:
function
(){
var
e
,
n
,
i
,
r
,
s
,
o
=
this
.
options
,
l
=
this
.
el
.
offsetParent
().
offset
(),
a
=
this
.
el
.
outerWidth
(),
c
=
this
.
el
.
outerHeight
(),
d
=
t
(
window
),
u
=
S
(
this
.
el
);
r
=
o
.
top
||
0
,
s
=
void
0
!==
o
.
left
?
o
.
left
:
void
0
!==
o
.
right
?
o
.
right
-
a
:
0
,
u
.
is
(
window
)
||
u
.
is
(
document
)?(
u
=
d
,
e
=
0
,
n
=
0
):(
i
=
u
.
offset
(),
e
=
i
.
top
,
n
=
i
.
left
),
e
+=
d
.
scrollTop
(),
n
+=
d
.
scrollLeft
(),
o
.
viewportConstrain
!==!
1
&&
(
r
=
Math
.
min
(
r
,
e
+
u
.
outerHeight
()
-
c
-
this
.
margin
),
r
=
Math
.
max
(
r
,
e
+
this
.
margin
),
s
=
Math
.
min
(
s
,
n
+
u
.
outerWidth
()
-
a
-
this
.
margin
),
s
=
Math
.
max
(
s
,
n
+
this
.
margin
)),
this
.
el
.
css
({
top
:
r
-
l
.
top
,
left
:
s
-
l
.
left
})},
trigger
:
function
(
t
){
this
.
options
[
t
]
&&
this
.
options
[
t
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
))}},
U
.
prototype
=
{
grid
:
null
,
rows
:
null
,
cols
:
null
,
containerEl
:
null
,
minX
:
null
,
maxX
:
null
,
minY
:
null
,
maxY
:
null
,
build
:
function
(){
this
.
grid
.
buildCoords
(
this
.
rows
=
[],
this
.
cols
=
[]),
this
.
computeBounds
()},
getCell
:
function
(
t
,
e
){
var
n
,
i
=
null
,
r
=
this
.
rows
,
s
=
this
.
cols
,
o
=-
1
,
l
=-
1
;
if
(
this
.
inBounds
(
t
,
e
)){
for
(
n
=
0
;
r
.
length
>
n
;
n
++
)
if
(
e
>=
r
[
n
][
0
]
&&
r
[
n
][
1
]
>
e
){
o
=
n
;
break
}
for
(
n
=
0
;
s
.
length
>
n
;
n
++
)
if
(
t
>=
s
[
n
][
0
]
&&
s
[
n
][
1
]
>
t
){
l
=
n
;
break
}
o
>=
0
&&
l
>=
0
&&
(
i
=
{
row
:
o
,
col
:
l
},
i
.
grid
=
this
.
grid
,
i
.
date
=
this
.
grid
.
getCellDate
(
i
))}
return
i
},
computeBounds
:
function
(){
var
t
;
this
.
containerEl
&&
(
t
=
this
.
containerEl
.
offset
(),
this
.
minX
=
t
.
left
,
this
.
maxX
=
t
.
left
+
this
.
containerEl
.
outerWidth
(),
this
.
minY
=
t
.
top
,
this
.
maxY
=
t
.
top
+
this
.
containerEl
.
outerHeight
())},
inBounds
:
function
(
t
,
e
){
return
this
.
containerEl
?
t
>=
this
.
minX
&&
this
.
maxX
>
t
&&
e
>=
this
.
minY
&&
this
.
maxY
>
e
:
!
0
}},
K
.
prototype
=
{
coordMaps
:
null
,
build
:
function
(){
var
t
,
e
=
this
.
coordMaps
;
for
(
t
=
0
;
e
.
length
>
t
;
t
++
)
e
[
t
].
build
()},
getCell
:
function
(
t
,
e
){
var
n
,
i
=
this
.
coordMaps
,
r
=
null
;
for
(
n
=
0
;
i
.
length
>
n
&&!
r
;
n
++
)
r
=
i
[
n
].
getCell
(
t
,
e
);
return
r
}},
Q
.
prototype
=
{
coordMap
:
null
,
options
:
null
,
isListening
:
!
1
,
isDragging
:
!
1
,
origCell
:
null
,
origDate
:
null
,
cell
:
null
,
date
:
null
,
mouseX0
:
null
,
mouseY0
:
null
,
mousemoveProxy
:
null
,
mouseupProxy
:
null
,
scrollEl
:
null
,
scrollBounds
:
null
,
scrollTopVel
:
null
,
scrollLeftVel
:
null
,
scrollIntervalId
:
null
,
scrollHandlerProxy
:
null
,
scrollSensitivity
:
30
,
scrollSpeed
:
200
,
scrollIntervalMs
:
50
,
mousedown
:
function
(
t
){
E
(
t
)
&&
(
t
.
preventDefault
(),
this
.
startListening
(
t
),
this
.
options
.
distance
||
this
.
startDrag
(
t
))},
startListening
:
function
(
e
){
var
n
,
i
;
this
.
isListening
||
(
e
&&
this
.
options
.
scroll
&&
(
n
=
S
(
t
(
e
.
target
)),
n
.
is
(
window
)
||
n
.
is
(
document
)
||
(
this
.
scrollEl
=
n
,
this
.
scrollHandlerProxy
=
_
(
t
.
proxy
(
this
,
"scrollHandler"
),
100
),
this
.
scrollEl
.
on
(
"scroll"
,
this
.
scrollHandlerProxy
))),
this
.
computeCoords
(),
e
&&
(
i
=
this
.
getCell
(
e
),
this
.
origCell
=
i
,
this
.
origDate
=
i
?
i
.
date
:
null
,
this
.
mouseX0
=
e
.
pageX
,
this
.
mouseY0
=
e
.
pageY
),
t
(
document
).
on
(
"mousemove"
,
this
.
mousemoveProxy
=
t
.
proxy
(
this
,
"mousemove"
)).
on
(
"mouseup"
,
this
.
mouseupProxy
=
t
.
proxy
(
this
,
"mouseup"
)).
on
(
"selectstart"
,
this
.
preventDefault
),
this
.
isListening
=!
0
,
this
.
trigger
(
"listenStart"
,
e
))},
computeCoords
:
function
(){
this
.
coordMap
.
build
(),
this
.
computeScrollBounds
()},
mousemove
:
function
(
t
){
var
e
,
n
;
this
.
isDragging
||
(
e
=
this
.
options
.
distance
||
1
,
n
=
Math
.
pow
(
t
.
pageX
-
this
.
mouseX0
,
2
)
+
Math
.
pow
(
t
.
pageY
-
this
.
mouseY0
,
2
),
n
>=
e
*
e
&&
this
.
startDrag
(
t
)),
this
.
isDragging
&&
this
.
drag
(
t
)},
startDrag
:
function
(
t
){
var
e
;
this
.
isListening
||
this
.
startListening
(),
this
.
isDragging
||
(
this
.
isDragging
=!
0
,
this
.
trigger
(
"dragStart"
,
t
),
e
=
this
.
getCell
(
t
),
e
&&
this
.
cellOver
(
e
,
!
0
))},
drag
:
function
(
t
){
var
e
;
this
.
isDragging
&&
(
e
=
this
.
getCell
(
t
),
J
(
e
,
this
.
cell
)
||
(
this
.
cell
&&
this
.
cellOut
(),
e
&&
this
.
cellOver
(
e
)),
this
.
dragScroll
(
t
))},
cellOver
:
function
(
t
){
this
.
cell
=
t
,
this
.
date
=
t
.
date
,
this
.
trigger
(
"cellOver"
,
t
,
t
.
date
)},
cellOut
:
function
(){
this
.
cell
&&
(
this
.
trigger
(
"cellOut"
,
this
.
cell
),
this
.
cell
=
null
,
this
.
date
=
null
)},
mouseup
:
function
(
t
){
this
.
stopDrag
(
t
),
this
.
stopListening
(
t
)},
stopDrag
:
function
(
t
){
this
.
isDragging
&&
(
this
.
stopScrolling
(),
this
.
trigger
(
"dragStop"
,
t
),
this
.
isDragging
=!
1
)},
stopListening
:
function
(
e
){
this
.
isListening
&&
(
this
.
scrollEl
&&
(
this
.
scrollEl
.
off
(
"scroll"
,
this
.
scrollHandlerProxy
),
this
.
scrollHandlerProxy
=
null
),
t
(
document
).
off
(
"mousemove"
,
this
.
mousemoveProxy
).
off
(
"mouseup"
,
this
.
mouseupProxy
).
off
(
"selectstart"
,
this
.
preventDefault
),
this
.
mousemoveProxy
=
null
,
this
.
mouseupProxy
=
null
,
this
.
isListening
=!
1
,
this
.
trigger
(
"listenStop"
,
e
),
this
.
origCell
=
this
.
cell
=
null
,
this
.
origDate
=
this
.
date
=
null
)},
getCell
:
function
(
t
){
return
this
.
coordMap
.
getCell
(
t
.
pageX
,
t
.
pageY
)},
trigger
:
function
(
t
){
this
.
options
[
t
]
&&
this
.
options
[
t
].
apply
(
this
,
Array
.
prototype
.
slice
.
call
(
arguments
,
1
))},
preventDefault
:
function
(
t
){
t
.
preventDefault
()},
computeScrollBounds
:
function
(){
var
t
,
e
=
this
.
scrollEl
;
e
&&
(
t
=
e
.
offset
(),
this
.
scrollBounds
=
{
top
:
t
.
top
,
left
:
t
.
left
,
bottom
:
t
.
top
+
e
.
outerHeight
(),
right
:
t
.
left
+
e
.
outerWidth
()})},
dragScroll
:
function
(
t
){
var
e
,
n
,
i
,
r
,
s
=
this
.
scrollSensitivity
,
o
=
this
.
scrollBounds
,
l
=
0
,
a
=
0
;
o
&&
(
e
=
(
s
-
(
t
.
pageY
-
o
.
top
))
/
s
,
n
=
(
s
-
(
o
.
bottom
-
t
.
pageY
))
/
s
,
i
=
(
s
-
(
t
.
pageX
-
o
.
left
))
/
s
,
r
=
(
s
-
(
o
.
right
-
t
.
pageX
))
/
s
,
e
>=
0
&&
1
>=
e
?
l
=-
1
*
e
*
this
.
scrollSpeed
:
n
>=
0
&&
1
>=
n
&&
(
l
=
n
*
this
.
scrollSpeed
),
i
>=
0
&&
1
>=
i
?
a
=-
1
*
i
*
this
.
scrollSpeed
:
r
>=
0
&&
1
>=
r
&&
(
a
=
r
*
this
.
scrollSpeed
)),
this
.
setScrollVel
(
l
,
a
)},
setScrollVel
:
function
(
e
,
n
){
this
.
scrollTopVel
=
e
,
this
.
scrollLeftVel
=
n
,
this
.
constrainScrollVel
(),
!
this
.
scrollTopVel
&&!
this
.
scrollLeftVel
||
this
.
scrollIntervalId
||
(
this
.
scrollIntervalId
=
setInterval
(
t
.
proxy
(
this
,
"scrollIntervalFunc"
),
this
.
scrollIntervalMs
))},
constrainScrollVel
:
function
(){
var
t
=
this
.
scrollEl
;
0
>
this
.
scrollTopVel
?
0
>=
t
.
scrollTop
()
&&
(
this
.
scrollTopVel
=
0
):
this
.
scrollTopVel
>
0
&&
t
.
scrollTop
()
+
t
[
0
].
clientHeight
>=
t
[
0
].
scrollHeight
&&
(
this
.
scrollTopVel
=
0
),
0
>
this
.
scrollLeftVel
?
0
>=
t
.
scrollLeft
()
&&
(
this
.
scrollLeftVel
=
0
):
this
.
scrollLeftVel
>
0
&&
t
.
scrollLeft
()
+
t
[
0
].
clientWidth
>=
t
[
0
].
scrollWidth
&&
(
this
.
scrollLeftVel
=
0
)},
scrollIntervalFunc
:
function
(){
var
t
=
this
.
scrollEl
,
e
=
this
.
scrollIntervalMs
/
1
e3
;
this
.
scrollTopVel
&&
t
.
scrollTop
(
t
.
scrollTop
()
+
this
.
scrollTopVel
*
e
),
this
.
scrollLeftVel
&&
t
.
scrollLeft
(
t
.
scrollLeft
()
+
this
.
scrollLeftVel
*
e
),
this
.
constrainScrollVel
(),
this
.
scrollTopVel
||
this
.
scrollLeftVel
||
this
.
stopScrolling
()},
stopScrolling
:
function
(){
this
.
scrollIntervalId
&&
(
clearInterval
(
this
.
scrollIntervalId
),
this
.
scrollIntervalId
=
null
,
this
.
computeCoords
())},
scrollHandler
:
function
(){
this
.
scrollIntervalId
||
this
.
computeCoords
()}},
te
.
prototype
=
{
options
:
null
,
sourceEl
:
null
,
el
:
null
,
parentEl
:
null
,
top0
:
null
,
left0
:
null
,
mouseY0
:
null
,
mouseX0
:
null
,
topDelta
:
null
,
leftDelta
:
null
,
mousemoveProxy
:
null
,
isFollowing
:
!
1
,
isHidden
:
!
1
,
isAnimating
:
!
1
,
start
:
function
(
e
){
this
.
isFollowing
||
(
this
.
isFollowing
=!
0
,
this
.
mouseY0
=
e
.
pageY
,
this
.
mouseX0
=
e
.
pageX
,
this
.
topDelta
=
0
,
this
.
leftDelta
=
0
,
this
.
isHidden
||
this
.
updatePosition
(),
t
(
document
).
on
(
"mousemove"
,
this
.
mousemoveProxy
=
t
.
proxy
(
this
,
"mousemove"
)))},
stop
:
function
(
e
,
n
){
function
i
(){
this
.
isAnimating
=!
1
,
r
.
destroyEl
(),
this
.
top0
=
this
.
left0
=
null
,
n
&&
n
()}
var
r
=
this
,
s
=
this
.
options
.
revertDuration
;
this
.
isFollowing
&&!
this
.
isAnimating
&&
(
this
.
isFollowing
=!
1
,
t
(
document
).
off
(
"mousemove"
,
this
.
mousemoveProxy
),
e
&&
s
&&!
this
.
isHidden
?(
this
.
isAnimating
=!
0
,
this
.
el
.
animate
({
top
:
this
.
top0
,
left
:
this
.
left0
},{
duration
:
s
,
complete
:
i
})):
i
())},
getEl
:
function
(){
var
t
=
this
.
el
;
return
t
||
(
this
.
sourceEl
.
width
(),
t
=
this
.
el
=
this
.
sourceEl
.
clone
().
css
({
position
:
"absolute"
,
visibility
:
""
,
display
:
this
.
isHidden
?
"none"
:
""
,
margin
:
0
,
right
:
"auto"
,
bottom
:
"auto"
,
width
:
this
.
sourceEl
.
width
(),
height
:
this
.
sourceEl
.
height
(),
opacity
:
this
.
options
.
opacity
||
""
,
zIndex
:
this
.
options
.
zIndex
}).
appendTo
(
this
.
parentEl
)),
t
},
destroyEl
:
function
(){
this
.
el
&&
(
this
.
el
.
remove
(),
this
.
el
=
null
)},
updatePosition
:
function
(){
var
t
,
e
;
this
.
getEl
(),
null
===
this
.
top0
&&
(
this
.
sourceEl
.
width
(),
t
=
this
.
sourceEl
.
offset
(),
e
=
this
.
el
.
offsetParent
().
offset
(),
this
.
top0
=
t
.
top
-
e
.
top
,
this
.
left0
=
t
.
left
-
e
.
left
),
this
.
el
.
css
({
top
:
this
.
top0
+
this
.
topDelta
,
left
:
this
.
left0
+
this
.
leftDelta
})},
mousemove
:
function
(
t
){
this
.
topDelta
=
t
.
pageY
-
this
.
mouseY0
,
this
.
leftDelta
=
t
.
pageX
-
this
.
mouseX0
,
this
.
isHidden
||
this
.
updatePosition
()},
hide
:
function
(){
this
.
isHidden
||
(
this
.
isHidden
=!
0
,
this
.
el
&&
this
.
el
.
hide
())},
show
:
function
(){
this
.
isHidden
&&
(
this
.
isHidden
=!
1
,
this
.
updatePosition
(),
this
.
getEl
().
show
())}},
ee
.
prototype
=
{
view
:
null
,
cellHtml
:
"<td/>"
,
rowHtml
:
function
(
t
,
e
){
var
n
,
i
,
r
=
this
.
view
,
s
=
this
.
getHtmlRenderer
(
"cell"
,
t
),
o
=
""
;
for
(
e
=
e
||
0
,
n
=
0
;
r
.
colCnt
>
n
;
n
++
)
i
=
r
.
cellToDate
(
e
,
n
),
o
+=
s
(
e
,
n
,
i
);
return
o
=
this
.
bookendCells
(
o
,
t
,
e
),
"<tr>"
+
o
+
"</tr>"
},
bookendCells
:
function
(
t
,
e
,
n
){
var
i
=
this
.
view
,
r
=
this
.
getHtmlRenderer
(
"intro"
,
e
)(
n
||
0
),
s
=
this
.
getHtmlRenderer
(
"outro"
,
e
)(
n
||
0
),
o
=
i
.
opt
(
"isRTL"
),
l
=
o
?
s
:
r
,
a
=
o
?
r
:
s
;
return
"string"
==
typeof
t
?
l
+
t
+
a
:
t
.
prepend
(
l
).
append
(
a
)},
getHtmlRenderer
:
function
(
t
,
e
){
var
n
,
i
,
r
,
s
,
o
=
this
.
view
;
return
n
=
t
+
"Html"
,
e
&&
(
i
=
e
+
z
(
t
)
+
"Html"
),
i
&&
(
s
=
o
[
i
])?
r
=
o
:
i
&&
(
s
=
this
[
i
])?
r
=
this
:(
s
=
o
[
n
])?
r
=
o
:(
s
=
this
[
n
])
&&
(
r
=
this
),
"function"
==
typeof
s
?
function
(){
return
s
.
apply
(
r
,
arguments
)
||
""
}:
function
(){
return
s
||
""
}}},
ne
.
prototype
=
M
(
ee
.
prototype
),
t
.
extend
(
ne
.
prototype
,{
el
:
null
,
coordMap
:
null
,
cellDuration
:
null
,
elsByFill
:
null
,
render
:
function
(){
this
.
bindHandlers
()},
destroy
:
function
(){},
buildCoords
:
function
(){},
getCellDate
:
function
(){},
getCellDayEl
:
function
(){},
rangeToSegs
:
function
(){},
bindHandlers
:
function
(){
var
e
=
this
;
this
.
el
.
on
(
"mousedown"
,
function
(
n
){
t
(
n
.
target
).
is
(
".fc-event-container *, .fc-more"
)
||
t
(
n
.
target
).
closest
(
".fc-popover"
).
length
||
e
.
dayMousedown
(
n
)}),
this
.
bindSegHandlers
()},
dayMousedown
:
function
(
t
){
var
e
,
n
,
i
,
r
=
this
,
s
=
this
.
view
,
o
=
s
.
calendar
,
l
=
s
.
opt
(
"selectable"
),
a
=
null
,
c
=
new
Q
(
this
.
coordMap
,{
scroll
:
s
.
opt
(
"dragScroll"
),
dragStart
:
function
(){
s
.
unselect
()},
cellOver
:
function
(
t
,
s
){
c
.
origDate
&&
(
i
=
r
.
getCellDayEl
(
t
),
a
=
[
s
,
c
.
origDate
].
sort
(
x
),
e
=
a
[
0
],
n
=
a
[
1
].
clone
().
add
(
r
.
cellDuration
),
l
&&
(
o
.
isSelectionAllowedInRange
(
e
,
n
)?
r
.
renderSelection
(
e
,
n
):(
a
=
null
,
f
())))},
cellOut
:
function
(){
a
=
null
,
r
.
destroySelection
(),
g
()},
listenStop
:
function
(
t
){
a
&&
(
a
[
0
].
isSame
(
a
[
1
])
&&
s
.
trigger
(
"dayClick"
,
i
[
0
],
e
,
t
),
l
&&
s
.
reportSelection
(
e
,
n
,
t
)),
g
()}});
c
.
mousedown
(
t
)},
renderDrag
:
function
(){},
destroyDrag
:
function
(){},
renderResize
:
function
(){},
destroyResize
:
function
(){},
renderRangeHelper
:
function
(
t
,
e
,
n
){
var
i
,
r
=
this
.
view
;
!
e
&&
r
.
opt
(
"forceEventDuration"
)
&&
(
e
=
r
.
calendar
.
getDefaultEventEnd
(
!
t
.
hasTime
(),
t
)),
i
=
n
?
M
(
n
.
event
):{},
i
.
start
=
t
,
i
.
end
=
e
,
i
.
allDay
=!
(
t
.
hasTime
()
||
e
&&
e
.
hasTime
()),
i
.
className
=
(
i
.
className
||
[]).
concat
(
"fc-helper"
),
n
||
(
i
.
editable
=!
1
),
this
.
renderHelper
(
i
,
n
)},
renderHelper
:
function
(){},
destroyHelper
:
function
(){},
renderSelection
:
function
(
t
,
e
){
this
.
renderHighlight
(
t
,
e
)},
destroySelection
:
function
(){
this
.
destroyHighlight
()},
renderHighlight
:
function
(
t
,
e
){
this
.
renderFill
(
"highlight"
,
this
.
rangeToSegs
(
t
,
e
))},
destroyHighlight
:
function
(){
this
.
destroyFill
(
"highlight"
)},
highlightSegClasses
:
function
(){
return
[
"fc-highlight"
]},
renderFill
:
function
(){},
destroyFill
:
function
(
t
){
var
e
=
this
.
elsByFill
[
t
];
e
&&
(
e
.
remove
(),
delete
this
.
elsByFill
[
t
])},
renderFillSegEls
:
function
(
e
,
n
){
var
i
,
r
=
this
,
s
=
this
[
e
+
"SegEl"
],
o
=
""
,
l
=
[];
if
(
n
.
length
){
for
(
i
=
0
;
n
.
length
>
i
;
i
++
)
o
+=
this
.
fillSegHtml
(
e
,
n
[
i
]);
t
(
o
).
each
(
function
(
e
,
i
){
var
o
=
n
[
e
],
a
=
t
(
i
);
s
&&
(
a
=
s
.
call
(
r
,
o
,
a
)),
a
&&
(
a
=
t
(
a
),
a
.
is
(
r
.
fillSegTag
)
&&
(
o
.
el
=
a
,
l
.
push
(
o
)))})}
return
l
},
fillSegTag
:
"div"
,
fillSegHtml
:
function
(
t
,
e
){
var
n
=
this
[
t
+
"SegClasses"
],
i
=
this
[
t
+
"SegStyles"
],
r
=
n
?
n
.
call
(
this
,
e
):[],
s
=
i
?
i
.
call
(
this
,
e
):
""
;
return
"<"
+
this
.
fillSegTag
+
(
r
.
length
?
' class="'
+
r
.
join
(
" "
)
+
'"'
:
""
)
+
(
s
?
' style="'
+
s
+
'"'
:
""
)
+
" />"
},
headHtml
:
function
(){
return
'<div class="fc-row '
+
this
.
view
.
widgetHeaderClass
+
'">'
+
"<table>"
+
"<thead>"
+
this
.
rowHtml
(
"head"
)
+
"</thead>"
+
"</table>"
+
"</div>"
},
headCellHtml
:
function
(
t
,
e
,
n
){
var
i
=
this
.
view
,
r
=
i
.
calendar
,
s
=
i
.
opt
(
"columnFormat"
);
return
'<th class="fc-day-header '
+
i
.
widgetHeaderClass
+
" fc-"
+
Ye
[
n
.
day
()]
+
'">'
+
F
(
r
.
formatDate
(
n
,
s
))
+
"</th>"
},
bgCellHtml
:
function
(
t
,
e
,
n
){
var
i
=
this
.
view
,
r
=
this
.
getDayClasses
(
n
);
return
r
.
unshift
(
"fc-day"
,
i
.
widgetContentClass
),
'<td class="'
+
r
.
join
(
" "
)
+
'" data-date="'
+
n
.
format
()
+
'"></td>'
},
getDayClasses
:
function
(
t
){
var
e
=
this
.
view
,
n
=
e
.
calendar
.
getNow
().
stripTime
(),
i
=
[
"fc-"
+
Ye
[
t
.
day
()]];
return
"month"
===
e
.
name
&&
t
.
month
()
!=
e
.
intervalStart
.
month
()
&&
i
.
push
(
"fc-other-month"
),
t
.
isSame
(
n
,
"day"
)?
i
.
push
(
"fc-today"
,
e
.
highlightStateClass
):
n
>
t
?
i
.
push
(
"fc-past"
):
i
.
push
(
"fc-future"
),
i
}}),
t
.
extend
(
ne
.
prototype
,{
mousedOverSeg
:
null
,
isDraggingSeg
:
!
1
,
isResizingSeg
:
!
1
,
segs
:
null
,
renderEvents
:
function
(
t
){
var
e
,
n
,
i
=
this
.
eventsToSegs
(
t
),
r
=
[],
s
=
[];
for
(
e
=
0
;
i
.
length
>
e
;
e
++
)
n
=
i
[
e
],
ie
(
n
.
event
)?
r
.
push
(
n
):
s
.
push
(
n
);
r
=
this
.
renderBgSegs
(
r
)
||
r
,
s
=
this
.
renderFgSegs
(
s
)
||
s
,
this
.
segs
=
r
.
concat
(
s
)},
destroyEvents
:
function
(){
this
.
triggerSegMouseout
(),
this
.
destroyFgSegs
(),
this
.
destroyBgSegs
(),
this
.
segs
=
null
},
getSegs
:
function
(){
return
this
.
segs
||
[]},
renderFgSegs
:
function
(){},
destroyFgSegs
:
function
(){},
renderFgSegEls
:
function
(
e
,
n
){
var
i
,
r
=
this
.
view
,
s
=
""
,
o
=
[];
if
(
e
.
length
){
for
(
i
=
0
;
e
.
length
>
i
;
i
++
)
s
+=
this
.
fgSegHtml
(
e
[
i
],
n
);
t
(
s
).
each
(
function
(
n
,
i
){
var
s
=
e
[
n
],
l
=
r
.
resolveEventEl
(
s
.
event
,
t
(
i
));
l
&&
(
l
.
data
(
"fc-seg"
,
s
),
s
.
el
=
l
,
o
.
push
(
s
))})}
return
o
},
fgSegHtml
:
function
(){},
renderBgSegs
:
function
(
t
){
return
this
.
renderFill
(
"bgEvent"
,
t
)},
destroyBgSegs
:
function
(){
this
.
destroyFill
(
"bgEvent"
)},
bgEventSegEl
:
function
(
t
,
e
){
return
this
.
view
.
resolveEventEl
(
t
.
event
,
e
)},
bgEventSegClasses
:
function
(
t
){
var
e
=
t
.
event
,
n
=
e
.
source
||
{};
return
[
"fc-bgevent"
].
concat
(
e
.
className
,
n
.
className
||
[])},
bgEventSegStyles
:
function
(
t
){
var
e
=
this
.
view
,
n
=
t
.
event
,
i
=
n
.
source
||
{},
r
=
n
.
color
,
s
=
i
.
color
,
o
=
e
.
opt
(
"eventColor"
),
l
=
n
.
backgroundColor
||
r
||
i
.
backgroundColor
||
s
||
e
.
opt
(
"eventBackgroundColor"
)
||
o
;
return
l
?
"background-color:"
+
l
:
""
},
businessHoursSegClasses
:
function
(){
return
[
"fc-nonbusiness"
,
"fc-bgevent"
]},
bindSegHandlers
:
function
(){
var
e
=
this
,
n
=
this
.
view
;
t
.
each
({
mouseenter
:
function
(
t
,
n
){
e
.
triggerSegMouseover
(
t
,
n
)},
mouseleave
:
function
(
t
,
n
){
e
.
triggerSegMouseout
(
t
,
n
)},
click
:
function
(
t
,
e
){
return
n
.
trigger
(
"eventClick"
,
this
,
t
.
event
,
e
)},
mousedown
:
function
(
i
,
r
){
t
(
r
.
target
).
is
(
".fc-resizer"
)
&&
n
.
isEventResizable
(
i
.
event
)?
e
.
segResizeMousedown
(
i
,
r
):
n
.
isEventDraggable
(
i
.
event
)
&&
e
.
segDragMousedown
(
i
,
r
)}},
function
(
n
,
i
){
e
.
el
.
on
(
n
,
".fc-event-container > *"
,
function
(
n
){
var
r
=
t
(
this
).
data
(
"fc-seg"
);
return
!
r
||
e
.
isDraggingSeg
||
e
.
isResizingSeg
?
void
0
:
i
.
call
(
this
,
r
,
n
)})})},
triggerSegMouseover
:
function
(
t
,
e
){
this
.
mousedOverSeg
||
(
this
.
mousedOverSeg
=
t
,
this
.
view
.
trigger
(
"eventMouseover"
,
t
.
el
[
0
],
t
.
event
,
e
))},
triggerSegMouseout
:
function
(
t
,
e
){
e
=
e
||
{},
this
.
mousedOverSeg
&&
(
t
=
t
||
this
.
mousedOverSeg
,
this
.
mousedOverSeg
=
null
,
this
.
view
.
trigger
(
"eventMouseout"
,
t
.
el
[
0
],
t
.
event
,
e
))},
segDragMousedown
:
function
(
t
,
e
){
var
n
,
i
,
r
=
this
,
s
=
this
.
view
,
o
=
s
.
calendar
,
l
=
t
.
el
,
a
=
t
.
event
,
c
=
new
te
(
t
.
el
,{
parentEl
:
s
.
el
,
opacity
:
s
.
opt
(
"dragOpacity"
),
revertDuration
:
s
.
opt
(
"dragRevertDuration"
),
zIndex
:
2
}),
d
=
new
Q
(
s
.
coordMap
,{
distance
:
5
,
scroll
:
s
.
opt
(
"dragScroll"
),
listenStart
:
function
(
t
){
c
.
hide
(),
c
.
start
(
t
)},
dragStart
:
function
(
e
){
r
.
triggerSegMouseout
(
t
,
e
),
r
.
isDraggingSeg
=!
0
,
s
.
hideEvent
(
a
),
s
.
trigger
(
"eventDragStart"
,
l
[
0
],
a
,
e
,{})},
cellOver
:
function
(
e
,
l
){
var
u
=
t
.
cellDate
||
d
.
origDate
,
h
=
r
.
computeDraggedEventDates
(
t
,
u
,
l
);
n
=
h
.
start
,
i
=
h
.
end
,
o
.
isEventAllowedInRange
(
a
,
n
,
h
.
visibleEnd
)?
s
.
renderDrag
(
n
,
i
,
t
)?
c
.
hide
():
c
.
show
():(
n
=
null
,
c
.
show
(),
f
())},
cellOut
:
function
(){
n
=
null
,
s
.
destroyDrag
(),
c
.
show
(),
g
()},
dragStop
:
function
(
t
){
var
e
=
n
&&!
n
.
isSame
(
a
.
start
);
c
.
stop
(
!
e
,
function
(){
r
.
isDraggingSeg
=!
1
,
s
.
destroyDrag
(),
s
.
showEvent
(
a
),
s
.
trigger
(
"eventDragStop"
,
l
[
0
],
a
,
t
,{}),
e
&&
s
.
eventDrop
(
l
[
0
],
a
,
n
,
t
)}),
g
()},
listenStop
:
function
(){
c
.
stop
()}});
d
.
mousedown
(
e
)},
computeDraggedEventDates
:
function
(
t
,
e
,
n
){
var
i
,
r
,
s
,
o
,
l
,
a
=
this
.
view
,
c
=
t
.
event
,
d
=
c
.
start
,
u
=
a
.
calendar
.
getEventEnd
(
c
);
return
n
.
hasTime
()
===
e
.
hasTime
()?(
i
=
C
(
n
,
e
),
r
=
d
.
clone
().
add
(
i
),
s
=
null
===
c
.
end
?
null
:
u
.
clone
().
add
(
i
),
o
=
c
.
allDay
):(
r
=
n
,
s
=
null
,
o
=!
n
.
hasTime
()),
l
=
s
||
a
.
calendar
.
getDefaultEventEnd
(
o
,
r
),{
start
:
r
,
end
:
s
,
visibleEnd
:
l
}},
segResizeMousedown
:
function
(
t
,
e
){
function
n
(){
r
.
destroyResize
(),
s
.
showEvent
(
a
)}
var
i
,
r
=
this
,
s
=
this
.
view
,
o
=
s
.
calendar
,
l
=
t
.
el
,
a
=
t
.
event
,
c
=
a
.
start
,
d
=
s
.
calendar
.
getEventEnd
(
a
),
u
=
null
;
i
=
new
Q
(
this
.
coordMap
,{
distance
:
5
,
scroll
:
s
.
opt
(
"dragScroll"
),
dragStart
:
function
(
e
){
r
.
triggerSegMouseout
(
t
,
e
),
r
.
isResizingSeg
=!
0
,
s
.
trigger
(
"eventResizeStart"
,
l
[
0
],
a
,
e
,{})},
cellOver
:
function
(
e
,
i
){
i
.
isBefore
(
c
)
&&
(
i
=
c
),
u
=
i
.
clone
().
add
(
r
.
cellDuration
),
o
.
isEventAllowedInRange
(
a
,
c
,
u
)?
u
.
isSame
(
d
)?(
u
=
null
,
n
()):(
r
.
renderResize
(
c
,
u
,
t
),
s
.
hideEvent
(
a
)):(
u
=
null
,
n
(),
f
())},
cellOut
:
function
(){
u
=
null
,
n
(),
g
()},
dragStop
:
function
(
t
){
r
.
isResizingSeg
=!
1
,
n
(),
g
(),
s
.
trigger
(
"eventResizeStop"
,
l
[
0
],
a
,
t
,{}),
u
&&
s
.
eventResize
(
l
[
0
],
a
,
u
,
t
)}}),
i
.
mousedown
(
e
)},
getSegClasses
:
function
(
t
,
e
,
n
){
var
i
=
t
.
event
,
r
=
[
"fc-event"
,
t
.
isStart
?
"fc-start"
:
"fc-not-start"
,
t
.
isEnd
?
"fc-end"
:
"fc-not-end"
].
concat
(
i
.
className
,
i
.
source
?
i
.
source
.
className
:[]);
return
e
&&
r
.
push
(
"fc-draggable"
),
n
&&
r
.
push
(
"fc-resizable"
),
r
},
getEventSkinCss
:
function
(
t
){
var
e
=
this
.
view
,
n
=
t
.
source
||
{},
i
=
t
.
color
,
r
=
n
.
color
,
s
=
e
.
opt
(
"eventColor"
),
o
=
t
.
backgroundColor
||
i
||
n
.
backgroundColor
||
r
||
e
.
opt
(
"eventBackgroundColor"
)
||
s
,
l
=
t
.
borderColor
||
i
||
n
.
borderColor
||
r
||
e
.
opt
(
"eventBorderColor"
)
||
s
,
a
=
t
.
textColor
||
n
.
textColor
||
e
.
opt
(
"eventTextColor"
),
c
=
[];
return
o
&&
c
.
push
(
"background-color:"
+
o
),
l
&&
c
.
push
(
"border-color:"
+
l
),
a
&&
c
.
push
(
"color:"
+
a
),
c
.
join
(
";"
)},
eventsToSegs
:
function
(
t
,
e
){
var
n
,
i
=
this
.
eventsToRanges
(
t
),
r
=
[];
for
(
n
=
0
;
i
.
length
>
n
;
n
++
)
r
.
push
.
apply
(
r
,
this
.
eventRangeToSegs
(
i
[
n
],
e
));
return
r
},
eventsToRanges
:
function
(
e
){
var
n
=
this
,
i
=
oe
(
e
),
r
=
[];
return
t
.
each
(
i
,
function
(
t
,
e
){
e
.
length
&&
r
.
push
.
apply
(
r
,
re
(
e
[
0
])?
n
.
eventsToInverseRanges
(
e
):
n
.
eventsToNormalRanges
(
e
))}),
r
},
eventsToNormalRanges
:
function
(
t
){
var
e
,
n
,
i
,
r
,
s
=
this
.
view
.
calendar
,
o
=
[];
for
(
e
=
0
;
t
.
length
>
e
;
e
++
)
n
=
t
[
e
],
i
=
n
.
start
.
clone
().
stripZone
(),
r
=
s
.
getEventEnd
(
n
).
stripZone
(),
o
.
push
({
event
:
n
,
start
:
i
,
end
:
r
,
eventStartMS
:
+
i
,
eventDurationMS
:
r
-
i
});
return
o
},
eventsToInverseRanges
:
function
(
t
){
var
e
,
n
,
i
=
this
.
view
,
r
=
i
.
start
.
clone
().
stripZone
(),
s
=
i
.
end
.
clone
().
stripZone
(),
o
=
this
.
eventsToNormalRanges
(
t
),
l
=
[],
a
=
t
[
0
],
c
=
r
;
for
(
o
.
sort
(
le
),
e
=
0
;
o
.
length
>
e
;
e
++
)
n
=
o
[
e
],
n
.
start
>
c
&&
l
.
push
({
event
:
a
,
start
:
c
,
end
:
n
.
start
}),
c
=
n
.
end
;
return
s
>
c
&&
l
.
push
({
event
:
a
,
start
:
c
,
end
:
s
}),
l
},
eventRangeToSegs
:
function
(
t
,
e
){
var
n
,
i
,
r
;
for
(
n
=
e
?
e
(
t
.
start
,
t
.
end
):
this
.
rangeToSegs
(
t
.
start
,
t
.
end
),
i
=
0
;
n
.
length
>
i
;
i
++
)
r
=
n
[
i
],
r
.
event
=
t
.
event
,
r
.
eventStartMS
=
t
.
eventStartMS
,
r
.
eventDurationMS
=
t
.
eventDurationMS
;
return
n
}}),
ce
.
prototype
=
M
(
ne
.
prototype
),
t
.
extend
(
ce
.
prototype
,{
numbersVisible
:
!
1
,
cellDuration
:
e
.
duration
({
days
:
1
}),
bottomCoordPadding
:
0
,
rowEls
:
null
,
dayEls
:
null
,
helperEls
:
null
,
render
:
function
(
e
){
var
n
,
i
=
this
.
view
,
r
=
""
;
for
(
n
=
0
;
i
.
rowCnt
>
n
;
n
++
)
r
+=
this
.
dayRowHtml
(
n
,
e
);
this
.
el
.
html
(
r
),
this
.
rowEls
=
this
.
el
.
find
(
".fc-row"
),
this
.
dayEls
=
this
.
el
.
find
(
".fc-day"
),
this
.
dayEls
.
each
(
function
(
e
,
n
){
var
r
=
i
.
cellToDate
(
Math
.
floor
(
e
/
i
.
colCnt
),
e
%
i
.
colCnt
);
i
.
trigger
(
"dayRender"
,
null
,
r
,
t
(
n
))}),
ne
.
prototype
.
render
.
call
(
this
)},
destroy
:
function
(){
this
.
destroySegPopover
()},
dayRowHtml
:
function
(
t
,
e
){
var
n
=
this
.
view
,
i
=
[
"fc-row"
,
"fc-week"
,
n
.
widgetContentClass
];
return
e
&&
i
.
push
(
"fc-rigid"
),
'<div class="'
+
i
.
join
(
" "
)
+
'">'
+
'<div class="fc-bg">'
+
"<table>"
+
this
.
rowHtml
(
"day"
,
t
)
+
"</table>"
+
"</div>"
+
'<div class="fc-content-skeleton">'
+
"<table>"
+
(
this
.
numbersVisible
?
"<thead>"
+
this
.
rowHtml
(
"number"
,
t
)
+
"</thead>"
:
""
)
+
"</table>"
+
"</div>"
+
"</div>"
},
dayCellHtml
:
function
(
t
,
e
,
n
){
return
this
.
bgCellHtml
(
t
,
e
,
n
)},
buildCoords
:
function
(
e
,
n
){
var
i
,
r
,
s
,
o
=
this
.
view
.
colCnt
;
this
.
dayEls
.
slice
(
0
,
o
).
each
(
function
(
e
,
o
){
i
=
t
(
o
),
r
=
i
.
offset
().
left
,
e
&&
(
s
[
1
]
=
r
),
s
=
[
r
],
n
[
e
]
=
s
}),
s
[
1
]
=
r
+
i
.
outerWidth
(),
this
.
rowEls
.
each
(
function
(
n
,
o
){
i
=
t
(
o
),
r
=
i
.
offset
().
top
,
n
&&
(
s
[
1
]
=
r
),
s
=
[
r
],
e
[
n
]
=
s
}),
s
[
1
]
=
r
+
i
.
outerHeight
()
+
this
.
bottomCoordPadding
},
getCellDate
:
function
(
t
){
return
this
.
view
.
cellToDate
(
t
)},
getCellDayEl
:
function
(
t
){
return
this
.
dayEls
.
eq
(
t
.
row
*
this
.
view
.
colCnt
+
t
.
col
)},
rangeToSegs
:
function
(
t
,
e
){
return
this
.
view
.
rangeToSegments
(
t
,
e
)},
renderDrag
:
function
(
t
,
e
,
n
){
var
i
;
return
this
.
renderHighlight
(
t
,
e
||
this
.
view
.
calendar
.
getDefaultEventEnd
(
!
0
,
t
)),
n
&&!
n
.
el
.
closest
(
this
.
el
).
length
?(
this
.
renderRangeHelper
(
t
,
e
,
n
),
i
=
this
.
view
.
opt
(
"dragOpacity"
),
void
0
!==
i
&&
this
.
helperEls
.
css
(
"opacity"
,
i
),
!
0
):
void
0
},
destroyDrag
:
function
(){
this
.
destroyHighlight
(),
this
.
destroyHelper
()},
renderResize
:
function
(
t
,
e
,
n
){
this
.
renderHighlight
(
t
,
e
),
this
.
renderRangeHelper
(
t
,
e
,
n
)},
destroyResize
:
function
(){
this
.
destroyHighlight
(),
this
.
destroyHelper
()},
renderHelper
:
function
(
e
,
n
){
var
i
,
r
=
[],
s
=
this
.
eventsToSegs
([
e
]);
s
=
this
.
renderFgSegEls
(
s
),
i
=
this
.
renderSegRows
(
s
),
this
.
rowEls
.
each
(
function
(
e
,
s
){
var
o
,
l
=
t
(
s
),
a
=
t
(
'<div class="fc-helper-skeleton"><table/></div>'
);
o
=
n
&&
n
.
row
===
e
?
n
.
el
.
position
().
top
:
l
.
find
(
".fc-content-skeleton tbody"
).
position
().
top
,
a
.
css
(
"top"
,
o
).
find
(
"table"
).
append
(
i
[
e
].
tbodyEl
),
l
.
append
(
a
),
r
.
push
(
a
[
0
])}),
this
.
helperEls
=
t
(
r
)},
destroyHelper
:
function
(){
this
.
helperEls
&&
(
this
.
helperEls
.
remove
(),
this
.
helperEls
=
null
)},
fillSegTag
:
"td"
,
renderFill
:
function
(
e
,
n
){
var
i
,
r
,
s
,
o
=
[];
for
(
n
=
this
.
renderFillSegEls
(
e
,
n
),
i
=
0
;
n
.
length
>
i
;
i
++
)
r
=
n
[
i
],
s
=
this
.
renderFillRow
(
e
,
r
),
this
.
rowEls
.
eq
(
r
.
row
).
append
(
s
),
o
.
push
(
s
[
0
]);
return
this
.
elsByFill
[
e
]
=
t
(
o
),
n
},
renderFillRow
:
function
(
e
,
n
){
var
i
,
r
,
s
=
this
.
view
.
colCnt
,
o
=
n
.
leftCol
,
l
=
n
.
rightCol
+
1
;
return
i
=
t
(
'<div class="fc-'
+
e
.
toLowerCase
()
+
'-skeleton">'
+
"<table><tr/></table>"
+
"</div>"
),
r
=
i
.
find
(
"tr"
),
o
>
0
&&
r
.
append
(
'<td colspan="'
+
o
+
'"/>'
),
r
.
append
(
n
.
el
.
attr
(
"colspan"
,
l
-
o
)),
s
>
l
&&
r
.
append
(
'<td colspan="'
+
(
s
-
l
)
+
'"/>'
),
this
.
bookendCells
(
r
,
e
),
i
}}),
t
.
extend
(
ce
.
prototype
,{
rowStructs
:
null
,
destroyEvents
:
function
(){
this
.
destroySegPopover
(),
ne
.
prototype
.
destroyEvents
.
apply
(
this
,
arguments
)},
getSegs
:
function
(){
return
ne
.
prototype
.
getSegs
.
call
(
this
).
concat
(
this
.
popoverSegs
||
[])},
renderBgSegs
:
function
(
e
){
var
n
=
t
.
grep
(
e
,
function
(
t
){
return
t
.
event
.
allDay
});
return
ne
.
prototype
.
renderBgSegs
.
call
(
this
,
n
)},
renderFgSegs
:
function
(
e
){
var
n
;
return
e
=
this
.
renderFgSegEls
(
e
),
n
=
this
.
rowStructs
=
this
.
renderSegRows
(
e
),
this
.
rowEls
.
each
(
function
(
e
,
i
){
t
(
i
).
find
(
".fc-content-skeleton > table"
).
append
(
n
[
e
].
tbodyEl
)}),
e
},
destroyFgSegs
:
function
(){
for
(
var
t
,
e
=
this
.
rowStructs
||
[];
t
=
e
.
pop
();)
t
.
tbodyEl
.
remove
();
this
.
rowStructs
=
null
},
renderSegRows
:
function
(
t
){
var
e
,
n
,
i
=
[];
for
(
e
=
this
.
groupSegRows
(
t
),
n
=
0
;
e
.
length
>
n
;
n
++
)
i
.
push
(
this
.
renderSegRow
(
n
,
e
[
n
]));
return
i
},
fgSegHtml
:
function
(
t
,
e
){
var
n
,
i
=
this
.
view
,
r
=
i
.
opt
(
"isRTL"
),
s
=
t
.
event
,
o
=
i
.
isEventDraggable
(
s
),
l
=!
e
&&
s
.
allDay
&&
t
.
isEnd
&&
i
.
isEventResizable
(
s
),
a
=
this
.
getSegClasses
(
t
,
o
,
l
),
c
=
this
.
getEventSkinCss
(
s
),
d
=
""
;
return
a
.
unshift
(
"fc-day-grid-event"
),
!
s
.
allDay
&&
t
.
isStart
&&
(
d
=
'<span class="fc-time">'
+
F
(
i
.
getEventTimeText
(
s
))
+
"</span>"
),
n
=
'<span class="fc-title">'
+
(
F
(
s
.
title
||
""
)
||
" "
)
+
"</span>"
,
'<a class="'
+
a
.
join
(
" "
)
+
'"'
+
(
s
.
url
?
' href="'
+
F
(
s
.
url
)
+
'"'
:
""
)
+
(
c
?
' style="'
+
c
+
'"'
:
""
)
+
">"
+
'<div class="fc-content">'
+
(
r
?
n
+
" "
+
d
:
d
+
" "
+
n
)
+
"</div>"
+
(
l
?
'<div class="fc-resizer"/>'
:
""
)
+
"</a>"
},
renderSegRow
:
function
(
e
,
n
){
function
i
(
e
){
for
(;
e
>
o
;)
d
=
(
y
[
r
-
1
]
||
[])[
o
],
d
?
d
.
attr
(
"rowspan"
,
parseInt
(
d
.
attr
(
"rowspan"
)
||
1
,
10
)
+
1
):(
d
=
t
(
"<td/>"
),
l
.
append
(
d
)),
v
[
r
][
o
]
=
d
,
y
[
r
][
o
]
=
d
,
o
++
}
var
r
,
s
,
o
,
l
,
a
,
c
,
d
,
u
=
this
.
view
,
h
=
u
.
colCnt
,
f
=
this
.
buildSegLevels
(
n
),
g
=
Math
.
max
(
1
,
f
.
length
),
p
=
t
(
"<tbody/>"
),
m
=
[],
v
=
[],
y
=
[];
for
(
r
=
0
;
g
>
r
;
r
++
){
if
(
s
=
f
[
r
],
o
=
0
,
l
=
t
(
"<tr/>"
),
m
.
push
([]),
v
.
push
([]),
y
.
push
([]),
s
)
for
(
a
=
0
;
s
.
length
>
a
;
a
++
){
for
(
c
=
s
[
a
],
i
(
c
.
leftCol
),
d
=
t
(
'<td class="fc-event-container"/>'
).
append
(
c
.
el
),
c
.
leftCol
!=
c
.
rightCol
?
d
.
attr
(
"colspan"
,
c
.
rightCol
-
c
.
leftCol
+
1
):
y
[
r
][
o
]
=
d
;
c
.
rightCol
>=
o
;)
v
[
r
][
o
]
=
d
,
m
[
r
][
o
]
=
c
,
o
++
;
l
.
append
(
d
)}
i
(
h
),
this
.
bookendCells
(
l
,
"eventSkeleton"
),
p
.
append
(
l
)}
return
{
row
:
e
,
tbodyEl
:
p
,
cellMatrix
:
v
,
segMatrix
:
m
,
segLevels
:
f
,
segs
:
n
}},
buildSegLevels
:
function
(
t
){
var
e
,
n
,
i
,
r
=
[];
for
(
t
.
sort
(
ae
),
e
=
0
;
t
.
length
>
e
;
e
++
){
for
(
n
=
t
[
e
],
i
=
0
;
r
.
length
>
i
&&
de
(
n
,
r
[
i
]);
i
++
);
n
.
level
=
i
,(
r
[
i
]
||
(
r
[
i
]
=
[])).
push
(
n
)}
for
(
i
=
0
;
r
.
length
>
i
;
i
++
)
r
[
i
].
sort
(
ue
);
return
r
},
groupSegRows
:
function
(
t
){
var
e
,
n
=
this
.
view
,
i
=
[];
for
(
e
=
0
;
n
.
rowCnt
>
e
;
e
++
)
i
.
push
([]);
for
(
e
=
0
;
t
.
length
>
e
;
e
++
)
i
[
t
[
e
].
row
].
push
(
t
[
e
]);
return
i
}}),
t
.
extend
(
ce
.
prototype
,{
segPopover
:
null
,
popoverSegs
:
null
,
destroySegPopover
:
function
(){
this
.
segPopover
&&
this
.
segPopover
.
hide
()},
limitRows
:
function
(
t
){
var
e
,
n
,
i
=
this
.
rowStructs
||
[];
for
(
e
=
0
;
i
.
length
>
e
;
e
++
)
this
.
unlimitRow
(
e
),
n
=
t
?
"number"
==
typeof
t
?
t
:
this
.
computeRowLevelLimit
(
e
):
!
1
,
n
!==!
1
&&
this
.
limitRow
(
e
,
n
)},
computeRowLevelLimit
:
function
(
t
){
var
e
,
n
,
i
=
this
.
rowEls
.
eq
(
t
),
r
=
i
.
height
(),
s
=
this
.
rowStructs
[
t
].
tbodyEl
.
children
();
for
(
e
=
0
;
s
.
length
>
e
;
e
++
)
if
(
n
=
s
.
eq
(
e
).
removeClass
(
"fc-limited"
),
n
.
position
().
top
+
n
.
outerHeight
()
>
r
)
return
e
;
return
!
1
},
limitRow
:
function
(
e
,
n
){
function
i
(
i
){
for
(;
i
>
T
;)
r
=
{
row
:
e
,
col
:
T
},
d
=
S
.
getCellSegs
(
r
,
n
),
d
.
length
&&
(
f
=
o
[
n
-
1
][
T
],
w
=
S
.
renderMoreLink
(
r
,
d
),
y
=
t
(
"<div/>"
).
append
(
w
),
f
.
append
(
y
),
D
.
push
(
y
[
0
])),
T
++
}
var
r
,
s
,
o
,
l
,
a
,
c
,
d
,
u
,
h
,
f
,
g
,
p
,
m
,
v
,
y
,
w
,
S
=
this
,
b
=
this
.
view
,
E
=
this
.
rowStructs
[
e
],
D
=
[],
T
=
0
;
if
(
n
&&
E
.
segLevels
.
length
>
n
){
for
(
s
=
E
.
segLevels
[
n
-
1
],
o
=
E
.
cellMatrix
,
l
=
E
.
tbodyEl
.
children
().
slice
(
n
).
addClass
(
"fc-limited"
).
get
(),
a
=
0
;
s
.
length
>
a
;
a
++
){
for
(
c
=
s
[
a
],
i
(
c
.
leftCol
),
h
=
[],
u
=
0
;
c
.
rightCol
>=
T
;)
r
=
{
row
:
e
,
col
:
T
},
d
=
this
.
getCellSegs
(
r
,
n
),
h
.
push
(
d
),
u
+=
d
.
length
,
T
++
;
if
(
u
){
for
(
f
=
o
[
n
-
1
][
c
.
leftCol
],
g
=
f
.
attr
(
"rowspan"
)
||
1
,
p
=
[],
m
=
0
;
h
.
length
>
m
;
m
++
)
v
=
t
(
'<td class="fc-more-cell"/>'
).
attr
(
"rowspan"
,
g
),
d
=
h
[
m
],
r
=
{
row
:
e
,
col
:
c
.
leftCol
+
m
},
w
=
this
.
renderMoreLink
(
r
,[
c
].
concat
(
d
)),
y
=
t
(
"<div/>"
).
append
(
w
),
v
.
append
(
y
),
p
.
push
(
v
[
0
]),
D
.
push
(
v
[
0
]);
f
.
addClass
(
"fc-limited"
).
after
(
t
(
p
)),
l
.
push
(
f
[
0
])}}
i
(
b
.
colCnt
),
E
.
moreEls
=
t
(
D
),
E
.
limitedEls
=
t
(
l
)}},
unlimitRow
:
function
(
t
){
var
e
=
this
.
rowStructs
[
t
];
e
.
moreEls
&&
(
e
.
moreEls
.
remove
(),
e
.
moreEls
=
null
),
e
.
limitedEls
&&
(
e
.
limitedEls
.
removeClass
(
"fc-limited"
),
e
.
limitedEls
=
null
)},
renderMoreLink
:
function
(
e
,
n
){
var
i
=
this
,
r
=
this
.
view
;
return
t
(
'<a class="fc-more"/>'
).
text
(
this
.
getMoreLinkText
(
n
.
length
)).
on
(
"click"
,
function
(
s
){
var
o
=
r
.
opt
(
"eventLimitClick"
),
l
=
r
.
cellToDate
(
e
),
a
=
t
(
this
),
c
=
i
.
getCellDayEl
(
e
),
d
=
i
.
getCellSegs
(
e
),
u
=
i
.
resliceDaySegs
(
d
,
l
),
h
=
i
.
resliceDaySegs
(
n
,
l
);
"function"
==
typeof
o
&&
(
o
=
r
.
trigger
(
"eventLimitClick"
,
null
,{
date
:
l
,
dayEl
:
c
,
moreEl
:
a
,
segs
:
u
,
hiddenSegs
:
h
},
s
)),
"popover"
===
o
?
i
.
showSegPopover
(
l
,
e
,
a
,
u
):
"string"
==
typeof
o
&&
r
.
calendar
.
zoomTo
(
l
,
o
)})},
showSegPopover
:
function
(
t
,
e
,
n
,
i
){
var
r
,
s
,
o
=
this
,
l
=
this
.
view
,
a
=
n
.
parent
();
r
=
1
==
l
.
rowCnt
?
this
.
view
.
el
:
this
.
rowEls
.
eq
(
e
.
row
),
s
=
{
className
:
"fc-more-popover"
,
content
:
this
.
renderSegPopoverContent
(
t
,
i
),
parentEl
:
this
.
el
,
top
:
r
.
offset
().
top
,
autoHide
:
!
0
,
viewportConstrain
:
l
.
opt
(
"popoverViewportConstrain"
),
hide
:
function
(){
o
.
segPopover
.
destroy
(),
o
.
segPopover
=
null
,
o
.
popoverSegs
=
null
}},
l
.
opt
(
"isRTL"
)?
s
.
right
=
a
.
offset
().
left
+
a
.
outerWidth
()
+
1
:
s
.
left
=
a
.
offset
().
left
-
1
,
this
.
segPopover
=
new
q
(
s
),
this
.
segPopover
.
show
()},
renderSegPopoverContent
:
function
(
e
,
n
){
var
i
,
r
=
this
.
view
,
s
=
r
.
opt
(
"theme"
),
o
=
e
.
format
(
r
.
opt
(
"dayPopoverFormat"
)),
l
=
t
(
'<div class="fc-header '
+
r
.
widgetHeaderClass
+
'">'
+
'<span class="fc-close '
+
(
s
?
"ui-icon ui-icon-closethick"
:
"fc-icon fc-icon-x"
)
+
'"></span>'
+
'<span class="fc-title">'
+
F
(
o
)
+
"</span>"
+
'<div class="fc-clear"/>'
+
"</div>"
+
'<div class="fc-body '
+
r
.
widgetContentClass
+
'">'
+
'<div class="fc-event-container"></div>'
+
"</div>"
),
a
=
l
.
find
(
".fc-event-container"
);
for
(
n
=
this
.
renderFgSegEls
(
n
,
!
0
),
this
.
popoverSegs
=
n
,
i
=
0
;
n
.
length
>
i
;
i
++
)
n
[
i
].
cellDate
=
e
,
a
.
append
(
n
[
i
].
el
);
return
l
},
resliceDaySegs
:
function
(
e
,
n
){
var
i
=
t
.
map
(
e
,
function
(
t
){
return
t
.
event
}),
r
=
n
.
clone
().
stripTime
(),
s
=
r
.
clone
().
add
(
1
,
"days"
);
return
this
.
eventsToSegs
(
i
,
function
(
t
,
e
){
var
n
=
D
(
t
,
e
,
r
,
s
);
return
n
?[
n
]:[]})},
getMoreLinkText
:
function
(
t
){
var
e
=
this
.
view
,
n
=
e
.
opt
(
"eventLimitText"
);
return
"function"
==
typeof
n
?
n
(
t
):
"+"
+
t
+
" "
+
n
},
getCellSegs
:
function
(
t
,
e
){
for
(
var
n
,
i
=
this
.
rowStructs
[
t
.
row
].
segMatrix
,
r
=
e
||
0
,
s
=
[];
i
.
length
>
r
;)
n
=
i
[
r
][
t
.
col
],
n
&&
s
.
push
(
n
),
r
++
;
return
s
}}),
he
.
prototype
=
M
(
ne
.
prototype
),
t
.
extend
(
he
.
prototype
,{
slotDuration
:
null
,
snapDuration
:
null
,
minTime
:
null
,
maxTime
:
null
,
dayEls
:
null
,
slatEls
:
null
,
slatTops
:
null
,
helperEl
:
null
,
businessHourSegs
:
null
,
render
:
function
(){
this
.
processOptions
(),
this
.
el
.
html
(
this
.
renderHtml
()),
this
.
dayEls
=
this
.
el
.
find
(
".fc-day"
),
this
.
slatEls
=
this
.
el
.
find
(
".fc-slats tr"
),
this
.
computeSlatTops
(),
this
.
renderBusinessHours
(),
ne
.
prototype
.
render
.
call
(
this
)},
renderBusinessHours
:
function
(){
var
t
=
this
.
view
.
calendar
.
getBusinessHoursEvents
();
this
.
businessHourSegs
=
this
.
renderFill
(
"businessHours"
,
this
.
eventsToSegs
(
t
),
"bgevent"
)},
renderHtml
:
function
(){
return
'<div class="fc-bg"><table>'
+
this
.
rowHtml
(
"slotBg"
)
+
"</table>"
+
"</div>"
+
'<div class="fc-slats">'
+
"<table>"
+
this
.
slatRowHtml
()
+
"</table>"
+
"</div>"
},
slotBgCellHtml
:
function
(
t
,
e
,
n
){
return
this
.
bgCellHtml
(
t
,
e
,
n
)},
slatRowHtml
:
function
(){
for
(
var
t
,
n
,
i
,
r
=
this
.
view
,
s
=
r
.
calendar
,
o
=
r
.
opt
(
"isRTL"
),
l
=
""
,
a
=
0
===
this
.
slotDuration
.
asMinutes
()
%
15
,
c
=
e
.
duration
(
+
this
.
minTime
);
this
.
maxTime
>
c
;)
t
=
r
.
start
.
clone
().
time
(
c
),
n
=
t
.
minutes
(),
i
=
'<td class="fc-axis fc-time '
+
r
.
widgetContentClass
+
'" '
+
r
.
axisStyleAttr
()
+
">"
+
(
a
&&
n
?
""
:
"<span>"
+
F
(
s
.
formatDate
(
t
,
r
.
opt
(
"axisFormat"
)))
+
"</span>"
)
+
"</td>"
,
l
+=
"<tr "
+
(
n
?
'class="fc-minor"'
:
""
)
+
">"
+
(
o
?
""
:
i
)
+
'<td class="'
+
r
.
widgetContentClass
+
'"/>'
+
(
o
?
i
:
""
)
+
"</tr>"
,
c
.
add
(
this
.
slotDuration
);
return
l
},
processOptions
:
function
(){
var
t
=
this
.
view
,
n
=
t
.
opt
(
"slotDuration"
),
i
=
t
.
opt
(
"snapDuration"
);
n
=
e
.
duration
(
n
),
i
=
i
?
e
.
duration
(
i
):
n
,
this
.
slotDuration
=
n
,
this
.
snapDuration
=
i
,
this
.
cellDuration
=
i
,
this
.
minTime
=
e
.
duration
(
t
.
opt
(
"minTime"
)),
this
.
maxTime
=
e
.
duration
(
t
.
opt
(
"maxTime"
))},
rangeToSegs
:
function
(
t
,
e
){
var
n
,
i
,
r
,
s
,
o
,
l
=
this
.
view
,
a
=
[];
for
(
t
=
t
.
clone
().
stripZone
(),
e
=
e
.
clone
().
stripZone
(),
i
=
0
;
l
.
colCnt
>
i
;
i
++
)
r
=
l
.
cellToDate
(
0
,
i
),
s
=
r
.
clone
().
time
(
this
.
minTime
),
o
=
r
.
clone
().
time
(
this
.
maxTime
),
n
=
D
(
t
,
e
,
s
,
o
),
n
&&
(
n
.
col
=
i
,
a
.
push
(
n
));
return
a
},
resize
:
function
(){
this
.
computeSlatTops
(),
this
.
updateSegVerticals
()},
buildCoords
:
function
(
n
,
i
){
var
r
,
s
,
o
=
this
.
view
.
colCnt
,
l
=
this
.
el
.
offset
().
top
,
a
=
e
.
duration
(
+
this
.
minTime
),
c
=
null
;
for
(
this
.
dayEls
.
slice
(
0
,
o
).
each
(
function
(
e
,
n
){
r
=
t
(
n
),
s
=
r
.
offset
().
left
,
c
&&
(
c
[
1
]
=
s
),
c
=
[
s
],
i
[
e
]
=
c
}),
c
[
1
]
=
s
+
r
.
outerWidth
(),
c
=
null
;
this
.
maxTime
>
a
;)
s
=
l
+
this
.
computeTimeTop
(
a
),
c
&&
(
c
[
1
]
=
s
),
c
=
[
s
],
n
.
push
(
c
),
a
.
add
(
this
.
snapDuration
);
c
[
1
]
=
l
+
this
.
computeTimeTop
(
a
)},
getCellDate
:
function
(
t
){
var
e
=
this
.
view
,
n
=
e
.
calendar
;
return
n
.
rezoneDate
(
e
.
cellToDate
(
0
,
t
.
col
).
time
(
this
.
minTime
+
this
.
snapDuration
*
t
.
row
))},
getCellDayEl
:
function
(
t
){
return
this
.
dayEls
.
eq
(
t
.
col
)},
computeDateTop
:
function
(
t
,
n
){
return
this
.
computeTimeTop
(
e
.
duration
(
t
.
clone
().
stripZone
()
-
n
.
clone
().
stripTime
()))},
computeTimeTop
:
function
(
t
){
var
e
,
n
,
i
,
r
,
s
=
(
t
-
this
.
minTime
)
/
this
.
slotDuration
;
return
s
=
Math
.
max
(
0
,
s
),
s
=
Math
.
min
(
this
.
slatEls
.
length
,
s
),
e
=
Math
.
floor
(
s
),
n
=
s
-
e
,
i
=
this
.
slatTops
[
e
],
n
?(
r
=
this
.
slatTops
[
e
+
1
],
i
+
(
r
-
i
)
*
n
):
i
},
computeSlatTops
:
function
(){
var
e
,
n
=
[];
this
.
slatEls
.
each
(
function
(
i
,
r
){
e
=
t
(
r
).
position
().
top
,
n
.
push
(
e
)}),
n
.
push
(
e
+
this
.
slatEls
.
last
().
outerHeight
()),
this
.
slatTops
=
n
},
renderDrag
:
function
(
t
,
e
,
n
){
var
i
;
return
n
?(
this
.
renderRangeHelper
(
t
,
e
,
n
),
i
=
this
.
view
.
opt
(
"dragOpacity"
),
void
0
!==
i
&&
this
.
helperEl
.
css
(
"opacity"
,
i
),
!
0
):(
this
.
renderHighlight
(
t
,
e
||
this
.
view
.
calendar
.
getDefaultEventEnd
(
!
1
,
t
)),
void
0
)},
destroyDrag
:
function
(){
this
.
destroyHelper
(),
this
.
destroyHighlight
()},
renderResize
:
function
(
t
,
e
,
n
){
this
.
renderRangeHelper
(
t
,
e
,
n
)},
destroyResize
:
function
(){
this
.
destroyHelper
()},
renderHelper
:
function
(
e
,
n
){
var
i
,
r
,
s
,
o
,
l
=
this
.
eventsToSegs
([
e
]);
for
(
l
=
this
.
renderFgSegEls
(
l
),
i
=
this
.
renderSegTable
(
l
),
r
=
0
;
l
.
length
>
r
;
r
++
)
s
=
l
[
r
],
n
&&
n
.
col
===
s
.
col
&&
(
o
=
n
.
el
,
s
.
el
.
css
({
left
:
o
.
css
(
"left"
),
right
:
o
.
css
(
"right"
),
"margin-left"
:
o
.
css
(
"margin-left"
),
"margin-right"
:
o
.
css
(
"margin-right"
)}));
this
.
helperEl
=
t
(
'<div class="fc-helper-skeleton"/>'
).
append
(
i
).
appendTo
(
this
.
el
)},
destroyHelper
:
function
(){
this
.
helperEl
&&
(
this
.
helperEl
.
remove
(),
this
.
helperEl
=
null
)},
renderSelection
:
function
(
t
,
e
){
this
.
view
.
opt
(
"selectHelper"
)?
this
.
renderRangeHelper
(
t
,
e
):
this
.
renderHighlight
(
t
,
e
)},
destroySelection
:
function
(){
this
.
destroyHelper
(),
this
.
destroyHighlight
()},
renderFill
:
function
(
e
,
n
,
i
){
var
r
,
s
,
o
,
l
,
a
,
c
,
d
,
u
,
h
,
f
,
g
=
this
.
view
;
if
(
n
.
length
){
for
(
n
=
this
.
renderFillSegEls
(
e
,
n
),
r
=
this
.
groupSegCols
(
n
),
i
=
i
||
e
.
toLowerCase
(),
s
=
t
(
'<div class="fc-'
+
i
+
'-skeleton">'
+
"<table><tr/></table>"
+
"</div>"
),
o
=
s
.
find
(
"tr"
),
l
=
0
;
r
.
length
>
l
;
l
++
)
if
(
a
=
r
[
l
],
c
=
t
(
"<td/>"
).
appendTo
(
o
),
a
.
length
)
for
(
d
=
t
(
'<div class="fc-'
+
i
+
'-container"/>'
).
appendTo
(
c
),
u
=
g
.
cellToDate
(
0
,
l
),
h
=
0
;
a
.
length
>
h
;
h
++
)
f
=
a
[
h
],
d
.
append
(
f
.
el
.
css
({
top
:
this
.
computeDateTop
(
f
.
start
,
u
),
bottom
:
-
this
.
computeDateTop
(
f
.
end
,
u
)}));
this
.
bookendCells
(
o
,
e
),
this
.
el
.
append
(
s
),
this
.
elsByFill
[
e
]
=
s
}
return
n
}}),
t
.
extend
(
he
.
prototype
,{
eventSkeletonEl
:
null
,
renderFgSegs
:
function
(
e
){
return
e
=
this
.
renderFgSegEls
(
e
),
this
.
el
.
append
(
this
.
eventSkeletonEl
=
t
(
'<div class="fc-content-skeleton"/>'
).
append
(
this
.
renderSegTable
(
e
))),
e
},
destroyFgSegs
:
function
(){
this
.
eventSkeletonEl
&&
(
this
.
eventSkeletonEl
.
remove
(),
this
.
eventSkeletonEl
=
null
)},
renderSegTable
:
function
(
e
){
var
n
,
i
,
r
,
s
,
o
,
l
,
a
=
t
(
"<table><tr/></table>"
),
c
=
a
.
find
(
"tr"
);
for
(
n
=
this
.
groupSegCols
(
e
),
this
.
computeSegVerticals
(
e
),
s
=
0
;
n
.
length
>
s
;
s
++
){
for
(
o
=
n
[
s
],
fe
(
o
),
l
=
t
(
'<div class="fc-event-container"/>'
),
i
=
0
;
o
.
length
>
i
;
i
++
)
r
=
o
[
i
],
r
.
el
.
css
(
this
.
generateSegPositionCss
(
r
)),
30
>
r
.
bottom
-
r
.
top
&&
r
.
el
.
addClass
(
"fc-short"
),
l
.
append
(
r
.
el
);
c
.
append
(
t
(
"<td/>"
).
append
(
l
))}
return
this
.
bookendCells
(
c
,
"eventSkeleton"
),
a
},
updateSegVerticals
:
function
(){
var
t
,
e
=
(
this
.
segs
||
[]).
concat
(
this
.
businessHourSegs
||
[]);
for
(
this
.
computeSegVerticals
(
e
),
t
=
0
;
e
.
length
>
t
;
t
++
)
e
[
t
].
el
.
css
(
this
.
generateSegVerticalCss
(
e
[
t
]))},
computeSegVerticals
:
function
(
t
){
var
e
,
n
;
for
(
e
=
0
;
t
.
length
>
e
;
e
++
)
n
=
t
[
e
],
n
.
top
=
this
.
computeDateTop
(
n
.
start
,
n
.
start
),
n
.
bottom
=
this
.
computeDateTop
(
n
.
end
,
n
.
start
)},
fgSegHtml
:
function
(
t
,
e
){
var
n
,
i
,
r
,
s
=
this
.
view
,
o
=
t
.
event
,
l
=
s
.
isEventDraggable
(
o
),
a
=!
e
&&
t
.
isEnd
&&
s
.
isEventResizable
(
o
),
c
=
this
.
getSegClasses
(
t
,
l
,
a
),
d
=
this
.
getEventSkinCss
(
o
);
return
c
.
unshift
(
"fc-time-grid-event"
),
s
.
isMultiDayEvent
(
o
)?(
t
.
isStart
||
t
.
isEnd
)
&&
(
n
=
s
.
getEventTimeText
(
t
.
start
,
t
.
end
),
i
=
s
.
getEventTimeText
(
t
.
start
,
t
.
end
,
"LT"
),
r
=
s
.
getEventTimeText
(
t
.
start
,
null
)):(
n
=
s
.
getEventTimeText
(
o
),
i
=
s
.
getEventTimeText
(
o
,
"LT"
),
r
=
s
.
getEventTimeText
(
o
.
start
,
null
)),
'<a class="'
+
c
.
join
(
" "
)
+
'"'
+
(
o
.
url
?
' href="'
+
F
(
o
.
url
)
+
'"'
:
""
)
+
(
d
?
' style="'
+
d
+
'"'
:
""
)
+
">"
+
'<div class="fc-content">'
+
(
n
?
'<div class="fc-time" data-start="'
+
F
(
r
)
+
'"'
+
' data-full="'
+
F
(
i
)
+
'"'
+
">"
+
"<span>"
+
F
(
n
)
+
"</span>"
+
"</div>"
:
""
)
+
(
o
.
title
?
'<div class="fc-title">'
+
F
(
o
.
title
)
+
"</div>"
:
""
)
+
"</div>"
+
'<div class="fc-bg"/>'
+
(
a
?
'<div class="fc-resizer"/>'
:
""
)
+
"</a>"
},
generateSegPositionCss
:
function
(
t
){
var
e
,
n
,
i
=
this
.
view
,
r
=
i
.
opt
(
"isRTL"
),
s
=
i
.
opt
(
"slotEventOverlap"
),
o
=
t
.
backwardCoord
,
l
=
t
.
forwardCoord
,
a
=
this
.
generateSegVerticalCss
(
t
);
return
s
&&
(
l
=
Math
.
min
(
1
,
o
+
2
*
(
l
-
o
))),
r
?(
e
=
1
-
l
,
n
=
o
):(
e
=
o
,
n
=
1
-
l
),
a
.
zIndex
=
t
.
level
+
1
,
a
.
left
=
100
*
e
+
"%"
,
a
.
right
=
100
*
n
+
"%"
,
s
&&
t
.
forwardPressure
&&
(
a
[
r
?
"marginLeft"
:
"marginRight"
]
=
20
),
a
},
generateSegVerticalCss
:
function
(
t
){
return
{
top
:
t
.
top
,
bottom
:
-
t
.
bottom
}},
groupSegCols
:
function
(
t
){
var
e
,
n
=
this
.
view
,
i
=
[];
for
(
e
=
0
;
n
.
colCnt
>
e
;
e
++
)
i
.
push
([]);
for
(
e
=
0
;
t
.
length
>
e
;
e
++
)
i
[
t
[
e
].
col
].
push
(
t
[
e
]);
return
i
}}),
be
.
prototype
=
{
calendar
:
null
,
coordMap
:
null
,
el
:
null
,
start
:
null
,
end
:
null
,
intervalStart
:
null
,
intervalEnd
:
null
,
rowCnt
:
null
,
colCnt
:
null
,
isSelected
:
!
1
,
scrollerEl
:
null
,
scrollTop
:
null
,
widgetHeaderClass
:
null
,
widgetContentClass
:
null
,
highlightStateClass
:
null
,
documentMousedownProxy
:
null
,
documentDragStartProxy
:
null
,
init
:
function
(){
var
e
=
this
.
opt
(
"theme"
)?
"ui"
:
"fc"
;
this
.
widgetHeaderClass
=
e
+
"-widget-header"
,
this
.
widgetContentClass
=
e
+
"-widget-content"
,
this
.
highlightStateClass
=
e
+
"-state-highlight"
,
this
.
documentMousedownProxy
=
t
.
proxy
(
this
,
"documentMousedown"
),
this
.
documentDragStartProxy
=
t
.
proxy
(
this
,
"documentDragStart"
)},
render
:
function
(){
this
.
updateSize
(),
this
.
trigger
(
"viewRender"
,
this
,
this
,
this
.
el
),
t
(
document
).
on
(
"mousedown"
,
this
.
documentMousedownProxy
).
on
(
"dragstart"
,
this
.
documentDragStartProxy
)},
destroy
:
function
(){
this
.
unselect
(),
this
.
trigger
(
"viewDestroy"
,
this
,
this
,
this
.
el
),
this
.
destroyEvents
(),
this
.
el
.
empty
(),
t
(
document
).
off
(
"mousedown"
,
this
.
documentMousedownProxy
).
off
(
"dragstart"
,
this
.
documentDragStartProxy
)},
incrementDate
:
function
(){},
updateSize
:
function
(
t
){
t
&&
this
.
recordScroll
(),
this
.
updateHeight
(),
this
.
updateWidth
()},
updateWidth
:
function
(){},
updateHeight
:
function
(){
var
t
=
this
.
calendar
;
this
.
setHeight
(
t
.
getSuggestedViewHeight
(),
t
.
isHeightAuto
())},
setHeight
:
function
(){},
computeScrollerHeight
:
function
(
t
){
var
e
,
n
=
this
.
el
.
add
(
this
.
scrollerEl
);
return
n
.
css
({
position
:
"relative"
,
left
:
-
1
}),
e
=
this
.
el
.
outerHeight
()
-
this
.
scrollerEl
.
height
(),
n
.
css
({
position
:
""
,
left
:
""
}),
t
-
e
},
recordScroll
:
function
(){
this
.
scrollerEl
&&
(
this
.
scrollTop
=
this
.
scrollerEl
.
scrollTop
())},
restoreScroll
:
function
(){
null
!==
this
.
scrollTop
&&
this
.
scrollerEl
.
scrollTop
(
this
.
scrollTop
)},
renderEvents
:
function
(){
this
.
segEach
(
function
(
t
){
this
.
trigger
(
"eventAfterRender"
,
t
.
event
,
t
.
event
,
t
.
el
)}),
this
.
trigger
(
"eventAfterAllRender"
)},
destroyEvents
:
function
(){
this
.
segEach
(
function
(
t
){
this
.
trigger
(
"eventDestroy"
,
t
.
event
,
t
.
event
,
t
.
el
)})},
resolveEventEl
:
function
(
e
,
n
){
var
i
=
this
.
trigger
(
"eventRender"
,
e
,
e
,
n
);
return
i
===!
1
?
n
=
null
:
i
&&
i
!==!
0
&&
(
n
=
t
(
i
)),
n
},
showEvent
:
function
(
t
){
this
.
segEach
(
function
(
t
){
t
.
el
.
css
(
"visibility"
,
""
)},
t
)},
hideEvent
:
function
(
t
){
this
.
segEach
(
function
(
t
){
t
.
el
.
css
(
"visibility"
,
"hidden"
)},
t
)},
segEach
:
function
(
t
,
e
){
var
n
,
i
=
this
.
getSegs
();
for
(
n
=
0
;
i
.
length
>
n
;
n
++
)
e
&&
i
[
n
].
event
.
_id
!==
e
.
_id
||
t
.
call
(
this
,
i
[
n
])},
getSegs
:
function
(){},
renderDrag
:
function
(){},
destroyDrag
:
function
(){},
documentDragStart
:
function
(
e
){
var
n
,
i
,
r
,
s
,
o
,
l
=
this
,
a
=
this
.
calendar
,
c
=
null
,
d
=
null
,
u
=
null
;
this
.
opt
(
"droppable"
)
&&
(
n
=
t
(
e
.
target
),
i
=
this
.
opt
(
"dropAccept"
),(
t
.
isFunction
(
i
)?
i
.
call
(
n
[
0
],
n
):
n
.
is
(
i
))
&&
(
r
=
Ee
(
n
),
s
=
r
.
eventProps
,
o
=
new
Q
(
this
.
coordMap
,{
cellOver
:
function
(
e
,
n
){
c
=
n
,
d
=
r
.
duration
?
c
.
clone
().
add
(
r
.
duration
):
null
,
u
=
d
||
a
.
getDefaultEventEnd
(
!
c
.
hasTime
(),
c
),
s
&&
t
.
extend
(
s
,{
start
:
c
,
end
:
d
}),
a
.
isExternalDragAllowedInRange
(
c
,
u
,
s
)?
l
.
renderDrag
(
c
,
u
):(
c
=
null
,
f
())},
cellOut
:
function
(){
c
=
null
,
l
.
destroyDrag
(),
g
()}}),
t
(
document
).
one
(
"dragstop"
,
function
(
t
,
e
){
var
i
;
l
.
destroyDrag
(),
g
(),
c
&&
(
r
.
startTime
&&!
c
.
hasTime
()
&&
c
.
time
(
r
.
startTime
),
l
.
trigger
(
"drop"
,
n
[
0
],
c
,
t
,
e
),
s
&&
(
i
=
a
.
renderEvent
(
s
,
r
.
stick
),
l
.
trigger
(
"eventReceive"
,
null
,
i
[
0
])))}),
o
.
startDrag
(
e
)))},
select
:
function
(
t
,
e
,
n
){
this
.
unselect
(
n
),
this
.
renderSelection
(
t
,
e
),
this
.
reportSelection
(
t
,
e
,
n
)},
renderSelection
:
function
(){},
reportSelection
:
function
(
t
,
e
,
n
){
this
.
isSelected
=!
0
,
this
.
trigger
(
"select"
,
null
,
t
,
e
,
n
)},
unselect
:
function
(
t
){
this
.
isSelected
&&
(
this
.
isSelected
=!
1
,
this
.
destroySelection
(),
this
.
trigger
(
"unselect"
,
null
,
t
))},
destroySelection
:
function
(){},
documentMousedown
:
function
(
e
){
var
n
;
this
.
isSelected
&&
this
.
opt
(
"unselectAuto"
)
&&
E
(
e
)
&&
(
n
=
this
.
opt
(
"unselectCancel"
),
n
&&
t
(
e
.
target
).
closest
(
n
).
length
||
this
.
unselect
(
e
))}},
_e
.
dataAttrPrefix
=
""
,
De
.
prototype
=
M
(
be
.
prototype
),
t
.
extend
(
De
.
prototype
,{
dayGrid
:
null
,
dayNumbersVisible
:
!
1
,
weekNumbersVisible
:
!
1
,
weekNumberWidth
:
null
,
headRowEl
:
null
,
render
:
function
(
t
,
e
,
n
){
this
.
rowCnt
=
t
,
this
.
colCnt
=
e
,
this
.
dayNumbersVisible
=
n
,
this
.
weekNumbersVisible
=
this
.
opt
(
"weekNumbers"
),
this
.
dayGrid
.
numbersVisible
=
this
.
dayNumbersVisible
||
this
.
weekNumbersVisible
,
this
.
el
.
addClass
(
"fc-basic-view"
).
html
(
this
.
renderHtml
()),
this
.
headRowEl
=
this
.
el
.
find
(
"thead .fc-row"
),
this
.
scrollerEl
=
this
.
el
.
find
(
".fc-day-grid-container"
),
this
.
dayGrid
.
coordMap
.
containerEl
=
this
.
scrollerEl
,
this
.
dayGrid
.
el
=
this
.
el
.
find
(
".fc-day-grid"
),
this
.
dayGrid
.
render
(
this
.
hasRigidRows
()),
be
.
prototype
.
render
.
call
(
this
)},
destroy
:
function
(){
this
.
dayGrid
.
destroy
(),
be
.
prototype
.
destroy
.
call
(
this
)},
renderHtml
:
function
(){
return
'<table><thead><tr><td class="'
+
this
.
widgetHeaderClass
+
'">'
+
this
.
dayGrid
.
headHtml
()
+
"</td>"
+
"</tr>"
+
"</thead>"
+
"<tbody>"
+
"<tr>"
+
'<td class="'
+
this
.
widgetContentClass
+
'">'
+
'<div class="fc-day-grid-container">'
+
'<div class="fc-day-grid"/>'
+
"</div>"
+
"</td>"
+
"</tr>"
+
"</tbody>"
+
"</table>"
},
headIntroHtml
:
function
(){
return
this
.
weekNumbersVisible
?
'<th class="fc-week-number '
+
this
.
widgetHeaderClass
+
'" '
+
this
.
weekNumberStyleAttr
()
+
">"
+
"<span>"
+
F
(
this
.
opt
(
"weekNumberTitle"
))
+
"</span>"
+
"</th>"
:
void
0
},
numberIntroHtml
:
function
(
t
){
return
this
.
weekNumbersVisible
?
'<td class="fc-week-number" '
+
this
.
weekNumberStyleAttr
()
+
">"
+
"<span>"
+
this
.
calendar
.
calculateWeekNumber
(
this
.
cellToDate
(
t
,
0
))
+
"</span>"
+
"</td>"
:
void
0
},
dayIntroHtml
:
function
(){
return
this
.
weekNumbersVisible
?
'<td class="fc-week-number '
+
this
.
widgetContentClass
+
'" '
+
this
.
weekNumberStyleAttr
()
+
"></td>"
:
void
0
},
introHtml
:
function
(){
return
this
.
weekNumbersVisible
?
'<td class="fc-week-number" '
+
this
.
weekNumberStyleAttr
()
+
"></td>"
:
void
0
},
numberCellHtml
:
function
(
t
,
e
,
n
){
var
i
;
return
this
.
dayNumbersVisible
?(
i
=
this
.
dayGrid
.
getDayClasses
(
n
),
i
.
unshift
(
"fc-day-number"
),
'<td class="'
+
i
.
join
(
" "
)
+
'" data-date="'
+
n
.
format
()
+
'">'
+
n
.
date
()
+
"</td>"
):
"<td/>"
},
weekNumberStyleAttr
:
function
(){
return
null
!==
this
.
weekNumberWidth
?
'style="width:'
+
this
.
weekNumberWidth
+
'px"'
:
""
},
hasRigidRows
:
function
(){
var
t
=
this
.
opt
(
"eventLimit"
);
return
t
&&
"number"
!=
typeof
t
},
updateWidth
:
function
(){
this
.
weekNumbersVisible
&&
(
this
.
weekNumberWidth
=
v
(
this
.
el
.
find
(
".fc-week-number"
)))},
setHeight
:
function
(
t
,
e
){
var
n
,
i
=
this
.
opt
(
"eventLimit"
);
w
(
this
.
scrollerEl
),
h
(
this
.
headRowEl
),
this
.
dayGrid
.
destroySegPopover
(),
i
&&
"number"
==
typeof
i
&&
this
.
dayGrid
.
limitRows
(
i
),
n
=
this
.
computeScrollerHeight
(
t
),
this
.
setGridHeight
(
n
,
e
),
i
&&
"number"
!=
typeof
i
&&
this
.
dayGrid
.
limitRows
(
i
),
!
e
&&
y
(
this
.
scrollerEl
,
n
)
&&
(
u
(
this
.
headRowEl
,
b
(
this
.
scrollerEl
)),
n
=
this
.
computeScrollerHeight
(
t
),
this
.
scrollerEl
.
height
(
n
),
this
.
restoreScroll
())},
setGridHeight
:
function
(
t
,
e
){
e
?
m
(
this
.
dayGrid
.
rowEls
):
p
(
this
.
dayGrid
.
rowEls
,
t
,
!
0
)},
renderEvents
:
function
(
t
){
this
.
dayGrid
.
renderEvents
(
t
),
this
.
updateHeight
(),
be
.
prototype
.
renderEvents
.
call
(
this
,
t
)},
getSegs
:
function
(){
return
this
.
dayGrid
.
getSegs
()},
destroyEvents
:
function
(){
be
.
prototype
.
destroyEvents
.
call
(
this
),
this
.
recordScroll
(),
this
.
dayGrid
.
destroyEvents
()},
renderDrag
:
function
(
t
,
e
,
n
){
return
this
.
dayGrid
.
renderDrag
(
t
,
e
,
n
)},
destroyDrag
:
function
(){
this
.
dayGrid
.
destroyDrag
()},
renderSelection
:
function
(
t
,
e
){
this
.
dayGrid
.
renderSelection
(
t
,
e
)},
destroySelection
:
function
(){
this
.
dayGrid
.
destroySelection
()}}),
r
({
fixedWeekCount
:
!
0
}),
Ge
.
month
=
Te
,
Te
.
prototype
=
M
(
De
.
prototype
),
t
.
extend
(
Te
.
prototype
,{
name
:
"month"
,
incrementDate
:
function
(
t
,
e
){
return
t
.
clone
().
stripTime
().
add
(
e
,
"months"
).
startOf
(
"month"
)},
render
:
function
(
t
){
var
e
;
this
.
intervalStart
=
t
.
clone
().
stripTime
().
startOf
(
"month"
),
this
.
intervalEnd
=
this
.
intervalStart
.
clone
().
add
(
1
,
"months"
),
this
.
start
=
this
.
intervalStart
.
clone
(),
this
.
start
=
this
.
skipHiddenDays
(
this
.
start
),
this
.
start
.
startOf
(
"week"
),
this
.
start
=
this
.
skipHiddenDays
(
this
.
start
),
this
.
end
=
this
.
intervalEnd
.
clone
(),
this
.
end
=
this
.
skipHiddenDays
(
this
.
end
,
-
1
,
!
0
),
this
.
end
.
add
((
7
-
this
.
end
.
weekday
())
%
7
,
"days"
),
this
.
end
=
this
.
skipHiddenDays
(
this
.
end
,
-
1
,
!
0
),
e
=
Math
.
ceil
(
this
.
end
.
diff
(
this
.
start
,
"weeks"
,
!
0
)),
this
.
isFixedWeeks
()
&&
(
this
.
end
.
add
(
6
-
e
,
"weeks"
),
e
=
6
),
this
.
title
=
this
.
calendar
.
formatDate
(
this
.
intervalStart
,
this
.
opt
(
"titleFormat"
)),
De
.
prototype
.
render
.
call
(
this
,
e
,
this
.
getCellsPerWeek
(),
!
0
)},
setGridHeight
:
function
(
t
,
e
){
e
=
e
||
"variable"
===
this
.
opt
(
"weekMode"
),
e
&&
(
t
*=
this
.
rowCnt
/
6
),
p
(
this
.
dayGrid
.
rowEls
,
t
,
!
e
)},
isFixedWeeks
:
function
(){
var
t
=
this
.
opt
(
"weekMode"
);
return
t
?
"fixed"
===
t
:
this
.
opt
(
"fixedWeekCount"
)}}),
Ge
.
basicWeek
=
Ce
,
Ce
.
prototype
=
M
(
De
.
prototype
),
t
.
extend
(
Ce
.
prototype
,{
name
:
"basicWeek"
,
incrementDate
:
function
(
t
,
e
){
return
t
.
clone
().
stripTime
().
add
(
e
,
"weeks"
).
startOf
(
"week"
)},
render
:
function
(
t
){
this
.
intervalStart
=
t
.
clone
().
stripTime
().
startOf
(
"week"
),
this
.
intervalEnd
=
this
.
intervalStart
.
clone
().
add
(
1
,
"weeks"
),
this
.
start
=
this
.
skipHiddenDays
(
this
.
intervalStart
),
this
.
end
=
this
.
skipHiddenDays
(
this
.
intervalEnd
,
-
1
,
!
0
),
this
.
title
=
this
.
calendar
.
formatRange
(
this
.
start
,
this
.
end
.
clone
().
subtract
(
1
),
this
.
opt
(
"titleFormat"
),
" — "
),
De
.
prototype
.
render
.
call
(
this
,
1
,
this
.
getCellsPerWeek
(),
!
1
)}}),
Ge
.
basicDay
=
He
,
He
.
prototype
=
M
(
De
.
prototype
),
t
.
extend
(
He
.
prototype
,{
name
:
"basicDay"
,
incrementDate
:
function
(
t
,
e
){
var
n
=
t
.
clone
().
stripTime
().
add
(
e
,
"days"
);
return
n
=
this
.
skipHiddenDays
(
n
,
0
>
e
?
-
1
:
1
)},
render
:
function
(
t
){
this
.
start
=
this
.
intervalStart
=
t
.
clone
().
stripTime
(),
this
.
end
=
this
.
intervalEnd
=
this
.
start
.
clone
().
add
(
1
,
"days"
),
this
.
title
=
this
.
calendar
.
formatDate
(
this
.
start
,
this
.
opt
(
"titleFormat"
)),
De
.
prototype
.
render
.
call
(
this
,
1
,
1
,
!
1
)}}),
r
({
allDaySlot
:
!
0
,
allDayText
:
"all-day"
,
scrollTime
:
"06:00:00"
,
slotDuration
:
"00:30:00"
,
axisFormat
:
xe
,
timeFormat
:{
agenda
:
ke
},
minTime
:
"00:00:00"
,
maxTime
:
"24:00:00"
,
slotEventOverlap
:
!
0
});
var
Ue
=
5
;
Me
.
prototype
=
M
(
be
.
prototype
),
t
.
extend
(
Me
.
prototype
,{
timeGrid
:
null
,
dayGrid
:
null
,
axisWidth
:
null
,
noScrollRowEls
:
null
,
bottomRuleEl
:
null
,
bottomRuleHeight
:
null
,
render
:
function
(
e
){
this
.
rowCnt
=
1
,
this
.
colCnt
=
e
,
this
.
el
.
addClass
(
"fc-agenda-view"
).
html
(
this
.
renderHtml
()),
this
.
scrollerEl
=
this
.
el
.
find
(
".fc-time-grid-container"
),
this
.
timeGrid
.
coordMap
.
containerEl
=
this
.
scrollerEl
,
this
.
timeGrid
.
el
=
this
.
el
.
find
(
".fc-time-grid"
),
this
.
timeGrid
.
render
(),
this
.
bottomRuleEl
=
t
(
'<hr class="'
+
this
.
widgetHeaderClass
+
'"/>'
).
appendTo
(
this
.
timeGrid
.
el
),
this
.
dayGrid
&&
(
this
.
dayGrid
.
el
=
this
.
el
.
find
(
".fc-day-grid"
),
this
.
dayGrid
.
render
(),
this
.
dayGrid
.
bottomCoordPadding
=
this
.
dayGrid
.
el
.
next
(
"hr"
).
outerHeight
()),
this
.
noScrollRowEls
=
this
.
el
.
find
(
".fc-row:not(.fc-scroller *)"
),
be
.
prototype
.
render
.
call
(
this
),
this
.
resetScroll
()},
destroy
:
function
(){
this
.
timeGrid
.
destroy
(),
this
.
dayGrid
&&
this
.
dayGrid
.
destroy
(),
be
.
prototype
.
destroy
.
call
(
this
)},
renderHtml
:
function
(){
return
'<table><thead><tr><td class="'
+
this
.
widgetHeaderClass
+
'">'
+
this
.
timeGrid
.
headHtml
()
+
"</td>"
+
"</tr>"
+
"</thead>"
+
"<tbody>"
+
"<tr>"
+
'<td class="'
+
this
.
widgetContentClass
+
'">'
+
(
this
.
dayGrid
?
'<div class="fc-day-grid"/><hr class="'
+
this
.
widgetHeaderClass
+
'"/>'
:
""
)
+
'<div class="fc-time-grid-container">'
+
'<div class="fc-time-grid"/>'
+
"</div>"
+
"</td>"
+
"</tr>"
+
"</tbody>"
+
"</table>"
},
headIntroHtml
:
function
(){
var
t
,
e
,
n
,
i
;
return
this
.
opt
(
"weekNumbers"
)?(
t
=
this
.
cellToDate
(
0
,
0
),
e
=
this
.
calendar
.
calculateWeekNumber
(
t
),
n
=
this
.
opt
(
"weekNumberTitle"
),
i
=
this
.
opt
(
"isRTL"
)?
e
+
n
:
n
+
e
,
'<th class="fc-axis fc-week-number '
+
this
.
widgetHeaderClass
+
'" '
+
this
.
axisStyleAttr
()
+
">"
+
"<span>"
+
F
(
i
)
+
"</span>"
+
"</th>"
):
'<th class="fc-axis '
+
this
.
widgetHeaderClass
+
'" '
+
this
.
axisStyleAttr
()
+
"></th>"
},
dayIntroHtml
:
function
(){
return
'<td class="fc-axis '
+
this
.
widgetContentClass
+
'" '
+
this
.
axisStyleAttr
()
+
">"
+
"<span>"
+
(
this
.
opt
(
"allDayHtml"
)
||
F
(
this
.
opt
(
"allDayText"
)))
+
"</span>"
+
"</td>"
},
slotBgIntroHtml
:
function
(){
return
'<td class="fc-axis '
+
this
.
widgetContentClass
+
'" '
+
this
.
axisStyleAttr
()
+
"></td>"
},
introHtml
:
function
(){
return
'<td class="fc-axis" '
+
this
.
axisStyleAttr
()
+
"></td>"
},
axisStyleAttr
:
function
(){
return
null
!==
this
.
axisWidth
?
'style="width:'
+
this
.
axisWidth
+
'px"'
:
""
},
updateSize
:
function
(
t
){
t
&&
this
.
timeGrid
.
resize
(),
be
.
prototype
.
updateSize
.
call
(
this
,
t
)},
updateWidth
:
function
(){
this
.
axisWidth
=
v
(
this
.
el
.
find
(
".fc-axis"
))},
setHeight
:
function
(
t
,
e
){
var
n
,
i
;
null
===
this
.
bottomRuleHeight
&&
(
this
.
bottomRuleHeight
=
this
.
bottomRuleEl
.
outerHeight
()),
this
.
bottomRuleEl
.
hide
(),
this
.
scrollerEl
.
css
(
"overflow"
,
""
),
w
(
this
.
scrollerEl
),
h
(
this
.
noScrollRowEls
),
this
.
dayGrid
&&
(
this
.
dayGrid
.
destroySegPopover
(),
n
=
this
.
opt
(
"eventLimit"
),
n
&&
"number"
!=
typeof
n
&&
(
n
=
Ue
),
n
&&
this
.
dayGrid
.
limitRows
(
n
)),
e
||
(
i
=
this
.
computeScrollerHeight
(
t
),
y
(
this
.
scrollerEl
,
i
)?(
u
(
this
.
noScrollRowEls
,
b
(
this
.
scrollerEl
)),
i
=
this
.
computeScrollerHeight
(
t
),
this
.
scrollerEl
.
height
(
i
),
this
.
restoreScroll
()):(
this
.
scrollerEl
.
height
(
i
).
css
(
"overflow"
,
"hidden"
),
this
.
bottomRuleEl
.
show
()))},
resetScroll
:
function
(){
function
t
(){
n
.
scrollerEl
.
scrollTop
(
r
)}
var
n
=
this
,
i
=
e
.
duration
(
this
.
opt
(
"scrollTime"
)),
r
=
this
.
timeGrid
.
computeTimeTop
(
i
);
r
=
Math
.
ceil
(
r
),
r
&&
r
++
,
t
(),
setTimeout
(
t
,
0
)},
renderEvents
:
function
(
t
){
var
e
,
n
,
i
=
[],
r
=
[],
s
=
[];
for
(
n
=
0
;
t
.
length
>
n
;
n
++
)
t
[
n
].
allDay
?
i
.
push
(
t
[
n
]):
r
.
push
(
t
[
n
]);
e
=
this
.
timeGrid
.
renderEvents
(
r
),
this
.
dayGrid
&&
(
s
=
this
.
dayGrid
.
renderEvents
(
i
)),
this
.
updateHeight
(),
be
.
prototype
.
renderEvents
.
call
(
this
,
t
)},
getSegs
:
function
(){
return
this
.
timeGrid
.
getSegs
().
concat
(
this
.
dayGrid
?
this
.
dayGrid
.
getSegs
():[])},
destroyEvents
:
function
(){
be
.
prototype
.
destroyEvents
.
call
(
this
),
this
.
recordScroll
(),
this
.
timeGrid
.
destroyEvents
(),
this
.
dayGrid
&&
this
.
dayGrid
.
destroyEvents
()},
renderDrag
:
function
(
t
,
e
,
n
){
return
t
.
hasTime
()?
this
.
timeGrid
.
renderDrag
(
t
,
e
,
n
):
this
.
dayGrid
?
this
.
dayGrid
.
renderDrag
(
t
,
e
,
n
):
void
0
},
destroyDrag
:
function
(){
this
.
timeGrid
.
destroyDrag
(),
this
.
dayGrid
&&
this
.
dayGrid
.
destroyDrag
()},
renderSelection
:
function
(
t
,
e
){
t
.
hasTime
()
||
e
.
hasTime
()?
this
.
timeGrid
.
renderSelection
(
t
,
e
):
this
.
dayGrid
&&
this
.
dayGrid
.
renderSelection
(
t
,
e
)},
destroySelection
:
function
(){
this
.
timeGrid
.
destroySelection
(),
this
.
dayGrid
&&
this
.
dayGrid
.
destroySelection
()}}),
Ge
.
agendaWeek
=
Re
,
Re
.
prototype
=
M
(
Me
.
prototype
),
t
.
extend
(
Re
.
prototype
,{
name
:
"agendaWeek"
,
incrementDate
:
function
(
t
,
e
){
return
t
.
clone
().
stripTime
().
add
(
e
,
"weeks"
).
startOf
(
"week"
)},
render
:
function
(
t
){
this
.
intervalStart
=
t
.
clone
().
stripTime
().
startOf
(
"week"
),
this
.
intervalEnd
=
this
.
intervalStart
.
clone
().
add
(
1
,
"weeks"
),
this
.
start
=
this
.
skipHiddenDays
(
this
.
intervalStart
),
this
.
end
=
this
.
skipHiddenDays
(
this
.
intervalEnd
,
-
1
,
!
0
),
this
.
title
=
this
.
calendar
.
formatRange
(
this
.
start
,
this
.
end
.
clone
().
subtract
(
1
),
this
.
opt
(
"titleFormat"
),
" — "
),
Me
.
prototype
.
render
.
call
(
this
,
this
.
getCellsPerWeek
())}}),
Ge
.
agendaDay
=
Pe
,
Pe
.
prototype
=
M
(
Me
.
prototype
),
t
.
extend
(
Pe
.
prototype
,{
name
:
"agendaDay"
,
incrementDate
:
function
(
t
,
e
){
var
n
=
t
.
clone
().
stripTime
().
add
(
e
,
"days"
);
return
n
=
this
.
skipHiddenDays
(
n
,
0
>
e
?
-
1
:
1
)},
render
:
function
(
t
){
this
.
start
=
this
.
intervalStart
=
t
.
clone
().
stripTime
(),
this
.
end
=
this
.
intervalEnd
=
this
.
start
.
clone
().
add
(
1
,
"days"
),
this
.
title
=
this
.
calendar
.
formatDate
(
this
.
start
,
this
.
opt
(
"titleFormat"
)),
Me
.
prototype
.
render
.
call
(
this
,
1
)}})});
\ No newline at end of file
static/js/plugins/fullcalendar/moment.min.js
0 → 100755
View file @
fef22445
//! moment.js
//! version : 2.8.3
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com
(
function
(
a
){
function
b
(
a
,
b
,
c
){
switch
(
arguments
.
length
){
case
2
:
return
null
!=
a
?
a
:
b
;
case
3
:
return
null
!=
a
?
a
:
null
!=
b
?
b
:
c
;
default
:
throw
new
Error
(
"Implement me"
)}}
function
c
(
a
,
b
){
return
zb
.
call
(
a
,
b
)}
function
d
(){
return
{
empty
:
!
1
,
unusedTokens
:[],
unusedInput
:[],
overflow
:
-
2
,
charsLeftOver
:
0
,
nullInput
:
!
1
,
invalidMonth
:
null
,
invalidFormat
:
!
1
,
userInvalidated
:
!
1
,
iso
:
!
1
}}
function
e
(
a
){
tb
.
suppressDeprecationWarnings
===!
1
&&
"undefined"
!=
typeof
console
&&
console
.
warn
&&
console
.
warn
(
"Deprecation warning: "
+
a
)}
function
f
(
a
,
b
){
var
c
=!
0
;
return
m
(
function
(){
return
c
&&
(
e
(
a
),
c
=!
1
),
b
.
apply
(
this
,
arguments
)},
b
)}
function
g
(
a
,
b
){
qc
[
a
]
||
(
e
(
b
),
qc
[
a
]
=!
0
)}
function
h
(
a
,
b
){
return
function
(
c
){
return
p
(
a
.
call
(
this
,
c
),
b
)}}
function
i
(
a
,
b
){
return
function
(
c
){
return
this
.
localeData
().
ordinal
(
a
.
call
(
this
,
c
),
b
)}}
function
j
(){}
function
k
(
a
,
b
){
b
!==!
1
&&
F
(
a
),
n
(
this
,
a
),
this
.
_d
=
new
Date
(
+
a
.
_d
)}
function
l
(
a
){
var
b
=
y
(
a
),
c
=
b
.
year
||
0
,
d
=
b
.
quarter
||
0
,
e
=
b
.
month
||
0
,
f
=
b
.
week
||
0
,
g
=
b
.
day
||
0
,
h
=
b
.
hour
||
0
,
i
=
b
.
minute
||
0
,
j
=
b
.
second
||
0
,
k
=
b
.
millisecond
||
0
;
this
.
_milliseconds
=+
k
+
1
e3
*
j
+
6
e4
*
i
+
36
e5
*
h
,
this
.
_days
=+
g
+
7
*
f
,
this
.
_months
=+
e
+
3
*
d
+
12
*
c
,
this
.
_data
=
{},
this
.
_locale
=
tb
.
localeData
(),
this
.
_bubble
()}
function
m
(
a
,
b
){
for
(
var
d
in
b
)
c
(
b
,
d
)
&&
(
a
[
d
]
=
b
[
d
]);
return
c
(
b
,
"toString"
)
&&
(
a
.
toString
=
b
.
toString
),
c
(
b
,
"valueOf"
)
&&
(
a
.
valueOf
=
b
.
valueOf
),
a
}
function
n
(
a
,
b
){
var
c
,
d
,
e
;
if
(
"undefined"
!=
typeof
b
.
_isAMomentObject
&&
(
a
.
_isAMomentObject
=
b
.
_isAMomentObject
),
"undefined"
!=
typeof
b
.
_i
&&
(
a
.
_i
=
b
.
_i
),
"undefined"
!=
typeof
b
.
_f
&&
(
a
.
_f
=
b
.
_f
),
"undefined"
!=
typeof
b
.
_l
&&
(
a
.
_l
=
b
.
_l
),
"undefined"
!=
typeof
b
.
_strict
&&
(
a
.
_strict
=
b
.
_strict
),
"undefined"
!=
typeof
b
.
_tzm
&&
(
a
.
_tzm
=
b
.
_tzm
),
"undefined"
!=
typeof
b
.
_isUTC
&&
(
a
.
_isUTC
=
b
.
_isUTC
),
"undefined"
!=
typeof
b
.
_offset
&&
(
a
.
_offset
=
b
.
_offset
),
"undefined"
!=
typeof
b
.
_pf
&&
(
a
.
_pf
=
b
.
_pf
),
"undefined"
!=
typeof
b
.
_locale
&&
(
a
.
_locale
=
b
.
_locale
),
Ib
.
length
>
0
)
for
(
c
in
Ib
)
d
=
Ib
[
c
],
e
=
b
[
d
],
"undefined"
!=
typeof
e
&&
(
a
[
d
]
=
e
);
return
a
}
function
o
(
a
){
return
0
>
a
?
Math
.
ceil
(
a
):
Math
.
floor
(
a
)}
function
p
(
a
,
b
,
c
){
for
(
var
d
=
""
+
Math
.
abs
(
a
),
e
=
a
>=
0
;
d
.
length
<
b
;)
d
=
"0"
+
d
;
return
(
e
?
c
?
"+"
:
""
:
"-"
)
+
d
}
function
q
(
a
,
b
){
var
c
=
{
milliseconds
:
0
,
months
:
0
};
return
c
.
months
=
b
.
month
()
-
a
.
month
()
+
12
*
(
b
.
year
()
-
a
.
year
()),
a
.
clone
().
add
(
c
.
months
,
"M"
).
isAfter
(
b
)
&&--
c
.
months
,
c
.
milliseconds
=+
b
-+
a
.
clone
().
add
(
c
.
months
,
"M"
),
c
}
function
r
(
a
,
b
){
var
c
;
return
b
=
K
(
b
,
a
),
a
.
isBefore
(
b
)?
c
=
q
(
a
,
b
):(
c
=
q
(
b
,
a
),
c
.
milliseconds
=-
c
.
milliseconds
,
c
.
months
=-
c
.
months
),
c
}
function
s
(
a
,
b
){
return
function
(
c
,
d
){
var
e
,
f
;
return
null
===
d
||
isNaN
(
+
d
)
||
(
g
(
b
,
"moment()."
+
b
+
"(period, number) is deprecated. Please use moment()."
+
b
+
"(number, period)."
),
f
=
c
,
c
=
d
,
d
=
f
),
c
=
"string"
==
typeof
c
?
+
c
:
c
,
e
=
tb
.
duration
(
c
,
d
),
t
(
this
,
e
,
a
),
this
}}
function
t
(
a
,
b
,
c
,
d
){
var
e
=
b
.
_milliseconds
,
f
=
b
.
_days
,
g
=
b
.
_months
;
d
=
null
==
d
?
!
0
:
d
,
e
&&
a
.
_d
.
setTime
(
+
a
.
_d
+
e
*
c
),
f
&&
nb
(
a
,
"Date"
,
mb
(
a
,
"Date"
)
+
f
*
c
),
g
&&
lb
(
a
,
mb
(
a
,
"Month"
)
+
g
*
c
),
d
&&
tb
.
updateOffset
(
a
,
f
||
g
)}
function
u
(
a
){
return
"[object Array]"
===
Object
.
prototype
.
toString
.
call
(
a
)}
function
v
(
a
){
return
"[object Date]"
===
Object
.
prototype
.
toString
.
call
(
a
)
||
a
instanceof
Date
}
function
w
(
a
,
b
,
c
){
var
d
,
e
=
Math
.
min
(
a
.
length
,
b
.
length
),
f
=
Math
.
abs
(
a
.
length
-
b
.
length
),
g
=
0
;
for
(
d
=
0
;
e
>
d
;
d
++
)(
c
&&
a
[
d
]
!==
b
[
d
]
||!
c
&&
A
(
a
[
d
])
!==
A
(
b
[
d
]))
&&
g
++
;
return
g
+
f
}
function
x
(
a
){
if
(
a
){
var
b
=
a
.
toLowerCase
().
replace
(
/
(
.
)
s$/
,
"$1"
);
a
=
jc
[
a
]
||
kc
[
b
]
||
b
}
return
a
}
function
y
(
a
){
var
b
,
d
,
e
=
{};
for
(
d
in
a
)
c
(
a
,
d
)
&&
(
b
=
x
(
d
),
b
&&
(
e
[
b
]
=
a
[
d
]));
return
e
}
function
z
(
b
){
var
c
,
d
;
if
(
0
===
b
.
indexOf
(
"week"
))
c
=
7
,
d
=
"day"
;
else
{
if
(
0
!==
b
.
indexOf
(
"month"
))
return
;
c
=
12
,
d
=
"month"
}
tb
[
b
]
=
function
(
e
,
f
){
var
g
,
h
,
i
=
tb
.
_locale
[
b
],
j
=
[];
if
(
"number"
==
typeof
e
&&
(
f
=
e
,
e
=
a
),
h
=
function
(
a
){
var
b
=
tb
().
utc
().
set
(
d
,
a
);
return
i
.
call
(
tb
.
_locale
,
b
,
e
||
""
)},
null
!=
f
)
return
h
(
f
);
for
(
g
=
0
;
c
>
g
;
g
++
)
j
.
push
(
h
(
g
));
return
j
}}
function
A
(
a
){
var
b
=+
a
,
c
=
0
;
return
0
!==
b
&&
isFinite
(
b
)
&&
(
c
=
b
>=
0
?
Math
.
floor
(
b
):
Math
.
ceil
(
b
)),
c
}
function
B
(
a
,
b
){
return
new
Date
(
Date
.
UTC
(
a
,
b
+
1
,
0
)).
getUTCDate
()}
function
C
(
a
,
b
,
c
){
return
hb
(
tb
([
a
,
11
,
31
+
b
-
c
]),
b
,
c
).
week
}
function
D
(
a
){
return
E
(
a
)?
366
:
365
}
function
E
(
a
){
return
a
%
4
===
0
&&
a
%
100
!==
0
||
a
%
400
===
0
}
function
F
(
a
){
var
b
;
a
.
_a
&&-
2
===
a
.
_pf
.
overflow
&&
(
b
=
a
.
_a
[
Bb
]
<
0
||
a
.
_a
[
Bb
]
>
11
?
Bb
:
a
.
_a
[
Cb
]
<
1
||
a
.
_a
[
Cb
]
>
B
(
a
.
_a
[
Ab
],
a
.
_a
[
Bb
])?
Cb
:
a
.
_a
[
Db
]
<
0
||
a
.
_a
[
Db
]
>
23
?
Db
:
a
.
_a
[
Eb
]
<
0
||
a
.
_a
[
Eb
]
>
59
?
Eb
:
a
.
_a
[
Fb
]
<
0
||
a
.
_a
[
Fb
]
>
59
?
Fb
:
a
.
_a
[
Gb
]
<
0
||
a
.
_a
[
Gb
]
>
999
?
Gb
:
-
1
,
a
.
_pf
.
_overflowDayOfYear
&&
(
Ab
>
b
||
b
>
Cb
)
&&
(
b
=
Cb
),
a
.
_pf
.
overflow
=
b
)}
function
G
(
a
){
return
null
==
a
.
_isValid
&&
(
a
.
_isValid
=!
isNaN
(
a
.
_d
.
getTime
())
&&
a
.
_pf
.
overflow
<
0
&&!
a
.
_pf
.
empty
&&!
a
.
_pf
.
invalidMonth
&&!
a
.
_pf
.
nullInput
&&!
a
.
_pf
.
invalidFormat
&&!
a
.
_pf
.
userInvalidated
,
a
.
_strict
&&
(
a
.
_isValid
=
a
.
_isValid
&&
0
===
a
.
_pf
.
charsLeftOver
&&
0
===
a
.
_pf
.
unusedTokens
.
length
)),
a
.
_isValid
}
function
H
(
a
){
return
a
?
a
.
toLowerCase
().
replace
(
"_"
,
"-"
):
a
}
function
I
(
a
){
for
(
var
b
,
c
,
d
,
e
,
f
=
0
;
f
<
a
.
length
;){
for
(
e
=
H
(
a
[
f
]).
split
(
"-"
),
b
=
e
.
length
,
c
=
H
(
a
[
f
+
1
]),
c
=
c
?
c
.
split
(
"-"
):
null
;
b
>
0
;){
if
(
d
=
J
(
e
.
slice
(
0
,
b
).
join
(
"-"
)))
return
d
;
if
(
c
&&
c
.
length
>=
b
&&
w
(
e
,
c
,
!
0
)
>=
b
-
1
)
break
;
b
--
}
f
++
}
return
null
}
function
J
(
a
){
var
b
=
null
;
if
(
!
Hb
[
a
]
&&
Jb
)
try
{
b
=
tb
.
locale
(),
require
(
"./locale/"
+
a
),
tb
.
locale
(
b
)}
catch
(
c
){}
return
Hb
[
a
]}
function
K
(
a
,
b
){
return
b
.
_isUTC
?
tb
(
a
).
zone
(
b
.
_offset
||
0
):
tb
(
a
).
local
()}
function
L
(
a
){
return
a
.
match
(
/
\[[\s\S]
/
)?
a
.
replace
(
/^
\[
|
\]
$/g
,
""
):
a
.
replace
(
/
\\
/g
,
""
)}
function
M
(
a
){
var
b
,
c
,
d
=
a
.
match
(
Nb
);
for
(
b
=
0
,
c
=
d
.
length
;
c
>
b
;
b
++
)
d
[
b
]
=
pc
[
d
[
b
]]?
pc
[
d
[
b
]]:
L
(
d
[
b
]);
return
function
(
e
){
var
f
=
""
;
for
(
b
=
0
;
c
>
b
;
b
++
)
f
+=
d
[
b
]
instanceof
Function
?
d
[
b
].
call
(
e
,
a
):
d
[
b
];
return
f
}}
function
N
(
a
,
b
){
return
a
.
isValid
()?(
b
=
O
(
b
,
a
.
localeData
()),
lc
[
b
]
||
(
lc
[
b
]
=
M
(
b
)),
lc
[
b
](
a
)):
a
.
localeData
().
invalidDate
()}
function
O
(
a
,
b
){
function
c
(
a
){
return
b
.
longDateFormat
(
a
)
||
a
}
var
d
=
5
;
for
(
Ob
.
lastIndex
=
0
;
d
>=
0
&&
Ob
.
test
(
a
);)
a
=
a
.
replace
(
Ob
,
c
),
Ob
.
lastIndex
=
0
,
d
-=
1
;
return
a
}
function
P
(
a
,
b
){
var
c
,
d
=
b
.
_strict
;
switch
(
a
){
case
"Q"
:
return
Zb
;
case
"DDDD"
:
return
_b
;
case
"YYYY"
:
case
"GGGG"
:
case
"gggg"
:
return
d
?
ac
:
Rb
;
case
"Y"
:
case
"G"
:
case
"g"
:
return
cc
;
case
"YYYYYY"
:
case
"YYYYY"
:
case
"GGGGG"
:
case
"ggggg"
:
return
d
?
bc
:
Sb
;
case
"S"
:
if
(
d
)
return
Zb
;
case
"SS"
:
if
(
d
)
return
$b
;
case
"SSS"
:
if
(
d
)
return
_b
;
case
"DDD"
:
return
Qb
;
case
"MMM"
:
case
"MMMM"
:
case
"dd"
:
case
"ddd"
:
case
"dddd"
:
return
Ub
;
case
"a"
:
case
"A"
:
return
b
.
_locale
.
_meridiemParse
;
case
"X"
:
return
Xb
;
case
"Z"
:
case
"ZZ"
:
return
Vb
;
case
"T"
:
return
Wb
;
case
"SSSS"
:
return
Tb
;
case
"MM"
:
case
"DD"
:
case
"YY"
:
case
"GG"
:
case
"gg"
:
case
"HH"
:
case
"hh"
:
case
"mm"
:
case
"ss"
:
case
"ww"
:
case
"WW"
:
return
d
?
$b
:
Pb
;
case
"M"
:
case
"D"
:
case
"d"
:
case
"H"
:
case
"h"
:
case
"m"
:
case
"s"
:
case
"w"
:
case
"W"
:
case
"e"
:
case
"E"
:
return
Pb
;
case
"Do"
:
return
Yb
;
default
:
return
c
=
new
RegExp
(
Y
(
X
(
a
.
replace
(
"
\
\"
,"")),"
i
"))}}function Q(a){a=a||"";var b=a.match(Vb)||[],c=b[b.length-1]||[],d=(c+"").match(hc)||["
-
",0,0],e=+(60*d[1])+A(d[2]);return"
+
"===d[0]?-e:e}function R(a,b,c){var d,e=c._a;switch(a){case"
Q
":null!=b&&(e[Bb]=3*(A(b)-1));break;case"
M
":case"
MM
":null!=b&&(e[Bb]=A(b)-1);break;case"
MMM
":case"
MMMM
":d=c._locale.monthsParse(b),null!=d?e[Bb]=d:c._pf.invalidMonth=b;break;case"
D
":case"
DD
":null!=b&&(e[Cb]=A(b));break;case"
Do
":null!=b&&(e[Cb]=A(parseInt(b,10)));break;case"
DDD
":case"
DDDD
":null!=b&&(c._dayOfYear=A(b));break;case"
YY
":e[Ab]=tb.parseTwoDigitYear(b);break;case"
YYYY
":case"
YYYYY
":case"
YYYYYY
":e[Ab]=A(b);break;case"
a
":case"
A
":c._isPm=c._locale.isPM(b);break;case"
H
":case"
HH
":case"
h
":case"
hh
":e[Db]=A(b);break;case"
m
":case"
mm
":e[Eb]=A(b);break;case"
s
":case"
ss
":e[Fb]=A(b);break;case"
S
":case"
SS
":case"
SSS
":case"
SSSS
":e[Gb]=A(1e3*("
0
.
"+b));break;case"
X
":c._d=new Date(1e3*parseFloat(b));break;case"
Z
":case"
ZZ
":c._useUTC=!0,c._tzm=Q(b);break;case"
dd
":case"
ddd
":case"
dddd
":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"
w
":case"
ww
":case"
W
":case"
WW
":case"
d
":case"
e
":case"
E
":a=a.substr(0,1);case"
gggg
":case"
GGGG
":case"
GGGGG
":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=A(b));break;case"
gg
":case"
GG
":c._w=c._w||{},c._w[a]=tb.parseTwoDigitYear(b)}}function S(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Ab],hb(tb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Ab],hb(tb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=ib(d,e,f,h,g),a._a[Ab]=i.year,a._dayOfYear=i.dayOfYear}function T(a){var c,d,e,f,g=[];if(!a._d){for(e=V(a),a._w&&null==a._a[Cb]&&null==a._a[Bb]&&S(a),a._dayOfYear&&(f=b(a._a[Ab],e[Ab]),a._dayOfYear>D(f)&&(a._pf._overflowDayOfYear=!0),d=db(f,0,a._dayOfYear),a._a[Bb]=d.getUTCMonth(),a._a[Cb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];a._d=(a._useUTC?db:cb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()+a._tzm)}}function U(a){var b;a._d||(b=y(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],T(a))}function V(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function W(a){if(a._f===tb.ISO_8601)return void $(a);a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=""+a._i,h=g.length,i=0;for(d=O(a._f,a._locale).match(Nb)||[],b=0;b<d.length;b++)e=d[b],c=(g.match(P(e,a))||[])[0],c&&(f=g.substr(0,g.indexOf(c)),f.length>0&&a._pf.unusedInput.push(f),g=g.slice(g.indexOf(c)+c.length),i+=c.length),pc[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),R(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=h-i,g.length>0&&a._pf.unusedInput.push(g),a._isPm&&a._a[Db]<12&&(a._a[Db]+=12),a._isPm===!1&&12===a._a[Db]&&(a._a[Db]=0),T(a),F(a)}function X(a){return a.replace(/
\\
(
\
[)|
\\
(
\
])|
\
[([^
\
]
\
[]*)
\
]|
\\
(.)/g,function(a,b,c,d,e){return b||c||d||e})}function Y(a){return a.replace(/[-
\
/
\\
^$*+?.()|[
\
]{}]/g,"
\\
$
&
")}function Z(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;f<a._f.length;f++)g=0,b=n({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._pf=d(),b._f=a._f[f],W(b),G(b)&&(g+=b._pf.charsLeftOver,g+=10*b._pf.unusedTokens.length,b._pf.score=g,(null==e||e>g)&&(e=g,c=b));m(a,c||b)}function $(a){var b,c,d=a._i,e=dc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=fc.length;c>b;b++)if(fc[b][1].exec(d)){a._f=fc[b][0]+(e[6]||"
");break}for(b=0,c=gc.length;c>b;b++)if(gc[b][1].exec(d)){a._f+=gc[b][0];break}d.match(Vb)&&(a._f+="
Z
"),W(a)}else a._isValid=!1}function _(a){$(a),a._isValid===!1&&(delete a._isValid,tb.createFromInputFallback(a))}function ab(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function bb(b){var c,d=b._i;d===a?b._d=new Date:v(d)?b._d=new Date(+d):null!==(c=Kb.exec(d))?b._d=new Date(+c[1]):"
string
"==typeof d?_(b):u(d)?(b._a=ab(d.slice(0),function(a){return parseInt(a,10)}),T(b)):"
object
"==typeof d?U(b):"
number
"==typeof d?b._d=new Date(d):tb.createFromInputFallback(b)}function cb(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function db(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function eb(a,b){if("
string
"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"
number
"!=typeof a)return null}else a=parseInt(a,10);return a}function fb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function gb(a,b,c){var d=tb.duration(a).abs(),e=yb(d.as("
s
")),f=yb(d.as("
m
")),g=yb(d.as("
h
")),h=yb(d.as("
d
")),i=yb(d.as("
M
")),j=yb(d.as("
y
")),k=e<mc.s&&["
s
",e]||1===f&&["
m
"]||f<mc.m&&["
mm
",f]||1===g&&["
h
"]||g<mc.h&&["
hh
",g]||1===h&&["
d
"]||h<mc.d&&["
dd
",h]||1===i&&["
M
"]||i<mc.M&&["
MM
",i]||1===j&&["
y
"]||["
yy
",j];return k[2]=b,k[3]=+a>0,k[4]=c,fb.apply({},k)}function hb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=tb(a).add(f,"
d
"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function ib(a,b,c,d,e){var f,g,h=db(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:D(a-1)+g}}function jb(b){var c=b._i,d=b._f;return b._locale=b._locale||tb.localeData(b._l),null===c||d===a&&""===c?tb.invalid({nullInput:!0}):("
string
"==typeof c&&(b._i=c=b._locale.preparse(c)),tb.isMoment(c)?new k(c,!0):(d?u(d)?Z(b):W(b):bb(b),new k(b)))}function kb(a,b){var c,d;if(1===b.length&&u(b[0])&&(b=b[0]),!b.length)return tb();for(c=b[0],d=1;d<b.length;++d)b[d][a](c)&&(c=b[d]);return c}function lb(a,b){var c;return"
string
"==typeof b&&(b=a.localeData().monthsParse(b),"
number
"!=typeof b)?a:(c=Math.min(a.date(),B(a.year(),b)),a._d["
set
"+(a._isUTC?"
UTC
":"")+"
Month
"](b,c),a)}function mb(a,b){return a._d["
get
"+(a._isUTC?"
UTC
":"")+b]()}function nb(a,b,c){return"
Month
"===b?lb(a,c):a._d["
set
"+(a._isUTC?"
UTC
":"")+b](c)}function ob(a,b){return function(c){return null!=c?(nb(this,a,c),tb.updateOffset(this,b),this):mb(this,a)}}function pb(a){return 400*a/146097}function qb(a){return 146097*a/400}function rb(a){tb.duration.fn[a]=function(){return this._data[a]}}function sb(a){"
undefined
"==typeof ender&&(ub=xb.moment,xb.moment=a?f("
Accessing
Moment
through
the
global
scope
is
deprecated
,
and
will
be
removed
in
an
upcoming
release
.
",tb):tb)}for(var tb,ub,vb,wb="
2.8
.
3
",xb="
undefined
"!=typeof global?global:this,yb=Math.round,zb=Object.prototype.hasOwnProperty,Ab=0,Bb=1,Cb=2,Db=3,Eb=4,Fb=5,Gb=6,Hb={},Ib=[],Jb="
undefined
"!=typeof module&&module.exports,Kb=/^
\
/?Date
\
((
\
-?
\
d+)/i,Lb=/(
\
-)?(?:(
\
d*)
\
.)?(
\
d+)
\
:(
\
d+)(?:
\
:(
\
d+)
\
.?(
\
d{3})?)?/,Mb=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Nb=/(
\
[[^
\
[]*
\
])|(
\\
)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,Ob=/(
\
[[^
\
[]*
\
])|(
\\
)?(LT|LL?L?L?|l{1,4})/g,Pb=/
\
d
\
d?/,Qb=/
\
d{1,3}/,Rb=/
\
d{1,4}/,Sb=/[+
\
-]?
\
d{1,6}/,Tb=/
\
d+/,Ub=/[0-9]*['a-z
\
u00A0-
\
u05FF
\
u0700-
\
uD7FF
\
uF900-
\
uFDCF
\
uFDF0-
\
uFFEF]+|[
\
u0600-
\
u06FF
\
/]+(
\
s*?[
\
u0600-
\
u06FF]+){1,2}/i,Vb=/Z|[
\
+
\
-]
\
d
\
d:?
\
d
\
d/gi,Wb=/T/i,Xb=/[
\
+
\
-]?
\
d+(
\
.
\
d{1,3})?/,Yb=/
\
d{1,2}/,Zb=/
\
d/,$b=/
\
d
\
d/,_b=/
\
d{3}/,ac=/
\
d{4}/,bc=/[+-]?
\
d{6}/,cc=/[+-]?
\
d+/,dc=/^
\
s*(?:[+-]
\
d{6}|
\
d{4})-(?:(
\
d
\
d-
\
d
\
d)|(W
\
d
\
d$)|(W
\
d
\
d-
\
d)|(
\
d
\
d
\
d))((T| )(
\
d
\
d(:
\
d
\
d(:
\
d
\
d(
\
.
\
d+)?)?)?)?([
\
+
\
-]
\
d
\
d(?::?
\
d
\
d)?|
\
s*Z)?)?$/,ec="
YYYY
-
MM
-
DDTHH
:
mm
:
ssZ
",fc=[["
YYYYYY
-
MM
-
DD
",/[+-]
\
d{6}-
\
d{2}-
\
d{2}/],["
YYYY
-
MM
-
DD
",/
\
d{4}-
\
d{2}-
\
d{2}/],["
GGGG
-
[
W
]
WW
-
E
",/
\
d{4}-W
\
d{2}-
\
d/],["
GGGG
-
[
W
]
WW
",/
\
d{4}-W
\
d{2}/],["
YYYY
-
DDD
",/
\
d{4}-
\
d{3}/]],gc=[["
HH
:
mm
:
ss
.
SSSS
",/(T| )
\
d
\
d:
\
d
\
d:
\
d
\
d
\
.
\
d+/],["
HH
:
mm
:
ss
",/(T| )
\
d
\
d:
\
d
\
d:
\
d
\
d/],["
HH
:
mm
",/(T| )
\
d
\
d:
\
d
\
d/],["
HH
",/(T| )
\
d
\
d/]],hc=/([
\
+
\
-]|
\
d
\
d)/gi,ic=("
Date
|
Hours
|
Minutes
|
Seconds
|
Milliseconds
".split("
|
"),{Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6}),jc={ms:"
millisecond
",s:"
second
",m:"
minute
",h:"
hour
",d:"
day
",D:"
date
",w:"
week
",W:"
isoWeek
",M:"
month
",Q:"
quarter
",y:"
year
",DDD:"
dayOfYear
",e:"
weekday
",E:"
isoWeekday
",gg:"
weekYear
",GG:"
isoWeekYear
"},kc={dayofyear:"
dayOfYear
",isoweekday:"
isoWeekday
",isoweek:"
isoWeek
",weekyear:"
weekYear
",isoweekyear:"
isoWeekYear
"},lc={},mc={s:45,m:45,h:22,d:26,M:11},nc="
DDD
w
W
M
D
d
".split("
"),oc="
M
D
H
h
m
s
w
W
".split("
"),pc={M:function(){return this.month()+1},MMM:function(a){return this.localeData().monthsShort(this,a)},MMMM:function(a){return this.localeData().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.localeData().weekdaysMin(this,a)},ddd:function(a){return this.localeData().weekdaysShort(this,a)},dddd:function(a){return this.localeData().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return p(this.year()%100,2)},YYYY:function(){return p(this.year(),4)},YYYYY:function(){return p(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"
+
":"
-
";return b+p(Math.abs(a),6)},gg:function(){return p(this.weekYear()%100,2)},gggg:function(){return p(this.weekYear(),4)},ggggg:function(){return p(this.weekYear(),5)},GG:function(){return p(this.isoWeekYear()%100,2)},GGGG:function(){return p(this.isoWeekYear(),4)},GGGGG:function(){return p(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return A(this.milliseconds()/100)},SS:function(){return p(A(this.milliseconds()/10),2)},SSS:function(){return p(this.milliseconds(),3)},SSSS:function(){return p(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="
+
";return 0>a&&(a=-a,b="
-
"),b+p(A(a/60),2)+"
:
"+p(A(a)%60,2)},ZZ:function(){var a=-this.zone(),b="
+
";return 0>a&&(a=-a,b="
-
"),b+p(A(a/60),2)+p(A(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},qc={},rc=["
months
","
monthsShort
","
weekdays
","
weekdaysShort
","
weekdaysMin
"];nc.length;)vb=nc.pop(),pc[vb+"
o
"]=i(pc[vb],vb);for(;oc.length;)vb=oc.pop(),pc[vb+vb]=h(pc[vb],2);pc.DDDD=h(pc.DDD,3),m(j.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"
function
"==typeof b?this[c]=b:this["
_
"+c]=b},_months:"
January_February_March_April_May_June_July_August_September_October_November_December
".split("
_
"),months:function(a){return this._months[a.month()]},_monthsShort:"
Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec
".split("
_
"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=tb.utc([2e3,b]),d="
^
"+this.months(c,"")+"
|^
"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace("
.
",""),"
i
")),this._monthsParse[b].test(a))return b},_weekdays:"
Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday
".split("
_
"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"
Sun_Mon_Tue_Wed_Thu_Fri_Sat
".split("
_
"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"
Su_Mo_Tu_We_Th_Fr_Sa
".split("
_
"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=tb([2e3,1]).day(b),d="
^
"+this.weekdays(c,"")+"
|^
"+this.weekdaysShort(c,"")+"
|^
"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace("
.
",""),"
i
")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"
h
:
mm
A
",L:"
MM
/
DD
/
YYYY
",LL:"
MMMM
D
,
YYYY
",LLL:"
MMMM
D
,
YYYY
LT
",LLLL:"
dddd
,
MMMM
D
,
YYYY
LT
"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"
p
"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]
\
.?m?
\
.?/i,meridiem:function(a,b,c){return a>11?c?"
pm
":"
PM
":c?"
am
":"
AM
"},_calendar:{sameDay:"
[
Today
at
]
LT
",nextDay:"
[
Tomorrow
at
]
LT
",nextWeek:"
dddd
[
at
]
LT
",lastDay:"
[
Yesterday
at
]
LT
",lastWeek:"
[
Last
]
dddd
[
at
]
LT
",sameElse:"
L
"},calendar:function(a,b){var c=this._calendar[a];return"
function
"==typeof c?c.apply(b):c},_relativeTime:{future:"
in
%
s
",past:"
%
s
ago
",s:"
a
few
seconds
",m:"
a
minute
",mm:"
%
d
minutes
",h:"
an
hour
",hh:"
%
d
hours
",d:"
a
day
",dd:"
%
d
days
",M:"
a
month
",MM:"
%
d
months
",y:"
a
year
",yy:"
%
d
years
"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"
function
"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"
future
":"
past
"];return"
function
"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("
%
d
",a)},_ordinal:"
%
d
",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return hb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"
Invalid
date
",invalidDate:function(){return this._invalidDate}}),tb=function(b,c,e,f){var g;return"
boolean
"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),jb(g)},tb.suppressDeprecationWarnings=!1,tb.createFromInputFallback=f("
moment
construction
falls
back
to
js
Date
.
This
is
discouraged
and
will
be
removed
in
upcoming
major
release
.
Please
refer
to
https
:
//github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i)}),tb.min=function(){var a=[].slice.call(arguments,0);return kb("isBefore",a)},tb.max=function(){var a=[].slice.call(arguments,0);return kb("isAfter",a)},tb.utc=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=b,g._f=c,g._strict=f,g._pf=d(),jb(g).utc()},tb.unix=function(a){return tb(1e3*a)},tb.duration=function(a,b){var d,e,f,g,h=a,i=null;return tb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Lb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:A(i[Cb])*d,h:A(i[Db])*d,m:A(i[Eb])*d,s:A(i[Fb])*d,ms:A(i[Gb])*d}):(i=Mb.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):"object"==typeof h&&("from"in h||"to"in h)&&(g=r(tb(h.from),tb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new l(h),tb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},tb.version=wb,tb.defaultFormat=ec,tb.ISO_8601=function(){},tb.momentProperties=Ib,tb.updateOffset=function(){},tb.relativeTimeThreshold=function(b,c){return mc[b]===a?!1:c===a?mc[b]:(mc[b]=c,!0)},tb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return tb.locale(a,b)}),tb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?tb.defineLocale(a,b):tb.localeData(a),c&&(tb.duration._locale=tb._locale=c)),tb._locale._abbr},tb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Hb[a]||(Hb[a]=new j),Hb[a].set(b),tb.locale(a),Hb[a]):(delete Hb[a],null)},tb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return tb.localeData(a)}),tb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return tb._locale;if(!u(a)){if(b=J(a))return b;a=[a]}return I(a)},tb.isMoment=function(a){return a instanceof k||null!=a&&c(a,"_isAMomentObject")},tb.isDuration=function(a){return a instanceof l};for(vb=rc.length-1;vb>=0;--vb)z(rc[vb]);tb.normalizeUnits=function(a){return x(a)},tb.invalid=function(a){var b=tb.utc(0/0);return null!=a?m(b._pf,a):b._pf.userInvalidated=!0,b},tb.parseZone=function(){return tb.apply(null,arguments).parseZone()},tb.parseTwoDigitYear=function(a){return A(a)+(A(a)>68?1900:2e3)},m(tb.fn=k.prototype,{clone:function(){return tb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=tb(this).utc();return 0<a.year()&&a.year()<=9999?N(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):N(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return G(this)},isDSTShifted:function(){return this._a?this.isValid()&&w(this._a,(this._isUTC?tb.utc(this._a):tb(this._a)).toArray())>0:!1},parsingFlags:function(){return m({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.zone(0,a)},local:function(a){return this._isUTC&&(this.zone(0,a),this._isUTC=!1,a&&this.add(this._dateTzOffset(),"m")),this},format:function(a){var b=N(this,a||tb.defaultFormat);return this.localeData().postformat(b)},add:s(1,"add"),subtract:s(-1,"subtract"),diff:function(a,b,c){var d,e,f,g=K(a,this),h=6e4*(this.zone()-g.zone());return b=x(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+g.daysInMonth()),e=12*(this.year()-g.year())+(this.month()-g.month()),f=this-tb(this).startOf("month")-(g-tb(g).startOf("month")),f-=6e4*(this.zone()-tb(this).startOf("month").zone()-(g.zone()-tb(g).startOf("month").zone())),e+=f/d,"year"===b&&(e/=12)):(d=this-g,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-h)/864e5:"week"===b?(d-h)/6048e5:d),c?e:o(e)},from:function(a,b){return tb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(tb(),a)},calendar:function(a){var b=a||tb(),c=K(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this))},isLeapYear:function(){return E(this.year())},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=eb(a,this.localeData()),this.add(a-b,"d")):b},month:ob("Month",!0),startOf:function(a){switch(a=x(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(a){return a=x(a),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms")},isAfter:function(a,b){return b=x("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+this>+a):+this.clone().startOf(b)>+tb(a).startOf(b)},isBefore:function(a,b){return b=x("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+a>+this):+this.clone().startOf(b)<+tb(a).startOf(b)},isSame:function(a,b){return b=x(b||"millisecond"),"millisecond"===b?(a=tb.isMoment(a)?a:tb(a),+this===+a):+this.clone().startOf(b)===+K(a,this).startOf(b)},min:f("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(a){return a=tb.apply(null,arguments),this>a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=tb.apply(null,arguments),a>this?this:a}),zone:function(a,b){var c,d=this._offset||0;return null==a?this._isUTC?d:this._dateTzOffset():("string"==typeof a&&(a=Q(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateTzOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.subtract(c,"m"),d!==a&&(!b||this._changeInProgress?t(this,tb.duration(d-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,tb.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?tb(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return B(this.year(),this.month())},dayOfYear:function(a){var b=yb((tb(this).startOf("day")-tb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=hb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=hb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=hb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return C(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return C(this.year(),a.dow,a.doy)},get:function(a){return a=x(a),this[a]()},set:function(a,b){return a=x(a),"function"==typeof this[a]&&this[a](b),this},locale:function(b){var c;return b===a?this._locale._abbr:(c=tb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Use moment().localeData() instead.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),tb.fn.millisecond=tb.fn.milliseconds=ob("Milliseconds",!1),tb.fn.second=tb.fn.seconds=ob("Seconds",!1),tb.fn.minute=tb.fn.minutes=ob("Minutes",!1),tb.fn.hour=tb.fn.hours=ob("Hours",!0),tb.fn.date=ob("Date",!0),tb.fn.dates=f("dates accessor is deprecated. Use date instead.",ob("Date",!0)),tb.fn.year=ob("FullYear",!0),tb.fn.years=f("years accessor is deprecated. Use year instead.",ob("FullYear",!0)),tb.fn.days=tb.fn.day,tb.fn.months=tb.fn.month,tb.fn.weeks=tb.fn.week,tb.fn.isoWeeks=tb.fn.isoWeek,tb.fn.quarters=tb.fn.quarter,tb.fn.toJSON=tb.fn.toISOString,m(tb.duration.fn=l.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=o(d/1e3),g.seconds=a%60,b=o(a/60),g.minutes=b%60,c=o(b/60),g.hours=c%24,e+=o(c/24),h=o(pb(e)),e-=o(qb(h)),f+=o(e/30),e%=30,h+=o(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return o(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*A(this._months/12)},humanize:function(a){var b=gb(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=tb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=tb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=x(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=x(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*pb(b),"month"===a?c:c/12;switch(b=this._days+qb(this._months/12),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:tb.fn.lang,locale:tb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale}}),tb.duration.fn.toString=tb.duration.fn.toISOString;for(vb in ic)c(ic,vb)&&rb(vb.toLowerCase());tb.duration.fn.asMilliseconds=function(){return this.as("ms")},tb.duration.fn.asSeconds=function(){return this.as("s")},tb.duration.fn.asMinutes=function(){return this.as("m")},tb.duration.fn.asHours=function(){return this.as("h")},tb.duration.fn.asDays=function(){return this.as("d")},tb.duration.fn.asWeeks=function(){return this.as("weeks")},tb.duration.fn.asMonths=function(){return this.as("M")},tb.duration.fn.asYears=function(){return this.as("y")},tb.locale("en",{ordinal:function(a){var b=a%10,c=1===A(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";
return
a
+
c
}}),
Jb
?
module
.
exports
=
tb
:
"function"
==
typeof
define
&&
define
.
amd
?(
define
(
"moment"
,
function
(
a
,
b
,
c
){
return
c
.
config
&&
c
.
config
()
&&
c
.
config
().
noGlobal
===!
0
&&
(
xb
.
moment
=
ub
),
tb
}),
sb
(
!
0
)):
sb
()}).
call
(
this
);
\ No newline at end of file
templates/foot_script.html
View file @
fef22445
...
...
@@ -3,6 +3,8 @@
<script
src=
"/static/js/plugins/slimscroll/jquery.slimscroll.min.js"
></script>
<script
src=
"/static/js/bootstrap-dialog.js"
></script>
<script
src=
"/static/js/mindmup-editabletable.js"
></script>
<script
src=
"/static/js/plugins/fullcalendar/moment.min.js"
></script>
<script
src=
"/static/js/plugins/fullcalendar/fullcalendar.min.js"
></script>
<!-- Custom and plugin javascript -->
<script
src=
"/static/js/inspinia.js"
></script>
...
...
templates/jasset/group_add.html
View file @
fef22445
...
...
@@ -38,7 +38,7 @@
{% ifequal session_role_id 1 %}
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<label
for=
"j_dept"
class=
"col-lg-2 control-label"
>
所属部门
<span
class=
"red-fonts"
>
*
</span></label>
<label
for=
"j_dept"
class=
"col-lg-2 control-label"
>
所属部门
<span
class=
"red-fonts"
style=
""
>
*
</span></label>
<div
class=
"col-sm-8"
><input
type=
"text"
name=
"j_dept"
value=
"{{ edept.name }}"
class=
"form-control"
readonly=
"readonly"
></div>
</div>
{% endifequal %}
...
...
@@ -54,9 +54,9 @@
</select>
</div>
<div
class=
"col-sm-1"
>
<div
class=
"
bt
n-group"
style=
"margin-top: 50px;"
>
<button
type=
"button"
class=
"
btn btn-white"
onclick=
"move('groups', 'groups_selected')"
><i
class=
"fa fa-chevron-right"
></i
></button>
<button
type=
"button"
class=
"
btn btn-white"
onclick=
"move_left('groups_selected', 'groups')"
><i
class=
"fa fa-chevron-left"
></i>
</button>
<div
class=
"
fc-butto
n-group"
style=
"margin-top: 50px;"
>
<button
type=
"button"
class=
"
fc-button fc-state-default"
onclick=
"move('groups', 'groups_selected')"
><span
class=
"fc-icon fc-icon-right-single-arrow"
></span
></button>
<button
type=
"button"
class=
"
fc-button fc-state-default"
onclick=
"move_left('groups_selected', 'groups')"
><span
class=
"fc-icon fc-icon-left-single-arrow"
></span>
</button>
</div>
</div>
<div
class=
"col-sm-3"
>
...
...
templates/jasset/host_add.html
View file @
fef22445
...
...
@@ -118,16 +118,6 @@
</div>
</div>
<!--<div class="hr-line-dashed"></div>-->
<!--<div class="form-group">-->
<!--<label for="j_group" class="col-sm-2 control-label"> 所属用户组<span class="red-fonts">*</span> </label>-->
<!--<div class="col-sm-8">-->
<!--{% for g in eusergroup %}-->
<!--<label class="checkbox-inline"><input type="checkbox" id="j_usergroup" value="{{ g }}" name="j_usergroup"> {{ g }} </label>-->
<!--{% endfor %}-->
<!--</div>-->
<!--</div>-->
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
是否激活
<span
class=
"red-fonts"
>
*
</span>
</label>
<div
class=
"col-sm-8"
>
...
...
templates/jasset/host_add_multi.html
View file @
fef22445
...
...
@@ -44,7 +44,7 @@
{% endif %}
<h4>
按照文本框内主机信息格式填写, 多台主机回车换行
</h4>
<form
id=
"assetMulti"
method=
"post"
class=
"form-horizontal"
>
<div><textarea
id=
"j_multi"
name=
"j_multi"
type=
"text"
placeholder=
"192.168.1.1 22 LDAP 北京联通 [网站,数据库]
1 网站服务器"
class=
"form-control"
style=
"width:700px;height:500px"
>
</textarea></div>
<div><textarea
id=
"j_multi"
name=
"j_multi"
type=
"text"
placeholder=
"192.168.1.1 22 LDAP 北京联通 [网站,数据库]
运维部 1 网站服务器"
class=
"form-control"
style=
"width:700px;height:500px"
>
192.168.1.1 22 LDAP 北京联通 ['网站','数据库'] ['运维部','测试部'] 1 网站服务器
</textarea></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-4"
>
...
...
templates/jlog/log_offline.html
View file @
fef22445
...
...
@@ -77,6 +77,7 @@
<thead>
<tr>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
所属部门
</th>
<th
class=
"text-center"
>
登录主机
</th>
<th
class=
"text-center"
>
来源IP
</th>
<th
class=
"text-center"
>
命令统计
</th>
...
...
@@ -89,8 +90,9 @@
{% for post in contacts.object_list %}
<tr
class=
"gradeX"
>
<td
class=
"text-center"
id=
"username"
>
{{ post.user }}
</td>
<td
class=
"text-center"
id=
"dept"
>
{{ post.dept_name }}
</td>
<td
class=
"text-center"
id=
"ip"
>
{{ post.host }}
</td>
<td
class=
"text-center"
id=
"ip"
>
{{ post.remote_ip }}
</td>
<td
class=
"text-center"
id=
"
remote_
ip"
>
{{ post.remote_ip }}
</td>
<td
class=
"text-center"
><a
href=
"/jlog/history/?id={{ post.id }}"
class=
"log_command"
>
命令统计
</td>
<td
class=
"text-center"
id=
"start_time"
>
{{ post.start_time|date:"Y-m-d H:i:s"}}
</td>
<td
class=
"text-center"
id=
"end_time"
>
{{ post.end_time|date:"Y-m-d H:i:s" }}
</td>
...
...
templates/jlog/log_online.html
View file @
fef22445
...
...
@@ -77,6 +77,7 @@
<thead>
<tr>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
所属部门
</th>
<th
class=
"text-center"
>
登录主机
</th>
<th
class=
"text-center"
>
来源IP
</th>
<th
class=
"text-center"
>
实时监控
</th>
...
...
@@ -89,6 +90,7 @@
{% for post in contacts.object_list %}
<tr
class=
"gradeX"
>
<td
id=
"username"
class=
"text-center"
>
{{ post.user }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.dept_name }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.host }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.remote_ip }}
</td>
<td
class=
"text-center"
><a
class=
"monitor"
filename=
"{{ post.log_path }}"
>
监控
</a></td>
...
...
templates/jlog/log_search.html
View file @
fef22445
...
...
@@ -3,6 +3,7 @@
<thead>
<tr>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
所属部门
</th>
<th
class=
"text-center"
>
登录主机
</th>
<th
class=
"text-center"
>
来源IP
</th>
<th
class=
"text-center"
>
命令统计
</th>
...
...
@@ -15,6 +16,7 @@
{% for post in contacts.object_list %}
<tr
class=
"gradeX"
>
<td
class=
"text-center"
id=
"username"
>
{{ post.user }}
</td>
<td
class=
"text-center"
id=
"ip"
>
{{ post.dept_name }}
</td>
<td
class=
"text-center"
id=
"ip"
>
{{ post.host }}
</td>
<td
class=
"text-center"
id=
"ip"
>
{{ post.remote_ip }}
</td>
<td
class=
"text-center"
><a
href=
"/jlog/history/?id={{ post.id }}"
class=
"log_command"
>
命令统计
</td>
...
...
templates/link_css.html
View file @
fef22445
...
...
@@ -6,3 +6,4 @@
<link
href=
"/static/css/colorbox.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/vaildator/jquery.validator.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/magnific/magnific-popup.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/plugins/fullcalendar/fullcalendar.css"
rel=
"stylesheet"
>
templates/nav.html
View file @
fef22445
...
...
@@ -27,7 +27,7 @@
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li
class=
"host_add host_add_multi"
><a
href=
"/jasset/host_add/"
>
添加资产
</a></li>
<li
class=
"host_list"
><a
href=
"/jasset/host_list/"
>
查看资产
&
nbsp
&
nbsp
</span><span
class=
"label label-info pull-right"
>
16/18
</span></a></li>
<li
class=
"host_list"
><a
href=
"/jasset/host_list/"
>
查看资产
&
nbsp
&
nbsp
</span><span
class=
"label label-info pull-right"
>
{{ host_active_num }}/{{ host_total_num}}
</span></a></li>
<li
class=
"jgroup_add"
><a
href=
"/jasset/jgroup_add/"
>
添加主机组
</a></li>
<li
class=
"jgroup_list group_detail"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</a></li>
<li
class=
"idc_add"
><a
href=
"/jasset/idc_add/"
>
添加IDC
</a></li>
...
...
@@ -99,11 +99,11 @@
<li
id=
"jasset"
>
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li
id=
"host_add
"
><a
href=
"/jasset/host_add/"
>
添加资产
</a></li>
<li
id=
"host_list"
><a
href=
"/jasset/host_list/"
>
查看资产
&
nbsp
&
nbsp
</span><span
class=
"label label-info pull-right"
>
16/18
</span></a></li>
<li
id
=
"jgroup_add"
><a
href=
"/jasset/jgroup_add/"
>
添加主机组
</a></li>
<li
id=
"jgroup_list
"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</a></li>
<li
id=
"idc_list
"
><a
href=
"/jasset/idc_list/"
>
查看IDC
</a></li>
<li
class=
"host_add host_add_multi
"
><a
href=
"/jasset/host_add/"
>
添加资产
</a></li>
<li
class=
"host_list"
><a
href=
"/jasset/host_list/"
>
查看资产
&
nbsp
&
nbsp
</span><span
class=
"label label-info pull-right"
>
{{ host_active_num }}/{{ host_total_num}}
</span></a></li>
<li
class
=
"jgroup_add"
><a
href=
"/jasset/jgroup_add/"
>
添加主机组
</a></li>
<li
class=
"jgroup_list group_detail
"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</a></li>
<li
class=
"idc_list idc_detail
"
><a
href=
"/jasset/idc_list/"
>
查看IDC
</a></li>
</ul>
</li>
<li
id=
"jperm"
>
...
...
@@ -139,4 +139,49 @@
</ul>
</div>
</nav>
{% endifequal %}
{% ifequal session_role_id 0 %}
<nav
class=
"navbar-default navbar-static-side"
role=
"navigation"
>
<div
class=
"sidebar-collapse"
>
<ul
class=
"nav"
id=
"side-menu"
>
{% include 'nav_li_profile.html' %}
<li>
<a
href=
"/"
><i
class=
"fa fa-th-large"
></i>
<span
class=
"nav-label"
>
仪表盘
</span><span
class=
"label label-info pull-right"
></span></a>
</li>
<li
id=
"juser"
>
<a
href=
"#"
><i
class=
"fa fa-rebel"
></i>
<span
class=
"nav-label"
>
用户管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li
id=
"user_list"
><a
href=
"/juser/user_list/"
>
查看用户
<span
class=
"label {% ifequal user_active_num user_total_num %}label-primary {% else %}label-warning {% endifequal %}pull-right"
>
{{ user_active_num }}/{{ user_total_num }}
</span></a></li>
</ul>
</li>
<li
id=
"jasset"
>
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li
class=
"host_list"
><a
href=
"/jasset/host_list/"
>
查看资产
&
nbsp
&
nbsp
</span><span
class=
"label label-info pull-right"
>
16/18
</span></a></li>
<li
class=
"jgroup_list group_detail"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</a></li>
<li
class=
"idc_list idc_detail"
><a
href=
"/jasset/idc_list/"
>
查看IDC
</a></li>
</ul>
</li>
<li
id=
"jlog"
>
<a
href=
"#"
><i
class=
"fa fa-files-o"
></i>
<span
class=
"nav-label"
>
日志审计
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li
id=
"log_list"
><a
href=
"/jlog/log_list/online/"
>
查看日志
</a></li>
<li
id=
"log_detail"
><a
href=
"/jlog/log_detail/"
>
日志分析
</a></li>
</ul>
</li>
<li>
<a
href=
"#"
><i
class=
"fa fa-download"
></i>
<span
class=
"nav-label"
>
上传下载
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li><a
href=
"/file/upload/"
>
文件上传
</a></li>
<li><a
href=
"/file/download/"
>
文件下载
</a></li>
</ul>
</li>
<li
class=
"special_link"
>
<a
href=
"http://www.jumpserver.org"
target=
"_blank"
><i
class=
"fa fa-database"
></i>
<span
class=
"nav-label"
>
访问官网
</span></a>
</li>
</ul>
</div>
</nav>
{% endifequal %}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment