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
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1392 additions
and
77 deletions
+1392
-77
connect.py
connect.py
+4
-2
AddUserAsset.py
docs/AddUserAsset.py
+8
-9
views.py
jasset/views.py
+56
-22
models.py
jlog/models.py
+1
-0
views.py
jlog/views.py
+48
-5
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')
...
@@ -43,7 +43,8 @@ LOG_DIR = os.path.join(BASE_DIR, 'logs')
SSH_KEY_DIR
=
os
.
path
.
join
(
BASE_DIR
,
'keys'
)
SSH_KEY_DIR
=
os
.
path
.
join
(
BASE_DIR
,
'keys'
)
SERVER_KEY_DIR
=
os
.
path
.
join
(
SSH_KEY_DIR
,
'server'
)
SERVER_KEY_DIR
=
os
.
path
.
join
(
SSH_KEY_DIR
,
'server'
)
KEY
=
CONF
.
get
(
'web'
,
'key'
)
KEY
=
CONF
.
get
(
'web'
,
'key'
)
LOGIN_NAME
=
getpass
.
getuser
()
#LOGIN_NAME = getpass.getuser()
LOGIN_NAME
=
'wy01'
def
color_print
(
msg
,
color
=
'blue'
):
def
color_print
(
msg
,
color
=
'blue'
):
...
@@ -103,6 +104,7 @@ def log_record(username, host):
...
@@ -103,6 +104,7 @@ def log_record(username, host):
today_connect_log_dir
=
os
.
path
.
join
(
connect_log_dir
,
today
)
today_connect_log_dir
=
os
.
path
.
join
(
connect_log_dir
,
today
)
log_filename
=
'
%
s_
%
s_
%
s.log'
%
(
username
,
host
,
time_now
)
log_filename
=
'
%
s_
%
s_
%
s.log'
%
(
username
,
host
,
time_now
)
log_file_path
=
os
.
path
.
join
(
today_connect_log_dir
,
log_filename
)
log_file_path
=
os
.
path
.
join
(
today_connect_log_dir
,
log_filename
)
dept_name
=
User
.
objects
.
get
(
username
=
username
)
.
dept
pid
=
os
.
getpid
()
pid
=
os
.
getpid
()
ip_list
=
[]
ip_list
=
[]
remote_ip
=
os
.
popen
(
"who |grep `ps aux |gawk '{if ($2==
%
s) print $1}'` |gawk '{print $5}'|tr -d '()'"
%
pid
)
.
readlines
()
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):
...
@@ -122,7 +124,7 @@ def log_record(username, host):
except
IOError
:
except
IOError
:
raise
ServerError
(
'Create logfile failed, Please modify
%
s permission.'
%
today_connect_log_dir
)
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_file
.
write
(
'Starttime is
%
s
\n
'
%
datetime
.
now
())
log
.
save
()
log
.
save
()
return
log_file
,
log
return
log_file
,
log
...
...
docs/AddUserAsset.py
View file @
fef22445
...
@@ -13,7 +13,6 @@ django.setup()
...
@@ -13,7 +13,6 @@ django.setup()
from
juser.views
import
db_add_user
,
md5_crypt
,
CRYPTOR
,
db_add_group
from
juser.views
import
db_add_user
,
md5_crypt
,
CRYPTOR
,
db_add_group
from
jasset.models
import
Asset
,
IDC
,
BisGroup
from
jasset.models
import
Asset
,
IDC
,
BisGroup
from
juser.models
import
UserGroup
,
DEPT
,
User
from
juser.models
import
UserGroup
,
DEPT
,
User
from
jasset.views
import
jasset_group_add
from
jperm.models
import
CmdGroup
from
jperm.models
import
CmdGroup
from
jlog.models
import
Log
from
jlog.models
import
Log
...
@@ -123,18 +122,18 @@ def test_add_log():
...
@@ -123,18 +122,18 @@ def test_add_log():
end_time
=
datetime
.
datetime
.
now
()
end_time
=
datetime
.
datetime
.
now
()
log_path
=
'/var/log/jumpserver/test.log'
log_path
=
'/var/log/jumpserver/test.log'
host
=
'192.168.1.'
+
str
(
ip
)
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
)
is_finished
=
1
,
log_finished
=
1
,
end_time
=
end_time
)
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
install
()
#
install()
test_add_dept
()
#
test_add_dept()
test_add_group
()
#
test_add_group()
test_add_user
()
#
test_add_user()
test_add_idc
()
#
test_add_idc()
test_add_asset_group
()
#
test_add_asset_group()
test_add_asset
()
#
test_add_asset()
test_add_log
()
test_add_log
()
...
...
jasset/views.py
View file @
fef22445
# coding:utf-8
# coding:utf-8
import
ast
from
django.db.models
import
Q
from
django.db.models
import
Q
from
django.http
import
HttpResponseRedirect
from
django.http
import
HttpResponseRedirect
from
django.template
import
RequestContext
from
django.template
import
RequestContext
from
django.shortcuts
import
render_to_response
from
django.shortcuts
import
render_to_response
from
models
import
IDC
,
Asset
,
BisGroup
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
connect
import
PyCrypt
,
KEY
from
jlog.models
import
Log
from
jlog.models
import
Log
from
jumpserver.views
import
jasset_host_edit
,
pages
from
jumpserver.views
import
jasset_host_edit
,
pages
from
jumpserver.api
import
asset_perm_api
from
jumpserver.api
import
asset_perm_api
from
jumpserver.api
import
user_perm_group_api
,
require_login
,
require_super_user
,
\
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
)
cryptor
=
PyCrypt
(
KEY
)
...
@@ -61,7 +63,7 @@ def add_host(request):
...
@@ -61,7 +63,7 @@ def add_host(request):
eidc
=
IDC
.
objects
.
all
()
eidc
=
IDC
.
objects
.
all
()
if
is_super_user
(
request
):
if
is_super_user
(
request
):
edept
=
DEPT
.
objects
.
all
()
edept
=
DEPT
.
objects
.
all
()
egroup
=
BisGroup
.
objects
.
all
(
)
egroup
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
eusergroup
=
UserGroup
.
objects
.
all
()
eusergroup
=
UserGroup
.
objects
.
all
()
elif
is_group_admin
(
request
):
elif
is_group_admin
(
request
):
dept_id
=
get_user_dept
(
request
)
dept_id
=
get_user_dept
(
request
)
...
@@ -93,21 +95,20 @@ def add_host(request):
...
@@ -93,21 +95,20 @@ def add_host(request):
return
render_to_response
(
'jasset/host_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/host_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
add_host_multi
(
request
):
def
add_host_multi
(
request
):
header_title
,
path1
,
path2
=
u'批量添加主机'
,
u'资产管理'
,
u'批量添加主机'
header_title
,
path1
,
path2
=
u'批量添加主机'
,
u'资产管理'
,
u'批量添加主机'
login_types
=
{
'LDAP'
:
'L'
,
'
SSH_KEY'
:
'S'
,
'PASSWORD'
:
'P'
,
'
MAP'
:
'M'
}
login_types
=
{
'LDAP'
:
'L'
,
'MAP'
:
'M'
}
j_group
=
[]
dept_id
=
get_user_dept
(
request
)
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
multi_hosts
=
request
.
POST
.
get
(
'j_multi'
)
.
split
(
'
\n
'
)
multi_hosts
=
request
.
POST
.
get
(
'j_multi'
)
.
split
(
'
\n
'
)
for
host
in
multi_hosts
:
for
host
in
multi_hosts
:
if
host
==
''
:
if
host
==
''
:
break
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_type
=
login_types
[
j_type
]
j_groups
=
j_groups
.
split
(
','
)
j_group
=
ast
.
literal_eval
(
j_groups
)
for
group
in
j_groups
:
j_dept
=
ast
.
literal_eval
(
j_depts
)
g
=
group
.
strip
(
'[]'
)
.
encode
(
'utf-8'
)
.
strip
()
j_group
.
append
(
g
)
if
Asset
.
objects
.
filter
(
ip
=
str
(
j_ip
)):
if
Asset
.
objects
.
filter
(
ip
=
str
(
j_ip
)):
emg
=
u'该IP
%
s 已存在!'
%
j_ip
emg
=
u'该IP
%
s 已存在!'
%
j_ip
...
@@ -117,9 +118,9 @@ def add_host_multi(request):
...
@@ -117,9 +118,9 @@ def add_host_multi(request):
if
j_type
==
'M'
:
if
j_type
==
'M'
:
j_user
=
request
.
POST
.
get
(
'j_user'
)
j_user
=
request
.
POST
.
get
(
'j_user'
)
j_password
=
cryptor
.
encrypt
(
request
.
POST
.
get
(
'j_password'
))
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
:
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'批量添加添加成功'
smg
=
u'批量添加添加成功'
return
HttpResponseRedirect
(
'/jasset/host_list/'
)
return
HttpResponseRedirect
(
'/jasset/host_list/'
)
...
@@ -127,6 +128,7 @@ def add_host_multi(request):
...
@@ -127,6 +128,7 @@ def add_host_multi(request):
return
render_to_response
(
'jasset/host_add_multi.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/host_add_multi.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
batch_host_edit
(
request
):
def
batch_host_edit
(
request
):
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
len_table
=
request
.
POST
.
get
(
'len_table'
)
len_table
=
request
.
POST
.
get
(
'len_table'
)
...
@@ -161,7 +163,8 @@ def batch_host_edit(request):
...
@@ -161,7 +163,8 @@ def batch_host_edit(request):
return
render_to_response
(
'jasset/host_list.html'
)
return
render_to_response
(
'jasset/host_list.html'
)
@require_admin
@require_login
def
list_host
(
request
):
def
list_host
(
request
):
header_title
,
path1
,
path2
=
u'查看主机'
,
u'资产管理'
,
u'查看主机'
header_title
,
path1
,
path2
=
u'查看主机'
,
u'资产管理'
,
u'查看主机'
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
...
@@ -172,8 +175,6 @@ def list_host(request):
...
@@ -172,8 +175,6 @@ def list_host(request):
if
keyword
:
if
keyword
:
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
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'
)
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
:
else
:
posts
=
Asset
.
objects
.
all
()
.
order_by
(
'ip'
)
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
)
...
@@ -181,13 +182,16 @@ def list_host(request):
...
@@ -181,13 +182,16 @@ def list_host(request):
if
keyword
:
if
keyword
:
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
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'
)
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
:
else
:
posts
=
Asset
.
objects
.
all
()
.
filter
(
dept
=
dept
)
.
order_by
(
'ip'
)
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
))
return
render_to_response
(
'jasset/host_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
host_del
(
request
,
offset
):
def
host_del
(
request
,
offset
):
if
offset
==
'multi'
:
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
len_list
=
request
.
POST
.
get
(
"len_list"
)
...
@@ -205,6 +209,7 @@ def host_del(request, offset):
...
@@ -205,6 +209,7 @@ def host_del(request, offset):
return
HttpResponseRedirect
(
'/jasset/host_list/'
)
return
HttpResponseRedirect
(
'/jasset/host_list/'
)
@require_admin
def
host_edit
(
request
):
def
host_edit
(
request
):
actives
=
{
1
:
u'激活'
,
0
:
u'禁用'
}
actives
=
{
1
:
u'激活'
,
0
:
u'禁用'
}
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
...
@@ -271,6 +276,7 @@ def host_edit(request):
...
@@ -271,6 +276,7 @@ def host_edit(request):
return
render_to_response
(
'jasset/host_edit.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/host_edit.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_login
def
jlist_ip
(
request
,
offset
):
def
jlist_ip
(
request
,
offset
):
header_title
,
path1
,
path2
=
u'主机详细信息'
,
u'资产管理'
,
u'主机详情'
header_title
,
path1
,
path2
=
u'主机详细信息'
,
u'资产管理'
,
u'主机详情'
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
...
@@ -280,6 +286,7 @@ def jlist_ip(request, offset):
...
@@ -280,6 +286,7 @@ def jlist_ip(request, offset):
return
render_to_response
(
'jasset/jlist_ip.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/jlist_ip.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_super_user
def
add_idc
(
request
):
def
add_idc
(
request
):
header_title
,
path1
,
path2
=
u'添加IDC'
,
u'资产管理'
,
u'添加IDC'
header_title
,
path1
,
path2
=
u'添加IDC'
,
u'资产管理'
,
u'添加IDC'
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
...
@@ -295,6 +302,7 @@ def add_idc(request):
...
@@ -295,6 +302,7 @@ def add_idc(request):
return
render_to_response
(
'jasset/idc_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/idc_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
list_idc
(
request
):
def
list_idc
(
request
):
header_title
,
path1
,
path2
=
u'查看IDC'
,
u'资产管理'
,
u'查看IDC'
header_title
,
path1
,
path2
=
u'查看IDC'
,
u'资产管理'
,
u'查看IDC'
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
...
@@ -306,6 +314,7 @@ def list_idc(request):
...
@@ -306,6 +314,7 @@ def list_idc(request):
return
render_to_response
(
'jasset/idc_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/idc_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_super_user
def
edit_idc
(
request
):
def
edit_idc
(
request
):
header_title
,
path1
,
path2
=
u'编辑IDC'
,
u'资产管理'
,
u'编辑IDC'
header_title
,
path1
,
path2
=
u'编辑IDC'
,
u'资产管理'
,
u'编辑IDC'
edit
=
1
edit
=
1
...
@@ -334,6 +343,7 @@ def edit_idc(request):
...
@@ -334,6 +343,7 @@ def edit_idc(request):
return
render_to_response
(
'jasset/idc_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/idc_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_super_user
def
del_idc
(
request
,
offset
):
def
del_idc
(
request
,
offset
):
if
offset
==
'multi'
:
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
len_list
=
request
.
POST
.
get
(
"len_list"
)
...
@@ -387,14 +397,14 @@ def list_group(request):
...
@@ -387,14 +397,14 @@ def list_group(request):
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
if
is_super_user
(
request
):
if
is_super_user
(
request
):
if
keyword
:
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
:
else
:
posts
=
BisGroup
.
objects
.
all
(
)
.
order_by
(
'id'
)
posts
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
.
order_by
(
'id'
)
elif
is_group_admin
(
request
):
elif
is_group_admin
(
request
):
if
keyword
:
if
keyword
:
posts
=
BisGroup
.
objects
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
filter
(
dept
=
dept
)
posts
=
BisGroup
.
objects
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
filter
(
dept
=
dept
)
else
:
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
)
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
))
return
render_to_response
(
'jasset/group_list.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
@@ -406,14 +416,17 @@ def edit_group(request):
...
@@ -406,14 +416,17 @@ def edit_group(request):
group
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
group
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
all
=
Asset
.
objects
.
all
()
all
=
Asset
.
objects
.
all
()
dept_id
=
get_user_dept
(
request
)
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'
)
eposts
=
contact_list
=
Asset
.
objects
.
filter
(
bis_group
=
group
)
.
order_by
(
'ip'
)
if
is_super_user
(
request
):
if
is_super_user
(
request
):
edept
=
DEPT
.
objects
.
all
()
posts
=
[
g
for
g
in
all
if
g
not
in
eposts
]
posts
=
[
g
for
g
in
all
if
g
not
in
eposts
]
elif
is_group_admin
(
request
):
elif
is_group_admin
(
request
):
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
all_dept
=
Asset
.
objects
.
filter
(
dept
=
dept
)
all_dept
=
Asset
.
objects
.
filter
(
dept
=
dept
)
posts
=
[
g
for
g
in
all_dept
if
g
not
in
eposts
]
posts
=
[
g
for
g
in
all_dept
if
g
not
in
eposts
]
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
j_group
=
request
.
POST
.
get
(
'j_group'
)
j_group
=
request
.
POST
.
get
(
'j_group'
)
j_hosts
=
request
.
POST
.
getlist
(
'j_hosts'
)
j_hosts
=
request
.
POST
.
getlist
(
'j_hosts'
)
...
@@ -430,30 +443,43 @@ def edit_group(request):
...
@@ -430,30 +443,43 @@ def edit_group(request):
return
render_to_response
(
'jasset/group_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jasset/group_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
detail_group
(
request
):
def
detail_group
(
request
):
header_title
,
path1
,
path2
=
u'主机组详情'
,
u'资产管理'
,
u'主机组详情'
header_title
,
path1
,
path2
=
u'主机组详情'
,
u'资产管理'
,
u'主机组详情'
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
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_id
=
request
.
GET
.
get
(
'id'
)
group_name
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
.
name
group_name
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
.
name
b
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
b
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
if
is_super_user
(
request
):
posts
=
Asset
.
objects
.
filter
(
bis_group
=
b
)
.
order_by
(
'ip'
)
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
)
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
))
return
render_to_response
(
'jasset/group_detail.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
def
detail_idc
(
request
):
def
detail_idc
(
request
):
header_title
,
path1
,
path2
=
u'IDC详情'
,
u'资产管理'
,
u'IDC详情'
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_id
=
request
.
GET
.
get
(
'id'
)
idc_name
=
IDC
.
objects
.
get
(
id
=
idc_id
)
.
name
idc_name
=
IDC
.
objects
.
get
(
id
=
idc_id
)
.
name
b
=
IDC
.
objects
.
get
(
id
=
idc_id
)
b
=
IDC
.
objects
.
get
(
id
=
idc_id
)
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'
)
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
)
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
))
return
render_to_response
(
'jasset/idc_detail.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
group_del_host
(
request
,
offset
):
def
group_del_host
(
request
,
offset
):
if
request
.
method
==
'POST'
:
if
request
.
method
==
'POST'
:
group_name
=
request
.
POST
.
get
(
'group_name'
)
group_name
=
request
.
POST
.
get
(
'group_name'
)
...
@@ -475,6 +501,7 @@ def group_del_host(request, offset):
...
@@ -475,6 +501,7 @@ def group_del_host(request, offset):
return
HttpResponseRedirect
(
'/jasset/
%
s_detail/?id=
%
s'
%
(
offset
,
group
.
id
))
return
HttpResponseRedirect
(
'/jasset/
%
s_detail/?id=
%
s'
%
(
offset
,
group
.
id
))
@require_admin
def
group_del
(
request
,
offset
):
def
group_del
(
request
,
offset
):
if
offset
==
'multi'
:
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
len_list
=
request
.
POST
.
get
(
"len_list"
)
...
@@ -490,10 +517,17 @@ def group_del(request, offset):
...
@@ -490,10 +517,17 @@ def group_del(request, offset):
def
host_search
(
request
):
def
host_search
(
request
):
keyword
=
request
.
GET
.
get
(
'keyword'
)
keyword
=
request
.
GET
.
get
(
'keyword'
)
login_types
=
{
'L'
:
'LDAP'
,
'S'
:
'SSH_KEY'
,
'P'
:
'PASSWORD'
,
'M'
:
'MAP'
}
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
)
|
posts
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
distinct
()
.
order_by
(
'ip'
)
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
)
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
))
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):
...
@@ -5,6 +5,7 @@ class Log(models.Model):
user
=
models
.
CharField
(
max_length
=
20
,
null
=
True
)
user
=
models
.
CharField
(
max_length
=
20
,
null
=
True
)
host
=
models
.
CharField
(
max_length
=
20
,
null
=
True
)
host
=
models
.
CharField
(
max_length
=
20
,
null
=
True
)
remote_ip
=
models
.
CharField
(
max_length
=
100
)
remote_ip
=
models
.
CharField
(
max_length
=
100
)
dept_name
=
models
.
CharField
(
max_length
=
20
)
log_path
=
models
.
CharField
(
max_length
=
100
)
log_path
=
models
.
CharField
(
max_length
=
100
)
start_time
=
models
.
DateTimeField
(
null
=
True
)
start_time
=
models
.
DateTimeField
(
null
=
True
)
pid
=
models
.
IntegerField
(
max_length
=
10
)
pid
=
models
.
IntegerField
(
max_length
=
10
)
...
...
jlog/views.py
View file @
fef22445
...
@@ -12,6 +12,8 @@ from django.shortcuts import render_to_response
...
@@ -12,6 +12,8 @@ from django.shortcuts import render_to_response
from
connect
import
BASE_DIR
from
connect
import
BASE_DIR
from
jlog.models
import
Log
from
jlog.models
import
Log
from
jumpserver.views
import
pages
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
=
ConfigParser
.
ConfigParser
()
CONF
.
read
(
'
%
s/jumpserver.conf'
%
BASE_DIR
)
CONF
.
read
(
'
%
s/jumpserver.conf'
%
BASE_DIR
)
...
@@ -21,14 +23,30 @@ def log_list_online(request):
...
@@ -21,14 +23,30 @@ def log_list_online(request):
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'在线用户'
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'在线用户'
keyword
=
request
.
GET
.
get
(
'keyword'
)
keyword
=
request
.
GET
.
get
(
'keyword'
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
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
:
if
keyword
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
else
:
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
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
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
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
))
return
render_to_response
(
'jlog/log_online.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
@@ -36,14 +54,29 @@ def log_list_offline(request):
...
@@ -36,14 +54,29 @@ def log_list_offline(request):
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'历史记录'
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'历史记录'
keyword
=
request
.
GET
.
get
(
'keyword'
)
keyword
=
request
.
GET
.
get
(
'keyword'
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
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
:
if
keyword
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
else
:
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
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
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
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
))
return
render_to_response
(
'jlog/log_offline.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
@@ -70,13 +103,23 @@ def log_history(request):
...
@@ -70,13 +103,23 @@ def log_history(request):
def
log_search
(
request
):
def
log_search
(
request
):
keyword
=
request
.
GET
.
get
(
'keyword'
)
keyword
=
request
.
GET
.
get
(
'keyword'
)
env
=
request
.
GET
.
get
(
'env'
)
env
=
request
.
GET
.
get
(
'env'
)
dept_id
=
get_user_dept
(
request
)
dept_name
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
.
name
if
is_super_user
(
request
):
if
env
==
'online'
:
if
env
==
'online'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
0
)
.
order_by
(
'-start_time'
)
.
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'
:
elif
env
==
'offline'
:
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
posts
=
contact_list
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
.
filter
(
is_finished
=
1
)
.
order_by
(
'-start_time'
)
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
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
))
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):
...
@@ -94,6 +94,13 @@ def is_group_admin(request):
return
False
return
False
def
is_common_user
(
request
):
if
request
.
session
.
get
(
'role_id'
)
==
0
:
return
True
else
:
return
False
def
get_user_dept
(
request
):
def
get_user_dept
(
request
):
user_id
=
request
.
session
.
get
(
'user_id'
)
user_id
=
request
.
session
.
get
(
'user_id'
)
if
user_id
:
if
user_id
:
...
...
jumpserver/context_processors.py
View file @
fef22445
from
juser.models
import
User
from
juser.models
import
User
from
jasset.models
import
Asset
def
name_proc
(
request
):
def
name_proc
(
request
):
...
@@ -6,8 +7,11 @@ def name_proc(request):
...
@@ -6,8 +7,11 @@ def name_proc(request):
role_id
=
request
.
session
.
get
(
'role_id'
)
role_id
=
request
.
session
.
get
(
'role_id'
)
user_total_num
=
User
.
objects
.
all
()
.
count
()
user_total_num
=
User
.
objects
.
all
()
.
count
()
user_active_num
=
User
.
objects
.
filter
(
is_active
=
True
)
.
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
)
request
.
session
.
set_expiry
(
3600
)
return
{
'session_user_id'
:
user_id
,
'session_role_id'
:
role_id
,
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):
...
@@ -159,22 +159,6 @@ def string_length(string, length):
return
'
%
s ...'
%
string
[
0
:
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'
)
@register.filter
(
name
=
'to_name'
)
def
to_name
(
user_id
):
def
to_name
(
user_id
):
try
:
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 @@
...
@@ -3,6 +3,8 @@
<script
src=
"/static/js/plugins/slimscroll/jquery.slimscroll.min.js"
></script>
<script
src=
"/static/js/plugins/slimscroll/jquery.slimscroll.min.js"
></script>
<script
src=
"/static/js/bootstrap-dialog.js"
></script>
<script
src=
"/static/js/bootstrap-dialog.js"
></script>
<script
src=
"/static/js/mindmup-editabletable.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 -->
<!-- Custom and plugin javascript -->
<script
src=
"/static/js/inspinia.js"
></script>
<script
src=
"/static/js/inspinia.js"
></script>
...
...
templates/jasset/group_add.html
View file @
fef22445
...
@@ -38,7 +38,7 @@
...
@@ -38,7 +38,7 @@
{% ifequal session_role_id 1 %}
{% ifequal session_role_id 1 %}
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<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
class=
"col-sm-8"
><input
type=
"text"
name=
"j_dept"
value=
"{{ edept.name }}"
class=
"form-control"
readonly=
"readonly"
></div>
</div>
</div>
{% endifequal %}
{% endifequal %}
...
@@ -54,9 +54,9 @@
...
@@ -54,9 +54,9 @@
</select>
</select>
</div>
</div>
<div
class=
"col-sm-1"
>
<div
class=
"col-sm-1"
>
<div
class=
"
bt
n-group"
style=
"margin-top: 50px;"
>
<div
class=
"
fc-butto
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=
"
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=
"
btn btn-white"
onclick=
"move_left('groups_selected', 'groups')"
><i
class=
"fa fa-chevron-left"
></i>
</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>
</div>
<div
class=
"col-sm-3"
>
<div
class=
"col-sm-3"
>
...
...
templates/jasset/host_add.html
View file @
fef22445
...
@@ -118,16 +118,6 @@
...
@@ -118,16 +118,6 @@
</div>
</div>
</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=
"hr-line-dashed"
></div>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
是否激活
<span
class=
"red-fonts"
>
*
</span>
</label>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
是否激活
<span
class=
"red-fonts"
>
*
</span>
</label>
<div
class=
"col-sm-8"
>
<div
class=
"col-sm-8"
>
...
...
templates/jasset/host_add_multi.html
View file @
fef22445
...
@@ -44,7 +44,7 @@
...
@@ -44,7 +44,7 @@
{% endif %}
{% endif %}
<h4>
按照文本框内主机信息格式填写, 多台主机回车换行
</h4>
<h4>
按照文本框内主机信息格式填写, 多台主机回车换行
</h4>
<form
id=
"assetMulti"
method=
"post"
class=
"form-horizontal"
>
<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=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-4"
>
<div
class=
"col-sm-4 col-sm-offset-4"
>
...
...
templates/jlog/log_offline.html
View file @
fef22445
...
@@ -77,6 +77,7 @@
...
@@ -77,6 +77,7 @@
<thead>
<thead>
<tr>
<tr>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
用户名
</th>
<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"
>
来源IP
</th>
<th
class=
"text-center"
>
命令统计
</th>
<th
class=
"text-center"
>
命令统计
</th>
...
@@ -89,8 +90,9 @@
...
@@ -89,8 +90,9 @@
{% for post in contacts.object_list %}
{% for post in contacts.object_list %}
<tr
class=
"gradeX"
>
<tr
class=
"gradeX"
>
<td
class=
"text-center"
id=
"username"
>
{{ post.user }}
</td>
<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.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"
><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=
"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>
<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 @@
...
@@ -77,6 +77,7 @@
<thead>
<thead>
<tr>
<tr>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
用户名
</th>
<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"
>
来源IP
</th>
<th
class=
"text-center"
>
实时监控
</th>
<th
class=
"text-center"
>
实时监控
</th>
...
@@ -89,6 +90,7 @@
...
@@ -89,6 +90,7 @@
{% for post in contacts.object_list %}
{% for post in contacts.object_list %}
<tr
class=
"gradeX"
>
<tr
class=
"gradeX"
>
<td
id=
"username"
class=
"text-center"
>
{{ post.user }}
</td>
<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.host }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.remote_ip }}
</td>
<td
id=
"ip"
class=
"text-center"
>
{{ post.remote_ip }}
</td>
<td
class=
"text-center"
><a
class=
"monitor"
filename=
"{{ post.log_path }}"
>
监控
</a></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 @@
...
@@ -3,6 +3,7 @@
<thead>
<thead>
<tr>
<tr>
<th
class=
"text-center"
>
用户名
</th>
<th
class=
"text-center"
>
用户名
</th>
<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"
>
来源IP
</th>
<th
class=
"text-center"
>
命令统计
</th>
<th
class=
"text-center"
>
命令统计
</th>
...
@@ -15,6 +16,7 @@
...
@@ -15,6 +16,7 @@
{% for post in contacts.object_list %}
{% for post in contacts.object_list %}
<tr
class=
"gradeX"
>
<tr
class=
"gradeX"
>
<td
class=
"text-center"
id=
"username"
>
{{ post.user }}
</td>
<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.host }}
</td>
<td
class=
"text-center"
id=
"ip"
>
{{ post.remote_ip }}
</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>
<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 @@
...
@@ -6,3 +6,4 @@
<link
href=
"/static/css/colorbox.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/colorbox.css"
rel=
"stylesheet"
>
<link
href=
"/static/css/vaildator/jquery.validator.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/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 @@
...
@@ -27,7 +27,7 @@
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<ul
class=
"nav nav-second-level"
>
<li
class=
"host_add host_add_multi"
><a
href=
"/jasset/host_add/"
>
添加资产
</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"
>
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_add"
><a
href=
"/jasset/jgroup_add/"
>
添加主机组
</a></li>
<li
class=
"jgroup_list group_detail"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</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>
<li
class=
"idc_add"
><a
href=
"/jasset/idc_add/"
>
添加IDC
</a></li>
...
@@ -99,11 +99,11 @@
...
@@ -99,11 +99,11 @@
<li
id=
"jasset"
>
<li
id=
"jasset"
>
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<ul
class=
"nav nav-second-level"
>
<li
id=
"host_add
"
><a
href=
"/jasset/host_add/"
>
添加资产
</a></li>
<li
class=
"host_add host_add_multi
"
><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
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
id
=
"jgroup_add"
><a
href=
"/jasset/jgroup_add/"
>
添加主机组
</a></li>
<li
class
=
"jgroup_add"
><a
href=
"/jasset/jgroup_add/"
>
添加主机组
</a></li>
<li
id=
"jgroup_list
"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</a></li>
<li
class=
"jgroup_list group_detail
"
><a
href=
"/jasset/jgroup_list/"
>
查看主机组
</a></li>
<li
id=
"idc_list
"
><a
href=
"/jasset/idc_list/"
>
查看IDC
</a></li>
<li
class=
"idc_list idc_detail
"
><a
href=
"/jasset/idc_list/"
>
查看IDC
</a></li>
</ul>
</ul>
</li>
</li>
<li
id=
"jperm"
>
<li
id=
"jperm"
>
...
@@ -140,3 +140,48 @@
...
@@ -140,3 +140,48 @@
</div>
</div>
</nav>
</nav>
{% endifequal %}
{% 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