diff --git a/bower.json b/bower.json index 36b7fe83..ade06474 100644 --- a/bower.json +++ b/bower.json @@ -74,5 +74,9 @@ "echarts": "^3.1.7", "malihu-custom-scrollbar-plugin": "^3.1.3", "animate.css": "^3.5.1" + }, + "resolutions": { + "jquery": "^2.2.3", + "fastclick": "^1.0.6" } } diff --git a/build/css/custom.css b/build/css/custom.css index 3df2d0a6..4ce7187b 100644 --- a/build/css/custom.css +++ b/build/css/custom.css @@ -1072,8 +1072,7 @@ table.jambo_table tbody tr.selected td { .dataTables_wrapper { position: relative; clear: both; - zoom: 1; - /* Feeling sorry for IE */ } + zoom: 1; } .dataTables_processing { position: absolute; @@ -1112,47 +1111,6 @@ table.dataTable td.focus { outline: 2px solid #1ABB9C !important; outline-offset: -1px; } -/* Pagination nested */ -.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { - height: 19px; - float: left; - cursor: pointer; - color: #111 !important; } - -.paginate_disabled_previous:hover, .paginate_enabled_previous:hover, .paginate_disabled_next:hover, .paginate_enabled_next:hover { - text-decoration: none !important; } - -.paginate_disabled_previous:active, .paginate_enabled_previous:active, .paginate_disabled_next:active, .paginate_enabled_next:active { - outline: none; } - -.paginate_disabled_previous, .paginate_disabled_next { - color: #666 !important; } - -.paginate_disabled_previous, .paginate_enabled_previous { - padding-left: 23px; } - -.paginate_disabled_next, .paginate_enabled_next { - padding-right: 23px; - margin-left: 10px; } - -.paginate_disabled_previous { - background: url("../images/back_disabled.png") no-repeat top left; } - -.paginate_enabled_previous { - background: url("../images/back_enabled.png") no-repeat top left; } - -.paginate_enabled_previous:hover { - background: url("../images/back_enabled_hover.png") no-repeat top left; } - -.paginate_disabled_next { - background: url("../images/forward_disabled.png") no-repeat top right; } - -.paginate_enabled_next { - background: url("../images/forward_enabled.png") no-repeat top right; } - -.paginate_enabled_next:hover { - background: url("../images/forward_enabled_hover.png") no-repeat top right; } - table.display { margin: 0 auto; clear: both; @@ -1259,7 +1217,7 @@ div.box { border: 1px solid #8080FF; background-color: #E5E5FF; } -/* ********* /tables styleing ****************************** */ +/* ********* /tables styling ****************************** */ /* ********* /dashboard widget **************************** */ /* ********* widgets *************************************** */ ul.msg_list li { @@ -3069,100 +3027,6 @@ ul.project_files li a i { transform: rotate(-90deg); } /* ********* /verticle tabs **************************** */ -.avatar-view { - display: block; - border: 3px solid #fff; - border-radius: 5px; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.15); - cursor: pointer; - overflow: hidden; } - -.avatar-body { - padding-right: 15px; - padding-left: 15px; } - -.avatar-upload { - overflow: hidden; } - -.avatar-upload label { - display: block; - float: left; - clear: left; - width: 100px; } - -.avatar-upload input { - display: block; - margin-left: 110px; } - -.avater-alert { - margin-top: 10px; - margin-bottom: 10px; } - -.avatar-wrapper { - height: 364px; - width: 100%; - margin-top: 15px; - box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.25); - background-color: #fcfcfc; - overflow: hidden; } - -.avatar-wrapper img { - display: block; - height: auto; - max-width: 100%; } - -.avatar-preview { - float: left; - margin-top: 15px; - margin-right: 15px; - border: 1px solid #eee; - border-radius: 4px; - background-color: #fff; - overflow: hidden; } - -.avatar-preview:hover { - border-color: #ccf; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.15); } - -.avatar-preview img { - width: 100%; } - -.preview-lg { - height: 184px; - width: 184px; - margin-top: 15px; } - -.preview-md { - height: 100px; - width: 100px; } - -.preview-sm { - height: 50px; - width: 50px; } - -@media (min-width: 992px) { - .avatar-preview { - float: none; } } -.avatar-btns { - margin-top: 30px; - margin-bottom: 15px; } - -.avatar-btns .btn-group { - margin-right: 5px; } - -.loading { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #fff url("../images/loading.gif") no-repeat center center; - opacity: .75; - filter: alpha(opacity=75); - z-index: 20140628; } - -/* ********* /image cropping **************************** */ /* ********* moris **************************** */ .morris-hover { position: absolute; diff --git a/build/css/custom.min.css b/build/css/custom.min.css index e94c8cf8..be7c9a3a 100644 --- a/build/css/custom.min.css +++ b/build/css/custom.min.css @@ -1,7 +1,7 @@ -.left_col{background:#2A3F54}.nav-sm .container.body .col-md-3.left_col{width:70px;padding:0;z-index:9999;position:absolute}.nav-sm .container.body .col-md-3.left_col.menu_fixed{position:fixed;height:100%}.nav-sm .container.body .col-md-3.left_col .mCSB_container,.nav-sm .container.body .col-md-3.left_col .mCustomScrollBox{overflow:visible}.nav-sm .hidden-small{visibility:hidden}.nav-sm .container.body .right_col{padding:10px 20px;margin-left:70px;z-index:2}.nav-sm .navbar.nav_title{width:70px}.nav-sm .navbar.nav_title a span{display:none}.nav-sm .navbar.nav_title a i{font-size:27px;margin:13px 0 0 3px}.site_title i{border:1px solid #EAEAEA;padding:5px 6px;border-radius:50%}.nav-sm .main_container .top_nav{display:block;margin-left:70px;z-index:2}.nav-sm .nav.side-menu li a{text-align:center !important;font-weight:400;font-size:10px;padding:10px 5px}.nav-sm .nav.child_menu li.active,.nav-sm .nav.side-menu li.active-sm{border-right:5px solid #1ABB9C}.nav-sm ul.nav.child_menu ul,.nav-sm .nav.side-menu li.active-sm ul ul{position:static;width:200px;background:none}.nav-sm>.nav.side-menu>li.active-sm>a{color:#1ABB9C !important}.nav-sm .nav.side-menu li a i.toggle-up{display:none !important}.nav-sm .nav.side-menu li a i{font-size:25px !important;text-align:center;width:100% !important;margin-bottom:5px}.nav-sm ul.nav.child_menu{left:100%;position:absolute;top:0;width:210px;z-index:4000;background:#3E5367;display:none}.nav-sm ul.nav.child_menu li{padding:0 10px}.nav-sm ul.nav.child_menu li a{text-align:left !important}.nav-sm .profile{display:none}.menu_section{margin-bottom:35px}.menu_section h3{padding-left:23px;color:#fff;text-transform:uppercase;letter-spacing:.5px;font-weight:bold;font-size:11px;margin-bottom:0;margin-top:0;text-shadow:1px 1px #000}.menu_section>ul{margin-top:10px}.profile_pic{width:35%;float:left}.img-circle.profile_img{width:70%;background:#fff;margin-left:15%;z-index:1000;position:inherit;margin-top:20px;border:1px solid rgba(52,73,94,0.44);padding:4px}.profile_info{padding:25px 10px 10px;width:65%;float:left}.profile_info span{font-size:13px;line-height:30px;color:#BAB8B8}.profile_info h2{font-size:14px;color:#ECF0F1;margin:0;font-weight:300}.profile.img_2{text-align:center}.profile.img_2 .profile_pic{width:100%}.profile.img_2 .profile_pic .img-circle.profile_img{width:50%;margin:10px 0 0}.profile.img_2 .profile_info{padding:15px 10px 0;width:100%;margin-bottom:10px;float:left}.main_menu span.fa{float:right;text-align:center;margin-top:5px;font-size:10px;min-width:inherit;color:#C4CFDA}.active a span.fa{text-align:right !important;margin-right:4px}.nav-sm .menu_section{margin:0}.nav-sm span.fa,.nav-sm .menu_section h3{display:none}.nav-sm li li span.fa{display:inline-block}.nav_menu{float:left;background:#EDEDED;border-bottom:1px solid #D9DEE4;margin-bottom:10px;width:100%;position:relative}@media (min-width: 480px){.nav_menu{position:static}}.nav-md .container.body .col-md-3.left_col{width:230px;padding:0;position:absolute;display:-ms-flexbox;display:flex;z-index:9999}.nav-md .container.body .col-md-3.left_col.menu_fixed{height:100%;position:fixed}body .container.body .right_col{background:#F7F7F7}.nav-md .container.body .right_col{padding:10px 20px 0;margin-left:230px}.nav_title{width:230px;float:left;background:#2A3F54;border-radius:0;height:57px}@media (max-width: 991px){.nav-md .container.body .right_col,.nav-md .container.body .top_nav{width:100%;margin:0}.nav-md .container.body .col-md-3.left_col{display:none}.nav-md .container.body .right_col{width:100%;padding-right:0}.right_col{padding:10px !important}}@media (max-width: 1200px){.x_title h2{width:62%;font-size:17px}.tile,.graph{zoom:85%;height:inherit}}@media (max-width: 1270px) and (min-width: 192px){.x_title h2 small{display:none}}.left_col .mCSB_scrollTools{width:6px}.left_col .mCSB_dragger{max-height:400px !important}.blue{color:#3498DB}.purple{color:#9B59B6}.green{color:#1ABB9C}.aero{color:#9CC2CB}.red{color:#E74C3C}.dark{color:#34495E}.border-blue{border-color:#3498DB !important}.border-purple{border-color:#9B59B6 !important}.border-green{border-color:#1ABB9C !important}.border-aero{border-color:#9CC2CB !important}.border-red{border-color:#E74C3C !important}.border-dark{border-color:#34495E !important}.bg-white{background:#fff !important;border:1px solid #fff !important;color:#73879C}.bg-green{background:#1ABB9C !important;border:1px solid #1ABB9C !important;color:#fff}.bg-red{background:#E74C3C !important;border:1px solid #E74C3C !important;color:#fff}.bg-blue{background:#3498DB !important;border:1px solid #3498DB !important;color:#fff}.bg-orange{background:#F39C12 !important;border:1px solid #F39C12 !important;color:#fff}.bg-purple{background:#9B59B6 !important;border:1px solid #9B59B6 !important;color:#fff}.bg-blue-sky{background:#50C1CF !important;border:1px solid #50C1CF !important;color:#fff}.container{width:100%;padding:0}.navbar-nav>li>a,.navbar-brand,.navbar-nav>li>a{color:#fff !important}.top_nav .nav>li>a:focus,.top_nav .nav>li>a:hover,.top_nav .nav .open>a,.top_nav .nav .open>a:focus,.top_nav .nav .open>a:hover{background:#D9DEE4}body{color:#73879C;background:#2A3F54;font-family:"Helvetica Neue", Roboto, Arial, "Droid Sans", sans-serif;font-size:13px;font-weight:400;line-height:1.471}.main_container .top_nav{display:block;margin-left:230px}.no-padding{padding:0 !important}.page-title{width:100%;height:65px;padding:10px 0}.page-title .title_left{width:45%;float:left;display:block}.page-title .title_left h3{margin:9px 0}.page-title .title_right{width:55%;float:left;display:block}.page-title .title_right .pull-right{margin:10px 0}.fixed_height_320{height:320px}.fixed_height_390{height:390px}.fixed_height_200{height:200px}.overflow_hidden{overflow:hidden}.progress-bar-dark{background-color:#34495E !important}.progress-bar-gray{background-color:#BDC3C7 !important}table.no-margin .progress{margin-bottom:0}.main_content{padding:10px 20px}.col-md-55{width:50%;margin-bottom:10px}@media (min-width: 768px){.col-md-55{width:20%}}@media (min-width: 992px){.col-md-55{width:20%}}@media (min-width: 1200px){.col-md-55{width:20%}}@media (min-width: 192px) and (max-width: 1270px){table.tile_info span.right{margin-right:7px;float:left}}.center-margin{margin:0 auto;float:none !important}.col-md-55,.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;float:left;padding-right:10px;padding-left:10px}.row{margin-right:-10px;margin-left:-10px}.grid_slider .col-md-6{padding:0 40px}h1,.h1,h2,.h2,h3,.h3{margin-top:10px;margin-bottom:10px}a{color:#5A738E;text-decoration:none}a,a:visited,a:focus,a:active,:visited,:focus,:active,.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:0}a:hover,a:focus{text-decoration:none}.navbar{margin-bottom:0}.navbar-header{background:#34495E}.navbar-right{margin-right:0}.top_nav .navbar-right{margin:0;width:70%;float:right}.top_nav .navbar-right li{display:inline-block;float:right;position:static}@media (min-width: 480px){.top_nav .navbar-right li{position:relative}}.top_nav .dropdown-menu li{width:100%}.top_nav .dropdown-menu li a{width:100%;padding:12px 20px}.top_nav li a i{font-size:15px}.navbar-static-top{position:fixed;top:0;width:100%}.sidebar-header{border-bottom:0;margin-top:46px}.sidebar-header:first-of-type{margin-top:0}.nav.side-menu>li{position:relative;display:block;cursor:pointer}.nav.side-menu>li>a{margin-bottom:6px}.nav.side-menu>li>a:hover{color:#F2F5F7 !important}.nav.side-menu>li>a:hover,.nav>li>a:focus{text-decoration:none;background:transparent}.nav.child_menu{display:none}.nav.child_menu li:hover,.nav.child_menu li.active{background-color:rgba(255,255,255,0.06)}.nav.child_menu li{padding-left:36px}.nav-md ul.nav.child_menu li:before{background:#425668;bottom:auto;content:"";height:8px;left:23px;margin-top:15px;position:absolute;right:auto;width:8px;z-index:1;border-radius:50%}.nav-md ul.nav.child_menu li:after{border-left:1px solid #425668;bottom:0;content:"";left:27px;position:absolute;top:0}.nav.side-menu>li>a,.nav.child_menu>li>a{color:#E7E7E7;font-weight:500}.nav.child_menu li li:hover,.nav.child_menu li li.active{background:none}.nav.child_menu li li a:hover,.nav.child_menu li li a.active{color:#fff}.nav>li>a{position:relative;display:block;padding:13px 15px 12px}.nav.side-menu>li.current-page,.nav.side-menu>li.active{border-right:5px solid #1ABB9C}.nav li.current-page{background:rgba(255,255,255,0.05)}.nav li li li.current-page{background:none}.nav li li.current-page a{color:#fff}.nav.side-menu>li.active>a{text-shadow:rgba(0,0,0,0.25) 0 -1px 0;background:linear-gradient(#334556, #2C4257),#2A3F54;box-shadow:rgba(0,0,0,0.25) 0 1px 0,inset rgba(255,255,255,0.16) 0 1px 0}.navbar-brand,.navbar-nav>li>a{font-weight:500;color:#ECF0F1 !important;margin-left:0 !important;line-height:32px}.site_title{text-overflow:ellipsis;overflow:hidden;font-weight:400;font-size:22px;width:100%;color:#ECF0F1 !important;margin-left:0 !important;line-height:59px;display:block;height:55px;margin:0;padding-left:10px}.site_title:hover,.site_title:focus{text-decoration:none}.nav.navbar-nav>li>a{color:#515356 !important}.nav.top_menu>li>a{position:relative;display:block;padding:10px 15px;color:#34495E !important}.nav>li>a:hover,.nav>li>a:focus{background-color:transparent}.top_search{padding:0}.top_search .form-control{border-right:0;box-shadow:inset 0 1px 0px rgba(0,0,0,0.075);border-radius:25px 0px 0px 25px;padding-left:20px;border:1px solid rgba(221,226,232,0.49)}.top_search .form-control:focus{border:1px solid rgba(221,226,232,0.49);border-right:0}.top_search .input-group-btn button{border-radius:0px 25px 25px 0px;border:1px solid rgba(221,226,232,0.49);border-left:0;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);color:#93A2B2;margin-bottom:0 !important}.toggle{float:left;margin:0;padding-top:16px;width:70px}.toggle a{padding:15px 15px 0;margin:0;cursor:pointer}.toggle a i{font-size:26px}.nav.child_menu>li>a{color:rgba(255,255,255,0.75);font-size:12px;padding:9px}.panel_toolbox{float:right;min-width:70px}.panel_toolbox>li{float:left;cursor:pointer}.panel_toolbox>li>a{padding:5px;color:#C5C7CB;font-size:14px}.panel_toolbox>li>a:hover{background:#F5F7FA}.line_30{line-height:30px}.main_menu_side{padding:0}.bs-docs-sidebar .nav>li>a{display:block;padding:4px 6px}footer{background:#fff;padding:15px 20px;display:block}@media (min-width: 768px){footer{margin-left:230px}}.nav-sm footer{margin-left:70px}.footer_fixed footer{position:fixed;left:0px;bottom:0px;width:100%}@media (min-width: 768px){.footer_fixed footer{margin-left:0}}@media (min-width: 768px){.footer_fixed .nav-sm footer{margin-left:0}}.tile-stats.sparkline{padding:10px;text-align:center}.jqstooltip{background:#34495E !important;width:30px !important;height:22px !important;text-decoration:none}.tooltip{display:block !important}.tiles{border-top:1px solid #ccc;margin-top:15px;padding-top:5px;margin-bottom:0}.tile{overflow:hidden}.top_tiles{margin-bottom:0}.top_tiles .tile h2{font-size:30px;line-height:30px;margin:3px 0 7px;font-weight:bold}article.media{width:100%}*,*:before,*:after{box-sizing:border-box}#integration-list{width:100%;margin:0 auto;display:table}#integration-list ul{padding:0;margin:20px 0;color:#555}#integration-list ul>li{list-style:none;border-top:1px solid #ddd;display:block;padding:15px;overflow:hidden}#integration-list ul:last-child{border-bottom:1px solid #ddd}#integration-list ul>li:hover{background:#efefef}.expand{display:block;text-decoration:none;color:#555;cursor:pointer}.expand h2{width:85%;float:left}h2{font-size:18px;font-weight:400}#left,#right{display:table}#sup{display:table-cell;vertical-align:middle;width:80%}.detail a{text-decoration:none;color:#C0392B;border:1px solid #C0392B;padding:6px 10px 5px;font-size:13px;margin-right:7px}.detail{margin:10px 0 10px 0px;display:none;line-height:22px;height:150px}.detail span{margin:0}.right-arrow{width:10px;float:right;font-weight:bold;font-size:20px}.accordion .panel{margin-bottom:5px;border-radius:0;border-bottom:1px solid #efefef}.accordion .panel-heading{background:#F2F5F7;padding:13px;width:100%;display:block}.accordion .panel:hover{background:#F2F5F7}.x_panel{position:relative;width:100%;margin-bottom:10px;padding:10px 17px;display:inline-block;background:#fff;border:1px solid #E6E9ED;-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;column-break-inside:avoid;opacity:1;transition:all .2s ease}.x_title{border-bottom:2px solid #E6E9ED;padding:1px 5px 6px;margin-bottom:10px}.x_title .filter{width:40%;float:right}.x_title h2{margin:5px 0 6px;float:left;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.x_title h2 small{margin-left:10px}.x_title span{color:#BDBDBD}.x_content{padding:0 5px 6px;position:relative;width:100%;float:left;clear:both;margin-top:5px}.x_content h4{font-size:16px;font-weight:500}legend{padding-bottom:7px}.demo-placeholder{height:280px}.profile_details:nth-child(3n){clear:both}.profile_details .profile_view{display:inline-block;padding:10px 0 0;background:#fff}.profile_details .profile_view .divider{border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}.profile_details .profile_view .ratings{margin-bottom:0}.profile_details .profile_view .bottom{background:#F2F5F7;padding:9px 0;border-top:1px solid #E6E9ED}.profile_details .profile_view .left{margin-top:20px}.profile_details .profile_view .left p{margin-bottom:3px}.profile_details .profile_view .right{margin-top:0px;padding:10px}.profile_details .profile_view .img-circle{border:1px solid #E6E9ED;padding:2px}.profile_details .profile_view h2{margin:5px 0}.profile_details .profile_view .ratings{text-align:left;font-size:16px}.profile_details .profile_view .brief{margin:0;font-weight:300}.profile_details .profile_left{background:white}.pagination.pagination-split li{display:inline-block;margin-right:3px}.pagination.pagination-split li a{border-radius:4px;color:#768399;-moz-border-radius:4px;-webkit-border-radius:4px}table.tile h3,table.tile h4,table.tile span{font-weight:bold;vertical-align:middle !important}table.tile th,table.tile td{text-align:center}table.tile th{border-bottom:1px solid #E6ECEE}table.tile td{padding:5px 0}table.tile td ul{text-align:left;padding-left:0}table.tile td ul li{list-style:none;width:100%}table.tile td ul li a{width:100%}table.tile td ul li a big{right:0;float:right;margin-right:13px}table.tile_info{width:100%}table.tile_info td{text-align:left;padding:1px;font-size:15px}table.tile_info td p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;line-height:28px}table.tile_info td i{margin-right:8px;font-size:17px;float:left;width:18px;line-height:28px}table.tile_info td:first-child{width:83%}td span{line-height:28px}.sidebar-widget{overflow:hidden}.error-number{font-size:90px;line-height:90px;margin:20px 0}.col-middle{margin-top:5%}.mid_center{width:370px;margin:0 auto;text-align:center;padding:10px 20px}h3.degrees{font-size:22px;font-weight:400;text-align:center}.degrees:after{content:"o";position:relative;top:-12px;font-size:13px;font-weight:300}.daily-weather .day{font-size:14px;border-top:2px solid rgba(115,135,156,0.36);text-align:center;border-bottom:2px solid rgba(115,135,156,0.36);padding:5px 0}.weather-days .col-sm-2{overflow:hidden;width:16.66666667%}.weather .row{margin-bottom:0}.bulk-actions{display:none}table.countries_list{width:100%}table.countries_list td{padding:0 10px;line-height:30px;border-top:1px solid #eeeeee}.dataTables_paginate a{padding:6px 9px !important;background:#ddd !important;border-color:#ddd !important}.paging_full_numbers a.paginate_active{background-color:rgba(38,185,154,0.59) !important;border-color:rgba(38,185,154,0.59) !important}button.DTTT_button,div.DTTT_button,a.DTTT_button{border:1px solid #E7E7E7 !important;background:#E7E7E7 !important;box-shadow:none !important}table.jambo_table{border:1px solid rgba(221,221,221,0.78)}table.jambo_table thead{background:rgba(52,73,94,0.94);color:#ECF0F1}table.jambo_table tbody tr:hover td{background:rgba(38,185,154,0.07);border-top:1px solid rgba(38,185,154,0.11);border-bottom:1px solid rgba(38,185,154,0.11)}table.jambo_table tbody tr.selected{background:rgba(38,185,154,0.16)}table.jambo_table tbody tr.selected td{border-top:1px solid rgba(38,185,154,0.4);border-bottom:1px solid rgba(38,185,154,0.4)}.dataTables_paginate a{background:#ff0000}.dataTables_wrapper{position:relative;clear:both;zoom:1}.dataTables_processing{position:absolute;top:50%;left:50%;width:250px;height:30px;margin-left:-125px;margin-top:-15px;padding:14px 0 2px 0;border:1px solid #ddd;text-align:center;color:#999;font-size:14px;background-color:white}.dataTables_length{width:40%;float:left}.dataTables_filter{width:50%;float:right;text-align:right}.dataTables_info{width:60%;float:left}.dataTables_paginate{float:right;text-align:right}table.dataTable th.focus,table.dataTable td.focus{outline:2px solid #1ABB9C !important;outline-offset:-1px}.paginate_disabled_previous,.paginate_enabled_previous,.paginate_disabled_next,.paginate_enabled_next{height:19px;float:left;cursor:pointer;color:#111 !important}.paginate_disabled_previous:hover,.paginate_enabled_previous:hover,.paginate_disabled_next:hover,.paginate_enabled_next:hover{text-decoration:none !important}.paginate_disabled_previous:active,.paginate_enabled_previous:active,.paginate_disabled_next:active,.paginate_enabled_next:active{outline:none}.paginate_disabled_previous,.paginate_disabled_next{color:#666 !important}.paginate_disabled_previous,.paginate_enabled_previous{padding-left:23px}.paginate_disabled_next,.paginate_enabled_next{padding-right:23px;margin-left:10px}.paginate_disabled_previous{background:url("../images/back_disabled.png") no-repeat top left}.paginate_enabled_previous{background:url("../images/back_enabled.png") no-repeat top left}.paginate_enabled_previous:hover{background:url("../images/back_enabled_hover.png") no-repeat top left}.paginate_disabled_next{background:url("../images/forward_disabled.png") no-repeat top right}.paginate_enabled_next{background:url("../images/forward_enabled.png") no-repeat top right}.paginate_enabled_next:hover{background:url("../images/forward_enabled_hover.png") no-repeat top right}table.display{margin:0 auto;clear:both;width:100%}table.display thead th{padding:8px 18px 8px 10px;border-bottom:1px solid black;font-weight:bold;cursor:pointer}table.display tfoot th{padding:3px 18px 3px 10px;border-top:1px solid black;font-weight:bold}table.display tr.heading2 td{border-bottom:1px solid #aaa}table.display td{padding:3px 10px}table.display td.center{text-align:center}table.display thead th:active,table.display thead td:active{outline:none}.dataTables_scroll{clear:both}.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.top .dataTables_info{float:none}.clear{clear:both}.dataTables_empty{text-align:center}tfoot input{margin:0.5em 0;width:100%;color:#444}tfoot input.search_init{color:#999}td.group{background-color:#d1cfd0;border-bottom:2px solid #A19B9E;border-top:2px solid #A19B9E}td.details{background-color:#d1cfd0;border:2px solid #A19B9E}.example_alt_pagination div.dataTables_info{width:40%}.paging_full_numbers{width:400px;height:22px;line-height:22px}.paging_full_numbers a:active{outline:none}.paging_full_numbers a:hover{text-decoration:none}.paging_full_numbers a.paginate_button,.paging_full_numbers a.paginate_active{border:1px solid #aaa;-webkit-border-radius:5px;-moz-border-radius:5px;padding:2px 5px;margin:0 3px;cursor:pointer}.paging_full_numbers a.paginate_button{background-color:#ddd}.paging_full_numbers a.paginate_button:hover{background-color:#ccc;text-decoration:none !important}.paging_full_numbers a.paginate_active{background-color:#99B3FF}table.display tr.even.row_selected td{background-color:#B0BED9}table.display tr.odd.row_selected td{background-color:#9FAFD1}div.box{height:100px;padding:10px;overflow:auto;border:1px solid #8080FF;background-color:#E5E5FF}ul.msg_list li{background:#f7f7f7;padding:5px;display:-ms-flexbox;display:flex;margin:6px 6px 0;width:96% !important}ul.msg_list li:last-child{margin-bottom:6px;padding:10px}ul.msg_list li a{padding:3px 5px !important}ul.msg_list li a .image img{border-radius:2px 2px 2px 2px;-webkit-border-radius:2px 2px 2px 2px;float:left;margin-right:10px;width:11%}ul.msg_list li a .time{font-size:11px;font-style:italic;font-weight:bold;position:absolute;right:35px}ul.msg_list li a .message{display:block !important;font-size:11px}.dropdown-menu.msg_list span{white-space:normal}.dropdown-menu{border:medium none;box-shadow:none;display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:9998;border:1px solid #D9DEE4;border-top-left-radius:0;border-top-right-radius:0}.dropdown-menu>li>a{color:#5A738E}.navbar-nav .open .dropdown-menu{position:absolute;background:#fff;margin-top:0;border:1px solid #D9DEE4;-webkit-box-shadow:none;right:0;left:auto;width:220px}.navbar-nav .open .dropdown-menu.msg_list{width:300px}.info-number .badge{font-size:10px;font-weight:normal;line-height:13px;padding:2px 6px;position:absolute;right:2px;top:8px}ul.to_do{padding:0}ul.to_do li{background:#f3f3f3;border-radius:3px;position:relative;padding:7px;margin-bottom:5px;list-style:none}ul.to_do p{margin:0}.dashboard-widget{background:#f6f6f6;border-top:5px solid #79C3DF;border-radius:3px;padding:5px 10px 10px}.dashboard-widget .dashboard-widget-title{font-weight:normal;border-bottom:1px solid #c1cdcd;margin:0 0 10px 0;padding-bottom:5px;padding-left:40px;line-height:30px}.dashboard-widget .dashboard-widget-title i{font-size:100%;margin-left:-35px;margin-right:10px;color:#33a1c9;padding:3px 6px;border:1px solid #abd9ea;border-radius:5px;background:#fff}ul.quick-list{width:45%;padding-left:0;display:inline-block}ul.quick-list li{padding-left:10px;list-style:none;margin:0;padding-bottom:6px;padding-top:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}ul.quick-list li i{padding-right:10px;color:#757679}.dashboard-widget-content{padding-top:9px}.dashboard-widget-content .sidebar-widget{width:50%;display:inline-block;vertical-align:top;background:#fff;border:1px solid #abd9ea;border-radius:5px;text-align:center;float:right;padding:2px;margin-top:10px}.widget_summary{width:100%;display:-ms-inline-flexbox;display:inline-flex}.widget_summary .w_left{float:left;text-align:left}.widget_summary .w_center{float:left}.widget_summary .w_right{float:left;text-align:right}.widget_summary .w_right span{font-size:20px}.w_20{width:20%}.w_25{width:25%}.w_55{width:55%}h5.graph_title{text-align:left;margin-left:10px}h5.graph_title i{margin-right:10px;font-size:17px}span.right{float:right;font-size:14px !important}.tile_info a{text-overflow:ellipsis}.sidebar-footer{bottom:0px;clear:both;display:block;padding:5px 0 0 0;position:fixed;width:230px;background:#2A3F54}.sidebar-footer a{padding:7px 0 3px;text-align:center;width:25%;font-size:17px;display:block;float:left;background:#172D44}.sidebar-footer a:hover{background:#425567}.tile_count{margin-bottom:20px;margin-top:20px}.tile_count .tile_stats_count{border-bottom:1px solid #D9DEE4;padding:0 10px 0 20px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}@media (min-width: 992px){.tile_count .tile_stats_count{margin-bottom:10px;border-bottom:0;padding-bottom:10px}}.tile_count .tile_stats_count:before{content:"";position:absolute;left:0;height:65px;border-left:2px solid #ADB2B5;margin-top:10px}@media (min-width: 992px){.tile_count .tile_stats_count:first-child:before{border-left:0}}.tile_count .tile_stats_count .count{font-size:30px;line-height:47px;font-weight:600}@media (min-width: 768px){.tile_count .tile_stats_count .count{font-size:40px}}@media (min-width: 992px) and (max-width: 1100px){.tile_count .tile_stats_count .count{font-size:30px}}.tile_count .tile_stats_count span{font-size:12px}@media (min-width: 768px){.tile_count .tile_stats_count span{font-size:13px}}.tile_count .tile_stats_count .count_bottom i{width:12px}.dashboard_graph{background:#fff;padding:7px 10px}.dashboard_graph .col-md-9,.dashboard_graph .col-md-3{padding:0}a.user-profile{color:#5E6974 !important}.user-profile img{width:29px;height:29px;border-radius:50%;margin-right:10px}ul.top_profiles{height:330px;width:100%}ul.top_profiles li{margin:0;padding:3px 5px}ul.top_profiles li:nth-child(odd){background-color:#eee}.media .profile_thumb{border:1px solid;width:50px;height:50px;margin:5px 10px 5px 0;border-radius:50%;padding:9px 12px}.media .profile_thumb i{font-size:30px}.media .date{background:#ccc;width:52px;margin-right:10px;border-radius:10px;padding:5px}.media .date .month{margin:0;text-align:center;color:#fff}.media .date .day{text-align:center;color:#fff;font-size:27px;margin:0;line-height:27px;font-weight:bold}.event .media-body a.title{font-weight:bold}.event .media-body p{margin-bottom:0}h4.graph_title{margin:7px;text-align:center}.fontawesome-icon-list .fa-hover a:hover{background-color:#ddd;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a{display:block;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:28px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:16px;display:inline-block;text-align:right;margin-right:10px}.main_menu .fa{width:26px;opacity:.99;display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tile-stats{position:relative;display:block;margin-bottom:12px;border:1px solid #E4E4E4;-webkit-border-radius:5px;overflow:hidden;padding-bottom:5px;-webkit-background-clip:padding-box;-moz-border-radius:5px;-moz-background-clip:padding;border-radius:5px;background-clip:padding-box;background:#FFF;transition:all 300ms ease-in-out}.tile-stats:hover .icon i{animation-name:tansformAnimation;animation-duration:.5s;animation-iteration-count:1;color:rgba(58,58,58,0.41);animation-timing-function:ease;animation-fill-mode:forwards;-webkit-animation-name:tansformAnimation;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:1;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;-moz-animation-name:tansformAnimation;-moz-animation-duration:.5s;-moz-animation-iteration-count:1;-moz-animation-timing-function:ease;-moz-animation-fill-mode:forwards}.tile-stats .icon{width:20px;height:20px;color:#BAB8B8;position:absolute;right:53px;top:22px;z-index:1}.tile-stats .icon i{margin:0;font-size:60px;line-height:0;vertical-align:bottom;padding:0}.tile-stats .count{font-size:38px;font-weight:bold;line-height:1.65857}.tile-stats .count,.tile-stats h3,.tile-stats p{position:relative;margin:0;margin-left:10px;z-index:5;padding:0}.tile-stats h3{color:#BAB8B8}.tile-stats p{margin-top:5px;font-size:12px}.tile-stats>.dash-box-footer{position:relative;text-align:center;margin-top:5px;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.tile-stats>.dash-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.tile-stats>.dash-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}table.tile_info{padding:10px 15px}table.tile_info span.right{margin-right:0;float:right;position:absolute;right:4%}.tile:hover{text-decoration:none}.tile_header{border-bottom:transparent;padding:7px 15px;margin-bottom:15px;background:#E7E7E7}.tile_head h4{margin-top:0;margin-bottom:5px}.tiles-bottom{padding:5px 10px;margin-top:10px;background:rgba(194,194,194,0.3);text-align:left}a.star{color:#428bca !important}.mail_content{background:none repeat scroll 0 0 #FFFFFF;border-radius:4px;margin-top:20px;min-height:500px;padding:10px 11px;width:100%}.list-btn-mail{margin-bottom:15px}.list-btn-mail.active{border-bottom:1px solid #39B3D7;padding:0 0 14px}.list-btn-mail>i{float:left;font-size:18px;font-style:normal;width:33px}.list-btn-mail>.cn{background:none repeat scroll 0 0 #39B3D7;border-radius:12px;color:#FFFFFF;float:right;font-style:normal;padding:0 5px}.button-mail{margin:0 0 15px !important;text-align:left;width:100%}.buttons,button,.btn{margin-bottom:5px;margin-right:5px}.btn-group-vertical .btn,.btn-group .btn{margin-bottom:0;margin-right:0}.mail_list_column{border-left:1px solid #DBDBDB}.mail_view{border-left:1px solid #DBDBDB}.mail_list{width:100%;border-bottom:1px solid #DBDBDB;margin-bottom:2px;display:inline-block}.mail_list .left{width:5%;float:left;margin-right:3%}.mail_list .right{width:90%;float:left}.mail_list h3{font-size:15px;font-weight:bold;margin:0px 0 6px}.mail_list h3 small{float:right;color:#ADABAB;font-size:11px;line-height:20px}.mail_list .badge{padding:3px 6px;font-size:8px;background:#BAB7B7}@media (max-width: 767px){.mail_list{margin-bottom:5px;display:inline-block}}.mail_heading h4{font-size:18px;border-bottom:1px solid #ddd;padding-bottom:10px;margin-top:20px}.attachment{margin-top:30px}.attachment ul{width:100%;list-style:none;padding-left:0;display:inline-block;margin-bottom:30px}.attachment ul li{float:left;width:150px;margin-right:10px;margin-bottom:10px}.attachment ul li img{height:150px;border:1px solid #ddd;padding:5px;margin-bottom:10px}.attachment ul li span{float:right}.attachment .file-name{float:left}.attachment .links{width:100%;display:inline-block}.compose{padding:0;position:fixed;bottom:0;right:0;background:#fff;border:1px solid #D9DEE4;border-right:0;border-bottom:0;border-top-left-radius:5px;z-index:9999;display:none}.compose .compose-header{padding:5px;background:#169F85;color:#fff;border-top-left-radius:5px}.compose .compose-header .close{text-shadow:0 1px 0 #ffffff;line-height:.8}.compose .compose-body .editor.btn-toolbar{margin:0}.compose .compose-body .editor-wrapper{height:100%;min-height:50px;max-height:180px;border-radius:0;border-left:none;border-right:none;overflow:auto}.compose .compose-footer{padding:10px}.editor.btn-toolbar{zoom:1;background:#F7F7F7;margin:5px 2px;padding:3px 0;border:1px solid #EFEFEF}.input-group{margin-bottom:10px}.ln_solid{border-top:1px solid #e5e5e5;color:#ffffff;background-color:#ffffff;height:1px;margin:20px 0}span.section{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}.form-control{border-radius:0;width:100%}.form-horizontal .control-label{padding-top:8px}.form-control:focus{border-color:#CCD0D7;box-shadow:none !important}legend{font-size:18px;color:inherit}.form-horizontal .form-group{margin-right:0;margin-left:0}.form-control-feedback{margin-top:8px;height:23px;color:#bbb;line-height:24px;font-size:15px}.form-control-feedback.left{border-right:1px solid #ccc;left:13px}.form-control-feedback.right{border-left:1px solid #ccc;right:13px}.form-control.has-feedback-left{padding-left:45px}.form-control.has-feedback-right{padding-right:45px}.form-group{margin-bottom:10px}.validate{margin-top:10px}.invalid-form-error-message{margin-top:10px;padding:5px}.invalid-form-error-message.filled{border-left:2px solid #E74C3C}p.parsley-success{color:#468847;background-color:#DFF0D8;border:1px solid #D6E9C6}p.parsley-error{color:#B94A48;background-color:#F2DEDE;border:1px solid #EED3D7}ul.parsley-errors-list{list-style:none;color:#E74C3C;padding-left:0}input.parsley-error,textarea.parsley-error,select.parsley-error{background:#FAEDEC;border:1px solid #E85445}.btn-group .parsley-errors-list{display:none}.bad input,.bad select,.bad textarea{border:1px solid #CE5454;box-shadow:0 0 4px -2px #CE5454;position:relative;left:0;-moz-animation:.7s 1 shake linear;-webkit-animation:0.7s 1 shake linear}.item input,.item textarea{transition:0.42s}.item .alert{float:left;margin:0 0 0 20px;padding:3px 10px;color:#FFF;border-radius:3px 4px 4px 3px;background-color:#CE5454;max-width:170px;white-space:pre;position:relative;left:-15px;opacity:0;z-index:1;transition:0.15s ease-out}.item .alert::after{content:'';display:block;height:0;width:0;border-color:transparent #CE5454 transparent transparent;border-style:solid;border-width:11px 7px;position:absolute;left:-13px;top:1px}.item.bad .alert{left:0;opacity:1}.inl-bl{display:inline-block}.well .markup{background:#fff;color:#777;position:relative;padding:45px 15px 15px;margin:15px 0 0 0;background-color:#fff;border-radius:0 0 4px 4px;box-shadow:none}.well .markup::after{content:"Example";position:absolute;top:15px;left:15px;font-size:12px;font-weight:bold;color:#bbb;text-transform:uppercase;letter-spacing:1px}.autocomplete-suggestions{border:1px solid #e4e4e4;background:#F4F4F4;cursor:default;overflow:auto}.autocomplete-suggestion{padding:2px 5px;font-size:1.2em;white-space:nowrap;overflow:hidden}.autocomplete-selected{background:#f0f0f0}.autocomplete-suggestions strong{font-weight:normal;color:#3399ff;font-weight:bolder}.btn{border-radius:3px}a.btn-success,a.btn-primary,a.btn-warning,a.btn-danger{color:#fff}.btn-success{background:#26B99A;border:1px solid #169F85}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background:#169F85}.btn-dark{color:#E9EDEF;background-color:#4B5F71;border-color:#364B5F}.btn-dark:hover,.btn-dark:focus,.btn-dark:active,.btn-dark.active,.open .dropdown-toggle.btn-dark{color:#FFFFFF;background-color:#394D5F;border-color:#394D5F}.btn-round{border-radius:30px}.btn.btn-app{position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;box-shadow:none;border-radius:0;text-align:center;color:#666;border:1px solid #ddd;background-color:#fafafa;font-size:12px}.btn.btn-app>.fa,.btn.btn-app>.glyphicon,.btn.btn-app>.ion{font-size:20px;display:block}.btn.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn.btn-app:active,.btn.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}textarea{padding:10px;vertical-align:top;width:200px}textarea:focus{outline-style:solid;outline-width:2px}.btn_{display:inline-block;padding:3px 9px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);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);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;border-radius:4px;box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ABB9C}@media (min-width: 768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.tagsinput{border:1px solid #CCC;background:#FFF;padding:6px 6px 0;width:300px;overflow-y:auto}span.tag{-moz-border-radius:2px;-webkit-border-radius:2px;display:block;float:left;padding:5px 9px;text-decoration:none;background:#1ABB9C;color:#F1F6F7;margin-right:5px;font-weight:500;margin-bottom:5px;font-family:helvetica}span.tag a{color:#F1F6F7 !important}.tagsinput span.tag a{font-weight:bold;color:#82ad2b;text-decoration:none;font-size:11px}.tagsinput input{width:80px;margin:0px;font-family:helvetica;font-size:13px;border:1px solid transparent;padding:3px;background:transparent;color:#000;outline:0px}.tagsinput div{display:block;float:left}.tags_clear{clear:both;width:100%;height:0px}.not_valid{background:#FBD8DB !important;color:#90111A !important}ul.bar_tabs{overflow:visible;background:#F5F7FA;height:25px;margin:21px 0 14px;padding-left:14px;position:relative;z-index:1;width:100%;border-bottom:1px solid #E6E9ED}ul.bar_tabs>li{border:1px solid #E6E9ED;color:#333 !important;margin-top:-17px;margin-left:8px;background:#fff;border-bottom:none;border-radius:4px 4px 0 0}ul.bar_tabs>li.active{border-right:6px solid #D3D6DA;border-top:0;margin-top:-15px}ul.bar_tabs>li a{padding:10px 17px;background:#F5F7FA;margin:0;border-top-right-radius:0}ul.bar_tabs>li a:hover{border:1px solid transparent}ul.bar_tabs>li.active a{border-bottom:none}ul.bar_tabs.right{padding-right:14px}ul.bar_tabs.right li{float:right}a:focus{outline:none}ul.timeline li{position:relative;border-bottom:1px solid #e8e8e8;clear:both}.timeline .block{margin:0;border-left:3px solid #e8e8e8;overflow:visible;padding:10px 15px;margin-left:105px}.timeline.widget{min-width:0;max-width:inherit}.timeline.widget .block{margin-left:5px}.timeline .tags{position:absolute;top:15px;left:0;width:84px}.timeline .tag{display:block;height:30px;font-size:13px;padding:8px}.timeline .tag span{display:block;overflow:hidden;width:100%;white-space:nowrap;text-overflow:ellipsis}.tag{line-height:1;background:#1ABB9C;color:#fff !important}.tag:after{content:" ";height:30px;width:0;position:absolute;left:100%;top:0;margin:0;pointer-events:none;border-top:14px solid transparent;border-bottom:14px solid transparent;border-left:11px solid #1ABB9C}.timeline h2.title{position:relative;font-size:16px;margin:0}.timeline h2.title:before{content:"";position:absolute;left:-23px;top:3px;display:block;width:14px;height:14px;border:3px solid #d2d3d2;border-radius:14px;background:#f9f9f9}.timeline .byline{padding:.25em 0}.byline{-webkit-font-smoothing:antialiased;font-style:italic;font-size:.9375em;line-height:1.3;color:#aab6aa}ul.social li{border:0}.social-sidebar,.social-body{float:right}.social-sidebar{background:#EDEDED;width:22%}.social-body{border:1px solid #ccc;width:78%}.thumb img{width:50px;height:50px;border-radius:50%}.chat .thumb img{width:27px;height:27px;border-radius:50%}.chat .status{float:left;margin:16px 0 0 -16px;font-size:14px;font-weight:bold;width:12px;height:12px;display:block;border:2px solid #FFF;z-index:12312;border-radius:50%}.chat .status.online{background:#1ABB9C}.chat .status.away{background:#F39C12}.chat .status.offline{background:#ccc}.chat .media-body{padding-top:5px}.dashboard_graph .x_title{padding:5px 5px 7px}.dashboard_graph .x_title h3{margin:0;font-weight:normal}.chart{position:relative;display:inline-block;width:110px;height:110px;margin-top:5px;margin-bottom:5px;text-align:center}.chart canvas{position:absolute;top:0;left:0}.percent{display:inline-block;line-height:110px;z-index:2;font-size:18px}.percent:after{content:'%';margin-left:0.1em;font-size:.8em}.angular{margin-top:100px}.angular .chart{margin-top:0}.widget{min-width:250px;max-width:310px}.widget_tally_box .btn-group button{text-align:center}.widget_tally_box .btn-group button{color:inherit;font-weight:500;background-color:#f5f5f5;border:1px solid #e7e7e7}ul.widget_tally,ul.widget_tally li{width:100%}ul.widget_tally li{padding:2px 10px;border-bottom:1px solid #ECECEC;padding-bottom:4px}ul.widget_tally .month{width:70%;float:left}ul.widget_tally .count{width:30%;float:left;text-align:right}.pie_bg{border-bottom:1px solid rgba(101,204,182,0.16);padding-bottom:15px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);padding-bottom:10px;box-shadow:0 4px 6px -6px #222}.widget_tally_box .flex{display:-ms-flexbox;display:flex}ul.widget_profile_box{width:100%;height:42px;padding:3px;background:#ececec;margin-top:40px;margin-left:1px}ul.widget_profile_box li:first-child{width:25%;float:left}ul.widget_profile_box li:first-child a{float:left}ul.widget_profile_box li:last-child{width:25%;float:right}ul.widget_profile_box li:last-child a{float:right}ul.widget_profile_box li a{font-size:22px;text-align:center;width:35px;height:35px;border:1px solid rgba(52,73,94,0.44);display:block;border-radius:50%;padding:0px}ul.widget_profile_box li a:hover{color:#1ABB9C !important;border:1px solid #26b99a}ul.widget_profile_box li .profile_img{width:85px;height:85px;margin:0;margin-top:-28px}.widget_tally_box p,.widget_tally_box span{text-align:center}.widget_tally_box .name{text-align:center;margin:25px}.widget_tally_box .name_title{text-align:center;margin:5px}.widget_tally_box ul.legend{margin:0}.widget_tally_box ul.legend p,.widget_tally_box ul.legend span{text-align:left}.widget_tally_box ul.legend li .icon{font-size:20px;float:left;width:14px}.widget_tally_box ul.legend li .name{font-size:14px;margin:5px 0 0 14px;text-overflow:ellipsis;float:left}.widget_tally_box ul.legend p{display:inline-block;margin:0}.widget_tally_box ul.verticle_bars li{height:140px;width:23%}.widget .verticle_bars li .progress.vertical.progress_wide{width:65%}ul.count2{width:100%;margin-left:1px;border:1px solid #ddd;border-left:0;border-right:0;padding:10px 0}ul.count2 li{width:30%;text-align:center}ul.count2 li h3{font-weight:400;margin:0}ul.count2 li span{font-weight:300}.divider{border-bottom:1px solid #ddd;margin:10px}.divider-dashed{border-top:1px dashed #e7eaec;background-color:#ffffff;height:1px;margin:10px 0}ul.messages{padding:0;list-style:none}ul.messages li,.tasks li{border-bottom:1px dotted #e6e6e6;padding:8px 0}ul.messages li img.avatar,img.avatar{height:32px;width:32px;float:left;display:inline-block;border-radius:2px;padding:2px;background:#f7f7f7;border:1px solid #e6e6e6}ul.messages li .message_date{float:right;text-align:right}ul.messages li .message_wrapper{margin-left:50px;margin-right:40px}ul.messages li .message_wrapper h4.heading{font-weight:600;margin:0;cursor:pointer;margin-bottom:10px;line-height:100%}ul.messages li .message_wrapper blockquote{padding:0px 10px;margin:0;border-left:5px solid #eee}ul.user_data li{margin-bottom:6px}ul.user_data li p{margin-bottom:0}ul.user_data li .progress{width:90%}.project_progress .progress{margin-bottom:3px !important;margin-top:5px}.projects .list-inline{margin:0}.profile_title{background:#F5F7FA;border:0;padding:7px 0;display:-ms-flexbox;display:flex}ul.stats-overview{border-bottom:1px solid #e8e8e8;padding-bottom:10px;margin-bottom:10px}ul.stats-overview li{display:inline-block;text-align:center;padding:0 15px;width:30%;font-size:14px;border-right:1px solid #e8e8e8}ul.stats-overview li:last-child{border-right:0}ul.stats-overview li .name{font-size:12px}ul.stats-overview li .value{font-size:14px;font-weight:bold;display:block}ul.stats-overview li:first-child{padding-left:0}ul.project_files li{margin-bottom:5px}ul.project_files li a i{width:20px}.project_detail p{margin-bottom:10px}.project_detail p.title{font-weight:bold;margin-bottom:0}.avatar img{border-radius:50%;max-width:45px}.pricing{background:#fff}.pricing .title{background:#1ABB9C;height:110px;color:#fff;padding:15px 0 0;text-align:center}.pricing .title h2{text-transform:capitalize;font-size:18px;border-radius:5px 5px 0 0;margin:0;font-weight:400}.pricing .title h1{font-size:30px;margin:12px}.pricing .title span{background:rgba(51,51,51,0.28);padding:2px 5px}.pricing_features{background:#FAFAFA;padding:20px 15px;min-height:230px;font-size:13.5px}.pricing_features ul li{margin-top:10px}.pricing_footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;text-align:center;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.pricing_footer p{font-size:13px;padding:10px 0 2px;display:block}.ui-ribbon-container{position:relative}.ui-ribbon-container .ui-ribbon-wrapper{position:absolute;overflow:hidden;width:85px;height:88px;top:-3px;right:-3px}.ui-ribbon-container.ui-ribbon-primary .ui-ribbon{background-color:#5b90bf}.ui-ribbon-container .ui-ribbon{position:relative;display:block;text-align:center;font-size:15px;font-weight:700;color:#fff;transform:rotate(45deg);padding:7px 0;left:-5px;top:15px;width:120px;line-height:20px;background-color:#555;box-shadow:0 0 3px rgba(0,0,0,0.3)}.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after,.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before{border-top:2px solid #5b90bf}.ui-ribbon-container .ui-ribbon:before{left:0;bottom:-1px}.ui-ribbon-container .ui-ribbon:before{right:0}.ui-ribbon-container .ui-ribbon:after,.ui-ribbon-container .ui-ribbon:before{position:absolute;content:" ";line-height:0;border-top:2px solid #555;border-left:2px solid transparent;border-right:2px solid transparent}.thumbnail .image{height:120px;overflow:hidden}.caption{padding:9px 5px;background:#F7F7F7}.caption p{margin-bottom:5px}.thumbnail{height:190px;overflow:hidden}.view{overflow:hidden;position:relative;text-align:center;box-shadow:1px 1px 2px #e6e6e6;cursor:default}.view .mask,.view .content{position:absolute;width:100%;overflow:hidden;top:0;left:0}.view img{display:block;position:relative}.view .tools{text-transform:uppercase;color:#fff;text-align:center;position:relative;font-size:17px;padding:3px;background:rgba(0,0,0,0.35);margin:43px 0 0 0}.mask.no-caption .tools{margin:90px 0 0 0}.view .tools a{display:inline-block;color:#FFF;font-size:18px;font-weight:400;padding:0 4px}.view p{font-family:Georgia, serif;font-style:italic;font-size:12px;position:relative;color:#fff;padding:10px 20px 20px;text-align:center}.view a.info{display:inline-block;text-decoration:none;padding:7px 14px;background:#000;color:#fff;text-transform:uppercase;box-shadow:0 0 1px #000}.view-first img{transition:all 0.2s linear}.view-first .mask{opacity:0;background-color:rgba(0,0,0,0.5);transition:all 0.4s ease-in-out}.view-first .tools{transform:translateY(-100px);opacity:0;transition:all 0.2s ease-in-out}.view-first p{transform:translateY(100px);opacity:0;transition:all 0.2s linear}.view-first:hover img{transform:scale(1.1)}.view-first:hover .mask{opacity:1}.view-first:hover .tools,.view-first:hover p{opacity:1;transform:translateY(0px)}.view-first:hover p{transition-delay:0.1s}/*! +.left_col{background:#2A3F54}.nav-sm .container.body .col-md-3.left_col{width:70px;padding:0;z-index:9999;position:absolute}.nav-sm .container.body .col-md-3.left_col.menu_fixed{position:fixed;height:100%}.nav-sm .container.body .col-md-3.left_col .mCSB_container,.nav-sm .container.body .col-md-3.left_col .mCustomScrollBox{overflow:visible}.nav-sm .hidden-small{visibility:hidden}.nav-sm .container.body .right_col{padding:10px 20px;margin-left:70px;z-index:2}.nav-sm .navbar.nav_title{width:70px}.nav-sm .navbar.nav_title a span{display:none}.nav-sm .navbar.nav_title a i{font-size:27px;margin:13px 0 0 3px}.site_title i{border:1px solid #EAEAEA;padding:5px 6px;border-radius:50%}.nav-sm .main_container .top_nav{display:block;margin-left:70px;z-index:2}.nav-sm .nav.side-menu li a{text-align:center !important;font-weight:400;font-size:10px;padding:10px 5px}.nav-sm .nav.child_menu li.active,.nav-sm .nav.side-menu li.active-sm{border-right:5px solid #1ABB9C}.nav-sm ul.nav.child_menu ul,.nav-sm .nav.side-menu li.active-sm ul ul{position:static;width:200px;background:none}.nav-sm>.nav.side-menu>li.active-sm>a{color:#1ABB9C !important}.nav-sm .nav.side-menu li a i.toggle-up{display:none !important}.nav-sm .nav.side-menu li a i{font-size:25px !important;text-align:center;width:100% !important;margin-bottom:5px}.nav-sm ul.nav.child_menu{left:100%;position:absolute;top:0;width:210px;z-index:4000;background:#3E5367;display:none}.nav-sm ul.nav.child_menu li{padding:0 10px}.nav-sm ul.nav.child_menu li a{text-align:left !important}.nav-sm .profile{display:none}.menu_section{margin-bottom:35px}.menu_section h3{padding-left:23px;color:#fff;text-transform:uppercase;letter-spacing:.5px;font-weight:bold;font-size:11px;margin-bottom:0;margin-top:0;text-shadow:1px 1px #000}.menu_section>ul{margin-top:10px}.profile_pic{width:35%;float:left}.img-circle.profile_img{width:70%;background:#fff;margin-left:15%;z-index:1000;position:inherit;margin-top:20px;border:1px solid rgba(52,73,94,0.44);padding:4px}.profile_info{padding:25px 10px 10px;width:65%;float:left}.profile_info span{font-size:13px;line-height:30px;color:#BAB8B8}.profile_info h2{font-size:14px;color:#ECF0F1;margin:0;font-weight:300}.profile.img_2{text-align:center}.profile.img_2 .profile_pic{width:100%}.profile.img_2 .profile_pic .img-circle.profile_img{width:50%;margin:10px 0 0}.profile.img_2 .profile_info{padding:15px 10px 0;width:100%;margin-bottom:10px;float:left}.main_menu span.fa{float:right;text-align:center;margin-top:5px;font-size:10px;min-width:inherit;color:#C4CFDA}.active a span.fa{text-align:right !important;margin-right:4px}.nav-sm .menu_section{margin:0}.nav-sm span.fa,.nav-sm .menu_section h3{display:none}.nav-sm li li span.fa{display:inline-block}.nav_menu{float:left;background:#EDEDED;border-bottom:1px solid #D9DEE4;margin-bottom:10px;width:100%;position:relative}@media (min-width: 480px){.nav_menu{position:static}}.nav-md .container.body .col-md-3.left_col{width:230px;padding:0;position:absolute;display:-ms-flexbox;display:flex;z-index:9999}.nav-md .container.body .col-md-3.left_col.menu_fixed{height:100%;position:fixed}body .container.body .right_col{background:#F7F7F7}.nav-md .container.body .right_col{padding:10px 20px 0;margin-left:230px}.nav_title{width:230px;float:left;background:#2A3F54;border-radius:0;height:57px}@media (max-width: 991px){.nav-md .container.body .right_col,.nav-md .container.body .top_nav{width:100%;margin:0}.nav-md .container.body .col-md-3.left_col{display:none}.nav-md .container.body .right_col{width:100%;padding-right:0}.right_col{padding:10px !important}}@media (max-width: 1200px){.x_title h2{width:62%;font-size:17px}.tile,.graph{zoom:85%;height:inherit}}@media (max-width: 1270px) and (min-width: 192px){.x_title h2 small{display:none}}.left_col .mCSB_scrollTools{width:6px}.left_col .mCSB_dragger{max-height:400px !important}.blue{color:#3498DB}.purple{color:#9B59B6}.green{color:#1ABB9C}.aero{color:#9CC2CB}.red{color:#E74C3C}.dark{color:#34495E}.border-blue{border-color:#3498DB !important}.border-purple{border-color:#9B59B6 !important}.border-green{border-color:#1ABB9C !important}.border-aero{border-color:#9CC2CB !important}.border-red{border-color:#E74C3C !important}.border-dark{border-color:#34495E !important}.bg-white{background:#fff !important;border:1px solid #fff !important;color:#73879C}.bg-green{background:#1ABB9C !important;border:1px solid #1ABB9C !important;color:#fff}.bg-red{background:#E74C3C !important;border:1px solid #E74C3C !important;color:#fff}.bg-blue{background:#3498DB !important;border:1px solid #3498DB !important;color:#fff}.bg-orange{background:#F39C12 !important;border:1px solid #F39C12 !important;color:#fff}.bg-purple{background:#9B59B6 !important;border:1px solid #9B59B6 !important;color:#fff}.bg-blue-sky{background:#50C1CF !important;border:1px solid #50C1CF !important;color:#fff}.container{width:100%;padding:0}.navbar-nav>li>a,.navbar-brand,.navbar-nav>li>a{color:#fff !important}.top_nav .nav>li>a:focus,.top_nav .nav>li>a:hover,.top_nav .nav .open>a,.top_nav .nav .open>a:focus,.top_nav .nav .open>a:hover{background:#D9DEE4}body{color:#73879C;background:#2A3F54;font-family:"Helvetica Neue", Roboto, Arial, "Droid Sans", sans-serif;font-size:13px;font-weight:400;line-height:1.471}.main_container .top_nav{display:block;margin-left:230px}.no-padding{padding:0 !important}.page-title{width:100%;height:65px;padding:10px 0}.page-title .title_left{width:45%;float:left;display:block}.page-title .title_left h3{margin:9px 0}.page-title .title_right{width:55%;float:left;display:block}.page-title .title_right .pull-right{margin:10px 0}.fixed_height_320{height:320px}.fixed_height_390{height:390px}.fixed_height_200{height:200px}.overflow_hidden{overflow:hidden}.progress-bar-dark{background-color:#34495E !important}.progress-bar-gray{background-color:#BDC3C7 !important}table.no-margin .progress{margin-bottom:0}.main_content{padding:10px 20px}.col-md-55{width:50%;margin-bottom:10px}@media (min-width: 768px){.col-md-55{width:20%}}@media (min-width: 992px){.col-md-55{width:20%}}@media (min-width: 1200px){.col-md-55{width:20%}}@media (min-width: 192px) and (max-width: 1270px){table.tile_info span.right{margin-right:7px;float:left}}.center-margin{margin:0 auto;float:none !important}.col-md-55,.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;float:left;padding-right:10px;padding-left:10px}.row{margin-right:-10px;margin-left:-10px}.grid_slider .col-md-6{padding:0 40px}h1,.h1,h2,.h2,h3,.h3{margin-top:10px;margin-bottom:10px}a{color:#5A738E;text-decoration:none}a,a:visited,a:focus,a:active,:visited,:focus,:active,.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:0}a:hover,a:focus{text-decoration:none}.navbar{margin-bottom:0}.navbar-header{background:#34495E}.navbar-right{margin-right:0}.top_nav .navbar-right{margin:0;width:70%;float:right}.top_nav .navbar-right li{display:inline-block;float:right;position:static}@media (min-width: 480px){.top_nav .navbar-right li{position:relative}}.top_nav .dropdown-menu li{width:100%}.top_nav .dropdown-menu li a{width:100%;padding:12px 20px}.top_nav li a i{font-size:15px}.navbar-static-top{position:fixed;top:0;width:100%}.sidebar-header{border-bottom:0;margin-top:46px}.sidebar-header:first-of-type{margin-top:0}.nav.side-menu>li{position:relative;display:block;cursor:pointer}.nav.side-menu>li>a{margin-bottom:6px}.nav.side-menu>li>a:hover{color:#F2F5F7 !important}.nav.side-menu>li>a:hover,.nav>li>a:focus{text-decoration:none;background:transparent}.nav.child_menu{display:none}.nav.child_menu li:hover,.nav.child_menu li.active{background-color:rgba(255,255,255,0.06)}.nav.child_menu li{padding-left:36px}.nav-md ul.nav.child_menu li:before{background:#425668;bottom:auto;content:"";height:8px;left:23px;margin-top:15px;position:absolute;right:auto;width:8px;z-index:1;border-radius:50%}.nav-md ul.nav.child_menu li:after{border-left:1px solid #425668;bottom:0;content:"";left:27px;position:absolute;top:0}.nav.side-menu>li>a,.nav.child_menu>li>a{color:#E7E7E7;font-weight:500}.nav.child_menu li li:hover,.nav.child_menu li li.active{background:none}.nav.child_menu li li a:hover,.nav.child_menu li li a.active{color:#fff}.nav>li>a{position:relative;display:block;padding:13px 15px 12px}.nav.side-menu>li.current-page,.nav.side-menu>li.active{border-right:5px solid #1ABB9C}.nav li.current-page{background:rgba(255,255,255,0.05)}.nav li li li.current-page{background:none}.nav li li.current-page a{color:#fff}.nav.side-menu>li.active>a{text-shadow:rgba(0,0,0,0.25) 0 -1px 0;background:linear-gradient(#334556, #2C4257),#2A3F54;box-shadow:rgba(0,0,0,0.25) 0 1px 0,inset rgba(255,255,255,0.16) 0 1px 0}.navbar-brand,.navbar-nav>li>a{font-weight:500;color:#ECF0F1 !important;margin-left:0 !important;line-height:32px}.site_title{text-overflow:ellipsis;overflow:hidden;font-weight:400;font-size:22px;width:100%;color:#ECF0F1 !important;margin-left:0 !important;line-height:59px;display:block;height:55px;margin:0;padding-left:10px}.site_title:hover,.site_title:focus{text-decoration:none}.nav.navbar-nav>li>a{color:#515356 !important}.nav.top_menu>li>a{position:relative;display:block;padding:10px 15px;color:#34495E !important}.nav>li>a:hover,.nav>li>a:focus{background-color:transparent}.top_search{padding:0}.top_search .form-control{border-right:0;box-shadow:inset 0 1px 0px rgba(0,0,0,0.075);border-radius:25px 0px 0px 25px;padding-left:20px;border:1px solid rgba(221,226,232,0.49)}.top_search .form-control:focus{border:1px solid rgba(221,226,232,0.49);border-right:0}.top_search .input-group-btn button{border-radius:0px 25px 25px 0px;border:1px solid rgba(221,226,232,0.49);border-left:0;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);color:#93A2B2;margin-bottom:0 !important}.toggle{float:left;margin:0;padding-top:16px;width:70px}.toggle a{padding:15px 15px 0;margin:0;cursor:pointer}.toggle a i{font-size:26px}.nav.child_menu>li>a{color:rgba(255,255,255,0.75);font-size:12px;padding:9px}.panel_toolbox{float:right;min-width:70px}.panel_toolbox>li{float:left;cursor:pointer}.panel_toolbox>li>a{padding:5px;color:#C5C7CB;font-size:14px}.panel_toolbox>li>a:hover{background:#F5F7FA}.line_30{line-height:30px}.main_menu_side{padding:0}.bs-docs-sidebar .nav>li>a{display:block;padding:4px 6px}footer{background:#fff;padding:15px 20px;display:block}@media (min-width: 768px){footer{margin-left:230px}}.nav-sm footer{margin-left:70px}.footer_fixed footer{position:fixed;left:0px;bottom:0px;width:100%}@media (min-width: 768px){.footer_fixed footer{margin-left:0}}@media (min-width: 768px){.footer_fixed .nav-sm footer{margin-left:0}}.tile-stats.sparkline{padding:10px;text-align:center}.jqstooltip{background:#34495E !important;width:30px !important;height:22px !important;text-decoration:none}.tooltip{display:block !important}.tiles{border-top:1px solid #ccc;margin-top:15px;padding-top:5px;margin-bottom:0}.tile{overflow:hidden}.top_tiles{margin-bottom:0}.top_tiles .tile h2{font-size:30px;line-height:30px;margin:3px 0 7px;font-weight:bold}article.media{width:100%}*,*:before,*:after{box-sizing:border-box}#integration-list{width:100%;margin:0 auto;display:table}#integration-list ul{padding:0;margin:20px 0;color:#555}#integration-list ul>li{list-style:none;border-top:1px solid #ddd;display:block;padding:15px;overflow:hidden}#integration-list ul:last-child{border-bottom:1px solid #ddd}#integration-list ul>li:hover{background:#efefef}.expand{display:block;text-decoration:none;color:#555;cursor:pointer}.expand h2{width:85%;float:left}h2{font-size:18px;font-weight:400}#left,#right{display:table}#sup{display:table-cell;vertical-align:middle;width:80%}.detail a{text-decoration:none;color:#C0392B;border:1px solid #C0392B;padding:6px 10px 5px;font-size:13px;margin-right:7px}.detail{margin:10px 0 10px 0px;display:none;line-height:22px;height:150px}.detail span{margin:0}.right-arrow{width:10px;float:right;font-weight:bold;font-size:20px}.accordion .panel{margin-bottom:5px;border-radius:0;border-bottom:1px solid #efefef}.accordion .panel-heading{background:#F2F5F7;padding:13px;width:100%;display:block}.accordion .panel:hover{background:#F2F5F7}.x_panel{position:relative;width:100%;margin-bottom:10px;padding:10px 17px;display:inline-block;background:#fff;border:1px solid #E6E9ED;-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;column-break-inside:avoid;opacity:1;transition:all .2s ease}.x_title{border-bottom:2px solid #E6E9ED;padding:1px 5px 6px;margin-bottom:10px}.x_title .filter{width:40%;float:right}.x_title h2{margin:5px 0 6px;float:left;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.x_title h2 small{margin-left:10px}.x_title span{color:#BDBDBD}.x_content{padding:0 5px 6px;position:relative;width:100%;float:left;clear:both;margin-top:5px}.x_content h4{font-size:16px;font-weight:500}legend{padding-bottom:7px}.demo-placeholder{height:280px}.profile_details:nth-child(3n){clear:both}.profile_details .profile_view{display:inline-block;padding:10px 0 0;background:#fff}.profile_details .profile_view .divider{border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}.profile_details .profile_view .ratings{margin-bottom:0}.profile_details .profile_view .bottom{background:#F2F5F7;padding:9px 0;border-top:1px solid #E6E9ED}.profile_details .profile_view .left{margin-top:20px}.profile_details .profile_view .left p{margin-bottom:3px}.profile_details .profile_view .right{margin-top:0px;padding:10px}.profile_details .profile_view .img-circle{border:1px solid #E6E9ED;padding:2px}.profile_details .profile_view h2{margin:5px 0}.profile_details .profile_view .ratings{text-align:left;font-size:16px}.profile_details .profile_view .brief{margin:0;font-weight:300}.profile_details .profile_left{background:white}.pagination.pagination-split li{display:inline-block;margin-right:3px}.pagination.pagination-split li a{border-radius:4px;color:#768399;-moz-border-radius:4px;-webkit-border-radius:4px}table.tile h3,table.tile h4,table.tile span{font-weight:bold;vertical-align:middle !important}table.tile th,table.tile td{text-align:center}table.tile th{border-bottom:1px solid #E6ECEE}table.tile td{padding:5px 0}table.tile td ul{text-align:left;padding-left:0}table.tile td ul li{list-style:none;width:100%}table.tile td ul li a{width:100%}table.tile td ul li a big{right:0;float:right;margin-right:13px}table.tile_info{width:100%}table.tile_info td{text-align:left;padding:1px;font-size:15px}table.tile_info td p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;line-height:28px}table.tile_info td i{margin-right:8px;font-size:17px;float:left;width:18px;line-height:28px}table.tile_info td:first-child{width:83%}td span{line-height:28px}.sidebar-widget{overflow:hidden}.error-number{font-size:90px;line-height:90px;margin:20px 0}.col-middle{margin-top:5%}.mid_center{width:370px;margin:0 auto;text-align:center;padding:10px 20px}h3.degrees{font-size:22px;font-weight:400;text-align:center}.degrees:after{content:"o";position:relative;top:-12px;font-size:13px;font-weight:300}.daily-weather .day{font-size:14px;border-top:2px solid rgba(115,135,156,0.36);text-align:center;border-bottom:2px solid rgba(115,135,156,0.36);padding:5px 0}.weather-days .col-sm-2{overflow:hidden;width:16.66666667%}.weather .row{margin-bottom:0}.bulk-actions{display:none}table.countries_list{width:100%}table.countries_list td{padding:0 10px;line-height:30px;border-top:1px solid #eeeeee}.dataTables_paginate a{padding:6px 9px !important;background:#ddd !important;border-color:#ddd !important}.paging_full_numbers a.paginate_active{background-color:rgba(38,185,154,0.59) !important;border-color:rgba(38,185,154,0.59) !important}button.DTTT_button,div.DTTT_button,a.DTTT_button{border:1px solid #E7E7E7 !important;background:#E7E7E7 !important;box-shadow:none !important}table.jambo_table{border:1px solid rgba(221,221,221,0.78)}table.jambo_table thead{background:rgba(52,73,94,0.94);color:#ECF0F1}table.jambo_table tbody tr:hover td{background:rgba(38,185,154,0.07);border-top:1px solid rgba(38,185,154,0.11);border-bottom:1px solid rgba(38,185,154,0.11)}table.jambo_table tbody tr.selected{background:rgba(38,185,154,0.16)}table.jambo_table tbody tr.selected td{border-top:1px solid rgba(38,185,154,0.4);border-bottom:1px solid rgba(38,185,154,0.4)}.dataTables_paginate a{background:#ff0000}.dataTables_wrapper{position:relative;clear:both;zoom:1}.dataTables_processing{position:absolute;top:50%;left:50%;width:250px;height:30px;margin-left:-125px;margin-top:-15px;padding:14px 0 2px 0;border:1px solid #ddd;text-align:center;color:#999;font-size:14px;background-color:white}.dataTables_length{width:40%;float:left}.dataTables_filter{width:50%;float:right;text-align:right}.dataTables_info{width:60%;float:left}.dataTables_paginate{float:right;text-align:right}table.dataTable th.focus,table.dataTable td.focus{outline:2px solid #1ABB9C !important;outline-offset:-1px}table.display{margin:0 auto;clear:both;width:100%}table.display thead th{padding:8px 18px 8px 10px;border-bottom:1px solid black;font-weight:bold;cursor:pointer}table.display tfoot th{padding:3px 18px 3px 10px;border-top:1px solid black;font-weight:bold}table.display tr.heading2 td{border-bottom:1px solid #aaa}table.display td{padding:3px 10px}table.display td.center{text-align:center}table.display thead th:active,table.display thead td:active{outline:none}.dataTables_scroll{clear:both}.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.top .dataTables_info{float:none}.clear{clear:both}.dataTables_empty{text-align:center}tfoot input{margin:0.5em 0;width:100%;color:#444}tfoot input.search_init{color:#999}td.group{background-color:#d1cfd0;border-bottom:2px solid #A19B9E;border-top:2px solid #A19B9E}td.details{background-color:#d1cfd0;border:2px solid #A19B9E}.example_alt_pagination div.dataTables_info{width:40%}.paging_full_numbers{width:400px;height:22px;line-height:22px}.paging_full_numbers a:active{outline:none}.paging_full_numbers a:hover{text-decoration:none}.paging_full_numbers a.paginate_button,.paging_full_numbers a.paginate_active{border:1px solid #aaa;-webkit-border-radius:5px;-moz-border-radius:5px;padding:2px 5px;margin:0 3px;cursor:pointer}.paging_full_numbers a.paginate_button{background-color:#ddd}.paging_full_numbers a.paginate_button:hover{background-color:#ccc;text-decoration:none !important}.paging_full_numbers a.paginate_active{background-color:#99B3FF}table.display tr.even.row_selected td{background-color:#B0BED9}table.display tr.odd.row_selected td{background-color:#9FAFD1}div.box{height:100px;padding:10px;overflow:auto;border:1px solid #8080FF;background-color:#E5E5FF}ul.msg_list li{background:#f7f7f7;padding:5px;display:-ms-flexbox;display:flex;margin:6px 6px 0;width:96% !important}ul.msg_list li:last-child{margin-bottom:6px;padding:10px}ul.msg_list li a{padding:3px 5px !important}ul.msg_list li a .image img{border-radius:2px 2px 2px 2px;-webkit-border-radius:2px 2px 2px 2px;float:left;margin-right:10px;width:11%}ul.msg_list li a .time{font-size:11px;font-style:italic;font-weight:bold;position:absolute;right:35px}ul.msg_list li a .message{display:block !important;font-size:11px}.dropdown-menu.msg_list span{white-space:normal}.dropdown-menu{border:medium none;box-shadow:none;display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:9998;border:1px solid #D9DEE4;border-top-left-radius:0;border-top-right-radius:0}.dropdown-menu>li>a{color:#5A738E}.navbar-nav .open .dropdown-menu{position:absolute;background:#fff;margin-top:0;border:1px solid #D9DEE4;-webkit-box-shadow:none;right:0;left:auto;width:220px}.navbar-nav .open .dropdown-menu.msg_list{width:300px}.info-number .badge{font-size:10px;font-weight:normal;line-height:13px;padding:2px 6px;position:absolute;right:2px;top:8px}ul.to_do{padding:0}ul.to_do li{background:#f3f3f3;border-radius:3px;position:relative;padding:7px;margin-bottom:5px;list-style:none}ul.to_do p{margin:0}.dashboard-widget{background:#f6f6f6;border-top:5px solid #79C3DF;border-radius:3px;padding:5px 10px 10px}.dashboard-widget .dashboard-widget-title{font-weight:normal;border-bottom:1px solid #c1cdcd;margin:0 0 10px 0;padding-bottom:5px;padding-left:40px;line-height:30px}.dashboard-widget .dashboard-widget-title i{font-size:100%;margin-left:-35px;margin-right:10px;color:#33a1c9;padding:3px 6px;border:1px solid #abd9ea;border-radius:5px;background:#fff}ul.quick-list{width:45%;padding-left:0;display:inline-block}ul.quick-list li{padding-left:10px;list-style:none;margin:0;padding-bottom:6px;padding-top:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}ul.quick-list li i{padding-right:10px;color:#757679}.dashboard-widget-content{padding-top:9px}.dashboard-widget-content .sidebar-widget{width:50%;display:inline-block;vertical-align:top;background:#fff;border:1px solid #abd9ea;border-radius:5px;text-align:center;float:right;padding:2px;margin-top:10px}.widget_summary{width:100%;display:-ms-inline-flexbox;display:inline-flex}.widget_summary .w_left{float:left;text-align:left}.widget_summary .w_center{float:left}.widget_summary .w_right{float:left;text-align:right}.widget_summary .w_right span{font-size:20px}.w_20{width:20%}.w_25{width:25%}.w_55{width:55%}h5.graph_title{text-align:left;margin-left:10px}h5.graph_title i{margin-right:10px;font-size:17px}span.right{float:right;font-size:14px !important}.tile_info a{text-overflow:ellipsis}.sidebar-footer{bottom:0px;clear:both;display:block;padding:5px 0 0 0;position:fixed;width:230px;background:#2A3F54}.sidebar-footer a{padding:7px 0 3px;text-align:center;width:25%;font-size:17px;display:block;float:left;background:#172D44}.sidebar-footer a:hover{background:#425567}.tile_count{margin-bottom:20px;margin-top:20px}.tile_count .tile_stats_count{border-bottom:1px solid #D9DEE4;padding:0 10px 0 20px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative}@media (min-width: 992px){.tile_count .tile_stats_count{margin-bottom:10px;border-bottom:0;padding-bottom:10px}}.tile_count .tile_stats_count:before{content:"";position:absolute;left:0;height:65px;border-left:2px solid #ADB2B5;margin-top:10px}@media (min-width: 992px){.tile_count .tile_stats_count:first-child:before{border-left:0}}.tile_count .tile_stats_count .count{font-size:30px;line-height:47px;font-weight:600}@media (min-width: 768px){.tile_count .tile_stats_count .count{font-size:40px}}@media (min-width: 992px) and (max-width: 1100px){.tile_count .tile_stats_count .count{font-size:30px}}.tile_count .tile_stats_count span{font-size:12px}@media (min-width: 768px){.tile_count .tile_stats_count span{font-size:13px}}.tile_count .tile_stats_count .count_bottom i{width:12px}.dashboard_graph{background:#fff;padding:7px 10px}.dashboard_graph .col-md-9,.dashboard_graph .col-md-3{padding:0}a.user-profile{color:#5E6974 !important}.user-profile img{width:29px;height:29px;border-radius:50%;margin-right:10px}ul.top_profiles{height:330px;width:100%}ul.top_profiles li{margin:0;padding:3px 5px}ul.top_profiles li:nth-child(odd){background-color:#eee}.media .profile_thumb{border:1px solid;width:50px;height:50px;margin:5px 10px 5px 0;border-radius:50%;padding:9px 12px}.media .profile_thumb i{font-size:30px}.media .date{background:#ccc;width:52px;margin-right:10px;border-radius:10px;padding:5px}.media .date .month{margin:0;text-align:center;color:#fff}.media .date .day{text-align:center;color:#fff;font-size:27px;margin:0;line-height:27px;font-weight:bold}.event .media-body a.title{font-weight:bold}.event .media-body p{margin-bottom:0}h4.graph_title{margin:7px;text-align:center}.fontawesome-icon-list .fa-hover a:hover{background-color:#ddd;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a{display:block;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:28px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:16px;display:inline-block;text-align:right;margin-right:10px}.main_menu .fa{width:26px;opacity:.99;display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:18px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tile-stats{position:relative;display:block;margin-bottom:12px;border:1px solid #E4E4E4;-webkit-border-radius:5px;overflow:hidden;padding-bottom:5px;-webkit-background-clip:padding-box;-moz-border-radius:5px;-moz-background-clip:padding;border-radius:5px;background-clip:padding-box;background:#FFF;transition:all 300ms ease-in-out}.tile-stats:hover .icon i{animation-name:tansformAnimation;animation-duration:.5s;animation-iteration-count:1;color:rgba(58,58,58,0.41);animation-timing-function:ease;animation-fill-mode:forwards;-webkit-animation-name:tansformAnimation;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:1;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:forwards;-moz-animation-name:tansformAnimation;-moz-animation-duration:.5s;-moz-animation-iteration-count:1;-moz-animation-timing-function:ease;-moz-animation-fill-mode:forwards}.tile-stats .icon{width:20px;height:20px;color:#BAB8B8;position:absolute;right:53px;top:22px;z-index:1}.tile-stats .icon i{margin:0;font-size:60px;line-height:0;vertical-align:bottom;padding:0}.tile-stats .count{font-size:38px;font-weight:bold;line-height:1.65857}.tile-stats .count,.tile-stats h3,.tile-stats p{position:relative;margin:0;margin-left:10px;z-index:5;padding:0}.tile-stats h3{color:#BAB8B8}.tile-stats p{margin-top:5px;font-size:12px}.tile-stats>.dash-box-footer{position:relative;text-align:center;margin-top:5px;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.tile-stats>.dash-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.tile-stats>.dash-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}table.tile_info{padding:10px 15px}table.tile_info span.right{margin-right:0;float:right;position:absolute;right:4%}.tile:hover{text-decoration:none}.tile_header{border-bottom:transparent;padding:7px 15px;margin-bottom:15px;background:#E7E7E7}.tile_head h4{margin-top:0;margin-bottom:5px}.tiles-bottom{padding:5px 10px;margin-top:10px;background:rgba(194,194,194,0.3);text-align:left}a.star{color:#428bca !important}.mail_content{background:none repeat scroll 0 0 #FFFFFF;border-radius:4px;margin-top:20px;min-height:500px;padding:10px 11px;width:100%}.list-btn-mail{margin-bottom:15px}.list-btn-mail.active{border-bottom:1px solid #39B3D7;padding:0 0 14px}.list-btn-mail>i{float:left;font-size:18px;font-style:normal;width:33px}.list-btn-mail>.cn{background:none repeat scroll 0 0 #39B3D7;border-radius:12px;color:#FFFFFF;float:right;font-style:normal;padding:0 5px}.button-mail{margin:0 0 15px !important;text-align:left;width:100%}.buttons,button,.btn{margin-bottom:5px;margin-right:5px}.btn-group-vertical .btn,.btn-group .btn{margin-bottom:0;margin-right:0}.mail_list_column{border-left:1px solid #DBDBDB}.mail_view{border-left:1px solid #DBDBDB}.mail_list{width:100%;border-bottom:1px solid #DBDBDB;margin-bottom:2px;display:inline-block}.mail_list .left{width:5%;float:left;margin-right:3%}.mail_list .right{width:90%;float:left}.mail_list h3{font-size:15px;font-weight:bold;margin:0px 0 6px}.mail_list h3 small{float:right;color:#ADABAB;font-size:11px;line-height:20px}.mail_list .badge{padding:3px 6px;font-size:8px;background:#BAB7B7}@media (max-width: 767px){.mail_list{margin-bottom:5px;display:inline-block}}.mail_heading h4{font-size:18px;border-bottom:1px solid #ddd;padding-bottom:10px;margin-top:20px}.attachment{margin-top:30px}.attachment ul{width:100%;list-style:none;padding-left:0;display:inline-block;margin-bottom:30px}.attachment ul li{float:left;width:150px;margin-right:10px;margin-bottom:10px}.attachment ul li img{height:150px;border:1px solid #ddd;padding:5px;margin-bottom:10px}.attachment ul li span{float:right}.attachment .file-name{float:left}.attachment .links{width:100%;display:inline-block}.compose{padding:0;position:fixed;bottom:0;right:0;background:#fff;border:1px solid #D9DEE4;border-right:0;border-bottom:0;border-top-left-radius:5px;z-index:9999;display:none}.compose .compose-header{padding:5px;background:#169F85;color:#fff;border-top-left-radius:5px}.compose .compose-header .close{text-shadow:0 1px 0 #ffffff;line-height:.8}.compose .compose-body .editor.btn-toolbar{margin:0}.compose .compose-body .editor-wrapper{height:100%;min-height:50px;max-height:180px;border-radius:0;border-left:none;border-right:none;overflow:auto}.compose .compose-footer{padding:10px}.editor.btn-toolbar{zoom:1;background:#F7F7F7;margin:5px 2px;padding:3px 0;border:1px solid #EFEFEF}.input-group{margin-bottom:10px}.ln_solid{border-top:1px solid #e5e5e5;color:#ffffff;background-color:#ffffff;height:1px;margin:20px 0}span.section{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}.form-control{border-radius:0;width:100%}.form-horizontal .control-label{padding-top:8px}.form-control:focus{border-color:#CCD0D7;box-shadow:none !important}legend{font-size:18px;color:inherit}.form-horizontal .form-group{margin-right:0;margin-left:0}.form-control-feedback{margin-top:8px;height:23px;color:#bbb;line-height:24px;font-size:15px}.form-control-feedback.left{border-right:1px solid #ccc;left:13px}.form-control-feedback.right{border-left:1px solid #ccc;right:13px}.form-control.has-feedback-left{padding-left:45px}.form-control.has-feedback-right{padding-right:45px}.form-group{margin-bottom:10px}.validate{margin-top:10px}.invalid-form-error-message{margin-top:10px;padding:5px}.invalid-form-error-message.filled{border-left:2px solid #E74C3C}p.parsley-success{color:#468847;background-color:#DFF0D8;border:1px solid #D6E9C6}p.parsley-error{color:#B94A48;background-color:#F2DEDE;border:1px solid #EED3D7}ul.parsley-errors-list{list-style:none;color:#E74C3C;padding-left:0}input.parsley-error,textarea.parsley-error,select.parsley-error{background:#FAEDEC;border:1px solid #E85445}.btn-group .parsley-errors-list{display:none}.bad input,.bad select,.bad textarea{border:1px solid #CE5454;box-shadow:0 0 4px -2px #CE5454;position:relative;left:0;-moz-animation:.7s 1 shake linear;-webkit-animation:0.7s 1 shake linear}.item input,.item textarea{transition:0.42s}.item .alert{float:left;margin:0 0 0 20px;padding:3px 10px;color:#FFF;border-radius:3px 4px 4px 3px;background-color:#CE5454;max-width:170px;white-space:pre;position:relative;left:-15px;opacity:0;z-index:1;transition:0.15s ease-out}.item .alert::after{content:'';display:block;height:0;width:0;border-color:transparent #CE5454 transparent transparent;border-style:solid;border-width:11px 7px;position:absolute;left:-13px;top:1px}.item.bad .alert{left:0;opacity:1}.inl-bl{display:inline-block}.well .markup{background:#fff;color:#777;position:relative;padding:45px 15px 15px;margin:15px 0 0 0;background-color:#fff;border-radius:0 0 4px 4px;box-shadow:none}.well .markup::after{content:"Example";position:absolute;top:15px;left:15px;font-size:12px;font-weight:bold;color:#bbb;text-transform:uppercase;letter-spacing:1px}.autocomplete-suggestions{border:1px solid #e4e4e4;background:#F4F4F4;cursor:default;overflow:auto}.autocomplete-suggestion{padding:2px 5px;font-size:1.2em;white-space:nowrap;overflow:hidden}.autocomplete-selected{background:#f0f0f0}.autocomplete-suggestions strong{font-weight:normal;color:#3399ff;font-weight:bolder}.btn{border-radius:3px}a.btn-success,a.btn-primary,a.btn-warning,a.btn-danger{color:#fff}.btn-success{background:#26B99A;border:1px solid #169F85}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background:#169F85}.btn-dark{color:#E9EDEF;background-color:#4B5F71;border-color:#364B5F}.btn-dark:hover,.btn-dark:focus,.btn-dark:active,.btn-dark.active,.open .dropdown-toggle.btn-dark{color:#FFFFFF;background-color:#394D5F;border-color:#394D5F}.btn-round{border-radius:30px}.btn.btn-app{position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;box-shadow:none;border-radius:0;text-align:center;color:#666;border:1px solid #ddd;background-color:#fafafa;font-size:12px}.btn.btn-app>.fa,.btn.btn-app>.glyphicon,.btn.btn-app>.ion{font-size:20px;display:block}.btn.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn.btn-app:active,.btn.btn-app:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}textarea{padding:10px;vertical-align:top;width:200px}textarea:focus{outline-style:solid;outline-width:2px}.btn_{display:inline-block;padding:3px 9px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255,255,255,0.75);background-color:#f5f5f5;background-image:linear-gradient(to bottom, #fff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);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);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;border-radius:4px;box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ABB9C}@media (min-width: 768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.tagsinput{border:1px solid #CCC;background:#FFF;padding:6px 6px 0;width:300px;overflow-y:auto}span.tag{-moz-border-radius:2px;-webkit-border-radius:2px;display:block;float:left;padding:5px 9px;text-decoration:none;background:#1ABB9C;color:#F1F6F7;margin-right:5px;font-weight:500;margin-bottom:5px;font-family:helvetica}span.tag a{color:#F1F6F7 !important}.tagsinput span.tag a{font-weight:bold;color:#82ad2b;text-decoration:none;font-size:11px}.tagsinput input{width:80px;margin:0px;font-family:helvetica;font-size:13px;border:1px solid transparent;padding:3px;background:transparent;color:#000;outline:0px}.tagsinput div{display:block;float:left}.tags_clear{clear:both;width:100%;height:0px}.not_valid{background:#FBD8DB !important;color:#90111A !important}ul.bar_tabs{overflow:visible;background:#F5F7FA;height:25px;margin:21px 0 14px;padding-left:14px;position:relative;z-index:1;width:100%;border-bottom:1px solid #E6E9ED}ul.bar_tabs>li{border:1px solid #E6E9ED;color:#333 !important;margin-top:-17px;margin-left:8px;background:#fff;border-bottom:none;border-radius:4px 4px 0 0}ul.bar_tabs>li.active{border-right:6px solid #D3D6DA;border-top:0;margin-top:-15px}ul.bar_tabs>li a{padding:10px 17px;background:#F5F7FA;margin:0;border-top-right-radius:0}ul.bar_tabs>li a:hover{border:1px solid transparent}ul.bar_tabs>li.active a{border-bottom:none}ul.bar_tabs.right{padding-right:14px}ul.bar_tabs.right li{float:right}a:focus{outline:none}ul.timeline li{position:relative;border-bottom:1px solid #e8e8e8;clear:both}.timeline .block{margin:0;border-left:3px solid #e8e8e8;overflow:visible;padding:10px 15px;margin-left:105px}.timeline.widget{min-width:0;max-width:inherit}.timeline.widget .block{margin-left:5px}.timeline .tags{position:absolute;top:15px;left:0;width:84px}.timeline .tag{display:block;height:30px;font-size:13px;padding:8px}.timeline .tag span{display:block;overflow:hidden;width:100%;white-space:nowrap;text-overflow:ellipsis}.tag{line-height:1;background:#1ABB9C;color:#fff !important}.tag:after{content:" ";height:30px;width:0;position:absolute;left:100%;top:0;margin:0;pointer-events:none;border-top:14px solid transparent;border-bottom:14px solid transparent;border-left:11px solid #1ABB9C}.timeline h2.title{position:relative;font-size:16px;margin:0}.timeline h2.title:before{content:"";position:absolute;left:-23px;top:3px;display:block;width:14px;height:14px;border:3px solid #d2d3d2;border-radius:14px;background:#f9f9f9}.timeline .byline{padding:.25em 0}.byline{-webkit-font-smoothing:antialiased;font-style:italic;font-size:.9375em;line-height:1.3;color:#aab6aa}ul.social li{border:0}.social-sidebar,.social-body{float:right}.social-sidebar{background:#EDEDED;width:22%}.social-body{border:1px solid #ccc;width:78%}.thumb img{width:50px;height:50px;border-radius:50%}.chat .thumb img{width:27px;height:27px;border-radius:50%}.chat .status{float:left;margin:16px 0 0 -16px;font-size:14px;font-weight:bold;width:12px;height:12px;display:block;border:2px solid #FFF;z-index:12312;border-radius:50%}.chat .status.online{background:#1ABB9C}.chat .status.away{background:#F39C12}.chat .status.offline{background:#ccc}.chat .media-body{padding-top:5px}.dashboard_graph .x_title{padding:5px 5px 7px}.dashboard_graph .x_title h3{margin:0;font-weight:normal}.chart{position:relative;display:inline-block;width:110px;height:110px;margin-top:5px;margin-bottom:5px;text-align:center}.chart canvas{position:absolute;top:0;left:0}.percent{display:inline-block;line-height:110px;z-index:2;font-size:18px}.percent:after{content:'%';margin-left:0.1em;font-size:.8em}.angular{margin-top:100px}.angular .chart{margin-top:0}.widget{min-width:250px;max-width:310px}.widget_tally_box .btn-group button{text-align:center}.widget_tally_box .btn-group button{color:inherit;font-weight:500;background-color:#f5f5f5;border:1px solid #e7e7e7}ul.widget_tally,ul.widget_tally li{width:100%}ul.widget_tally li{padding:2px 10px;border-bottom:1px solid #ECECEC;padding-bottom:4px}ul.widget_tally .month{width:70%;float:left}ul.widget_tally .count{width:30%;float:left;text-align:right}.pie_bg{border-bottom:1px solid rgba(101,204,182,0.16);padding-bottom:15px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);padding-bottom:10px;box-shadow:0 4px 6px -6px #222}.widget_tally_box .flex{display:-ms-flexbox;display:flex}ul.widget_profile_box{width:100%;height:42px;padding:3px;background:#ececec;margin-top:40px;margin-left:1px}ul.widget_profile_box li:first-child{width:25%;float:left}ul.widget_profile_box li:first-child a{float:left}ul.widget_profile_box li:last-child{width:25%;float:right}ul.widget_profile_box li:last-child a{float:right}ul.widget_profile_box li a{font-size:22px;text-align:center;width:35px;height:35px;border:1px solid rgba(52,73,94,0.44);display:block;border-radius:50%;padding:0px}ul.widget_profile_box li a:hover{color:#1ABB9C !important;border:1px solid #26b99a}ul.widget_profile_box li .profile_img{width:85px;height:85px;margin:0;margin-top:-28px}.widget_tally_box p,.widget_tally_box span{text-align:center}.widget_tally_box .name{text-align:center;margin:25px}.widget_tally_box .name_title{text-align:center;margin:5px}.widget_tally_box ul.legend{margin:0}.widget_tally_box ul.legend p,.widget_tally_box ul.legend span{text-align:left}.widget_tally_box ul.legend li .icon{font-size:20px;float:left;width:14px}.widget_tally_box ul.legend li .name{font-size:14px;margin:5px 0 0 14px;text-overflow:ellipsis;float:left}.widget_tally_box ul.legend p{display:inline-block;margin:0}.widget_tally_box ul.verticle_bars li{height:140px;width:23%}.widget .verticle_bars li .progress.vertical.progress_wide{width:65%}ul.count2{width:100%;margin-left:1px;border:1px solid #ddd;border-left:0;border-right:0;padding:10px 0}ul.count2 li{width:30%;text-align:center}ul.count2 li h3{font-weight:400;margin:0}ul.count2 li span{font-weight:300}.divider{border-bottom:1px solid #ddd;margin:10px}.divider-dashed{border-top:1px dashed #e7eaec;background-color:#ffffff;height:1px;margin:10px 0}ul.messages{padding:0;list-style:none}ul.messages li,.tasks li{border-bottom:1px dotted #e6e6e6;padding:8px 0}ul.messages li img.avatar,img.avatar{height:32px;width:32px;float:left;display:inline-block;border-radius:2px;padding:2px;background:#f7f7f7;border:1px solid #e6e6e6}ul.messages li .message_date{float:right;text-align:right}ul.messages li .message_wrapper{margin-left:50px;margin-right:40px}ul.messages li .message_wrapper h4.heading{font-weight:600;margin:0;cursor:pointer;margin-bottom:10px;line-height:100%}ul.messages li .message_wrapper blockquote{padding:0px 10px;margin:0;border-left:5px solid #eee}ul.user_data li{margin-bottom:6px}ul.user_data li p{margin-bottom:0}ul.user_data li .progress{width:90%}.project_progress .progress{margin-bottom:3px !important;margin-top:5px}.projects .list-inline{margin:0}.profile_title{background:#F5F7FA;border:0;padding:7px 0;display:-ms-flexbox;display:flex}ul.stats-overview{border-bottom:1px solid #e8e8e8;padding-bottom:10px;margin-bottom:10px}ul.stats-overview li{display:inline-block;text-align:center;padding:0 15px;width:30%;font-size:14px;border-right:1px solid #e8e8e8}ul.stats-overview li:last-child{border-right:0}ul.stats-overview li .name{font-size:12px}ul.stats-overview li .value{font-size:14px;font-weight:bold;display:block}ul.stats-overview li:first-child{padding-left:0}ul.project_files li{margin-bottom:5px}ul.project_files li a i{width:20px}.project_detail p{margin-bottom:10px}.project_detail p.title{font-weight:bold;margin-bottom:0}.avatar img{border-radius:50%;max-width:45px}.pricing{background:#fff}.pricing .title{background:#1ABB9C;height:110px;color:#fff;padding:15px 0 0;text-align:center}.pricing .title h2{text-transform:capitalize;font-size:18px;border-radius:5px 5px 0 0;margin:0;font-weight:400}.pricing .title h1{font-size:30px;margin:12px}.pricing .title span{background:rgba(51,51,51,0.28);padding:2px 5px}.pricing_features{background:#FAFAFA;padding:20px 15px;min-height:230px;font-size:13.5px}.pricing_features ul li{margin-top:10px}.pricing_footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;text-align:center;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.pricing_footer p{font-size:13px;padding:10px 0 2px;display:block}.ui-ribbon-container{position:relative}.ui-ribbon-container .ui-ribbon-wrapper{position:absolute;overflow:hidden;width:85px;height:88px;top:-3px;right:-3px}.ui-ribbon-container.ui-ribbon-primary .ui-ribbon{background-color:#5b90bf}.ui-ribbon-container .ui-ribbon{position:relative;display:block;text-align:center;font-size:15px;font-weight:700;color:#fff;transform:rotate(45deg);padding:7px 0;left:-5px;top:15px;width:120px;line-height:20px;background-color:#555;box-shadow:0 0 3px rgba(0,0,0,0.3)}.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after,.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before{border-top:2px solid #5b90bf}.ui-ribbon-container .ui-ribbon:before{left:0;bottom:-1px}.ui-ribbon-container .ui-ribbon:before{right:0}.ui-ribbon-container .ui-ribbon:after,.ui-ribbon-container .ui-ribbon:before{position:absolute;content:" ";line-height:0;border-top:2px solid #555;border-left:2px solid transparent;border-right:2px solid transparent}.thumbnail .image{height:120px;overflow:hidden}.caption{padding:9px 5px;background:#F7F7F7}.caption p{margin-bottom:5px}.thumbnail{height:190px;overflow:hidden}.view{overflow:hidden;position:relative;text-align:center;box-shadow:1px 1px 2px #e6e6e6;cursor:default}.view .mask,.view .content{position:absolute;width:100%;overflow:hidden;top:0;left:0}.view img{display:block;position:relative}.view .tools{text-transform:uppercase;color:#fff;text-align:center;position:relative;font-size:17px;padding:3px;background:rgba(0,0,0,0.35);margin:43px 0 0 0}.mask.no-caption .tools{margin:90px 0 0 0}.view .tools a{display:inline-block;color:#FFF;font-size:18px;font-weight:400;padding:0 4px}.view p{font-family:Georgia, serif;font-style:italic;font-size:12px;position:relative;color:#fff;padding:10px 20px 20px;text-align:center}.view a.info{display:inline-block;text-decoration:none;padding:7px 14px;background:#000;color:#fff;text-transform:uppercase;box-shadow:0 0 1px #000}.view-first img{transition:all 0.2s linear}.view-first .mask{opacity:0;background-color:rgba(0,0,0,0.5);transition:all 0.4s ease-in-out}.view-first .tools{transform:translateY(-100px);opacity:0;transition:all 0.2s ease-in-out}.view-first p{transform:translateY(100px);opacity:0;transition:all 0.2s linear}.view-first:hover img{transform:scale(1.1)}.view-first:hover .mask{opacity:1}.view-first:hover .tools,.view-first:hover p{opacity:1;transform:translateY(0px)}.view-first:hover p{transition-delay:0.1s}/*! * bootstrap-vertical-tabs - v1.2.1 * https://dbtek.github.io/bootstrap-vertical-tabs * 2014-11-07 * Copyright (c) 2014 İsmail Demirbilek * License: MIT - */.tabs-left,.tabs-right{border-bottom:none;padding-top:2px}.tabs-left{border-right:1px solid #F7F7F7}.tabs-right{border-left:1px solid #F7F7F7}.tabs-left>li,.tabs-right>li{float:none;margin-bottom:2px}.tabs-left>li{margin-right:-1px}.tabs-right>li{margin-left:-1px}.tabs-left>li.active>a,.tabs-left>li.active>a:hover,.tabs-left>li.active>a:focus{border-bottom-color:#F7F7F7;border-right-color:transparent}.tabs-right>li.active>a,.tabs-right>li.active>a:hover,.tabs-right>li.active>a:focus{border-bottom:1px solid #F7F7F7;border-left-color:transparent}.tabs-left>li>a{border-radius:4px 0 0 4px;margin-right:0;display:block;background:#F7F7F7;text-overflow:ellipsis;overflow:hidden}.tabs-right>li>a{border-radius:0 4px 4px 0;margin-right:0;background:#F7F7F7;text-overflow:ellipsis;overflow:hidden}.sideways{margin-top:50px;border:none;position:relative}.sideways>li{height:20px;width:120px;margin-bottom:100px}.sideways>li>a{border-bottom:1px solid #ddd;border-right-color:transparent;text-align:center;border-radius:4px 4px 0px 0px}.sideways>li.active>a,.sideways>li.active>a:hover,.sideways>li.active>a:focus{border-bottom-color:transparent;border-right-color:#ddd;border-left-color:#ddd}.sideways.tabs-left{left:-50px}.sideways.tabs-right{right:-50px}.sideways.tabs-right>li{transform:rotate(90deg)}.sideways.tabs-left>li{transform:rotate(-90deg)}.avatar-view{display:block;border:3px solid #fff;border-radius:5px;box-shadow:0 0 5px rgba(0,0,0,0.15);cursor:pointer;overflow:hidden}.avatar-body{padding-right:15px;padding-left:15px}.avatar-upload{overflow:hidden}.avatar-upload label{display:block;float:left;clear:left;width:100px}.avatar-upload input{display:block;margin-left:110px}.avater-alert{margin-top:10px;margin-bottom:10px}.avatar-wrapper{height:364px;width:100%;margin-top:15px;box-shadow:inset 0 0 5px rgba(0,0,0,0.25);background-color:#fcfcfc;overflow:hidden}.avatar-wrapper img{display:block;height:auto;max-width:100%}.avatar-preview{float:left;margin-top:15px;margin-right:15px;border:1px solid #eee;border-radius:4px;background-color:#fff;overflow:hidden}.avatar-preview:hover{border-color:#ccf;box-shadow:0 0 5px rgba(0,0,0,0.15)}.avatar-preview img{width:100%}.preview-lg{height:184px;width:184px;margin-top:15px}.preview-md{height:100px;width:100px}.preview-sm{height:50px;width:50px}@media (min-width: 992px){.avatar-preview{float:none}}.avatar-btns{margin-top:30px;margin-bottom:15px}.avatar-btns .btn-group{margin-right:5px}.loading{display:none;position:absolute;top:0;right:0;bottom:0;left:0;background:#fff url("../images/loading.gif") no-repeat center center;opacity:.75;filter:alpha(opacity=75);z-index:20140628}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{padding:6px;color:#666;background:rgba(243,242,243,0.8);border:solid 2px rgba(195,194,196,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}.price{font-size:40px;font-weight:400;color:#26B99A;margin:0}.prod_title{border-bottom:1px solid #DFDFDF;padding-bottom:5px;margin:30px 0;font-size:20px;font-weight:400}.product-image img{width:90%}.prod_color li{margin:0 10px}.prod_color li p{margin-bottom:0}.prod_size li{padding:0}.prod_color .color{width:25px;height:25px;border:2px solid rgba(51,51,51,0.28) !important;padding:2px;border-radius:50px}.product_gallery a{width:100px;height:100px;float:left;margin:10px;border:1px solid #e5e5e5}.product_gallery a img{width:100%;margin-top:15px}.product_price{margin:20px 0;padding:5px 10px;background-color:#FFFFFF;text-align:left;border:2px dashed #E0E0E0}.price-tax{font-size:18px}.product_social{margin:20px 0}.product_social ul li a i{font-size:35px}.login{background:#F7F7F7}.login .fa-paw{font-size:26px}a.hiddenanchor{display:none}.login_wrapper{right:0px;margin:0px auto;margin-top:5%;max-width:350px;position:relative}.registration_form,.login_form{position:absolute;top:0px;width:100%}.registration_form{z-index:21;opacity:0;width:100%}.login_form{z-index:22}#signup:target ~ .login_wrapper .registration_form,#signin:target ~ .login_wrapper .login_form{z-index:22;animation-name:fadeInLeft;animation-delay:.1s}#signup:target ~ .login_wrapper .login_form,#signin:target ~ .login_wrapper .registration_form{animation-name:fadeOutLeft}.animate{-webkit-animation-duration:0.5s;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:both;-moz-animation-duration:0.5s;-moz-animation-timing-function:ease;-moz-animation-fill-mode:both;-o-animation-duration:0.5s;-o-animation-timing-function:ease;-o-animation-fill-mode:both;-ms-animation-duration:0.5s;-ms-animation-timing-function:ease;-ms-animation-fill-mode:both;animation-duration:0.5s;animation-timing-function:ease;animation-fill-mode:both}.login_box{padding:20px;margin:auto}.left{float:left}.alignleft{float:left;margin-right:15px}.alignright{float:right;margin-left:15px}.clearfix:after,form:after{content:".";display:block;height:0;clear:both;visibility:hidden}.login_content{margin:0 auto;padding:25px 0 0;position:relative;text-align:center;text-shadow:0 1px 0 #fff;min-width:280px}.login_content a,.login_content .btn-default:hover{text-decoration:none}.login_content a:hover{text-decoration:underline}.login_content h1{font:normal 25px Helvetica, Arial, sans-serif;letter-spacing:-0.05em;line-height:20px;margin:10px 0 30px}.login_content h1:before,.login_content h1:after{content:"";height:1px;position:absolute;top:10px;width:27%}.login_content h1:after{background:#7e7e7e;background:linear-gradient(left, #7e7e7e 0%, #fff 100%);right:0}.login_content h1:before{background:#7e7e7e;background:linear-gradient(right, #7e7e7e 0%, #fff 100%);left:0}.login_content h1:before,.login_content h1:after{content:"";height:1px;position:absolute;top:10px;width:20%}.login_content h1:after{background:#7e7e7e;background:linear-gradient(left, #7e7e7e 0%, #fff 100%);right:0}.login_content h1:before{background:#7e7e7e;background:linear-gradient(right, #7e7e7e 0%, #fff 100%);left:0}.login_content form{margin:20px 0;position:relative}.login_content form input[type="text"],.login_content form input[type="email"],.login_content form input[type="password"]{border-radius:3px;-ms-box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,0.08) inset;-o-box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,0.08) inset;box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,0.08) inset;border:1px solid #c8c8c8;color:#777;margin:0 0 20px;width:100%}.login_content form input[type="text"]:focus,.login_content form input[type="email"]:focus,.login_content form input[type="password"]:focus{-ms-box-shadow:0 0 2px #ed1c24 inset;-o-box-shadow:0 0 2px #ed1c24 inset;box-shadow:0 0 2px #A97AAD inset;background-color:#fff;border:1px solid #A878AF;outline:none}#username{background-position:10px 10px !important}#password{background-position:10px -53px !important}.login_content form div a{font-size:12px;margin:10px 15px 0 0}.reset_pass{margin-top:10px !important}.login_content div .reset_pass{margin-top:13px !important;margin-right:39px;float:right}.separator{border-top:1px solid #D8D8D8;margin-top:10px;padding-top:10px}.button{background:#f7f9fa;background:linear-gradient(top, #f7f9fa 0%, #f0f0f0 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f9fa', endColorstr='#f0f0f0', GradientType=0);-ms-box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;-o-box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;border-radius:0 0 5px 5px;border-top:1px solid #CFD5D9;padding:15px 0}.login_content form input[type="submit"],#content form .submit{float:left;margin-left:38px}.button a{background:url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat;color:#7E7E7E;font-size:17px;padding:2px 0 2px 40px;text-decoration:none;transition:all 0.3s ease}.button a:hover{background-position:0 -135px;color:#00aeef}header{width:100%}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d, 0 0 5px #29d;opacity:1.0;transform:rotate(3deg) translate(0px, -4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.editor-wrapper{min-height:250px;background-color:white;border-collapse:separate;border:1px solid #ccc;padding:4px;box-sizing:content-box;box-shadow:rgba(0,0,0,0.07451) 0px 1px 1px 0px inset;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px;overflow:scroll;outline:none}.voiceBtn{width:20px;color:transparent;background-color:transparent;transform:scale(2, 2);-webkit-transform:scale(2, 2);-moz-transform:scale(2, 2);border:transparent;cursor:pointer;box-shadow:none;-webkit-box-shadow:none}div[data-role="editor-toolbar"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dropdown-menu a{cursor:pointer}.select2-container--default .select2-selection--single,.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #ccc;border-radius:0;min-height:38px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#73879C;padding-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-top:3px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:36px}.select2-container--default .select2-selection--multiple .select2-selection__choice,.select2-container--default .select2-selection--multiple .select2-selection__clear{margin-top:2px;border:none;border-radius:0;padding:3px 5px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #ccc}.switchery{width:32px;height:20px}.switchery>small{width:20px;height:20px}fieldset{border:none;margin:0;padding:0}.cropper .img-container,.cropper .img-preview{background-color:#f7f7f7;width:100%;text-align:center}.cropper .img-container{min-height:200px;max-height:516px;margin-bottom:20px}@media (min-width: 768px){.cropper .img-container{min-height:516px}}.cropper .img-container>img{max-width:100%}.cropper .docs-preview{margin-right:-15px}.cropper .img-preview{float:left;margin-right:10px;margin-bottom:10px;overflow:hidden}.cropper .img-preview>img{max-width:100%}.cropper .preview-lg{width:263px;height:148px}.cropper .preview-md{width:139px;height:78px}.cropper .preview-sm{width:69px;height:39px}.cropper .preview-xs{width:35px;height:20px;margin-right:0}.cropper .docs-data>.input-group{margin-bottom:10px}.cropper .docs-data>.input-group>label{min-width:80px}.cropper .docs-data>.input-group>span{min-width:50px}.cropper .docs-buttons>.btn,.cropper .docs-buttons>.btn-group,.cropper .docs-buttons>.form-control{margin-right:5px;margin-bottom:10px}.cropper .docs-toggles>.btn,.cropper .docs-toggles>.btn-group,.cropper .docs-toggles>.dropdown{margin-bottom:10px}.cropper .docs-tooltip{display:block;margin:-6px -12px;padding:6px 12px}.cropper .docs-tooltip>.icon{margin:0 -3px;vertical-align:top}.cropper .tooltip-inner{white-space:normal}.cropper .btn-upload .tooltip-inner,.cropper .btn-toggle .tooltip-inner{white-space:nowrap}.cropper .btn-toggle{padding:6px}.cropper .btn-toggle>.docs-tooltip{margin:-6px;padding:6px}@media (max-width: 400px){.cropper .btn-group-crop{margin-right:-15px !important}.cropper .btn-group-crop>.btn{padding-left:5px;padding-right:5px}.cropper .btn-group-crop .docs-tooltip{margin-left:-5px;margin-right:-5px;padding-left:5px;padding-right:5px}}.cropper .docs-options .dropdown-menu{width:100%}.cropper .docs-options .dropdown-menu>li{padding:3px 20px}.cropper .docs-options .dropdown-menu>li:hover{background-color:#f7f7f7}.cropper .docs-options .dropdown-menu>li>label{display:block}.cropper .docs-cropped .modal-body{text-align:center}.cropper .docs-cropped .modal-body>img,.cropper .docs-cropped .modal-body>canvas{max-width:100%}.cropper .docs-diagram .modal-dialog{max-width:352px}.cropper .docs-cropped canvas{max-width:100%}.form_wizard .stepContainer{display:block;position:relative;margin:0;padding:0;border:0 solid #CCC;overflow-x:hidden}.wizard_horizontal ul.wizard_steps{display:table;list-style:none;position:relative;width:100%;margin:0 0 20px}.wizard_horizontal ul.wizard_steps li{display:table-cell;text-align:center}.wizard_horizontal ul.wizard_steps li a,.wizard_horizontal ul.wizard_steps li:hover{display:block;position:relative;-moz-opacity:1;filter:alpha(opacity=100);opacity:1;color:#666}.wizard_horizontal ul.wizard_steps li a:before{content:"";position:absolute;height:4px;background:#ccc;top:20px;width:100%;z-index:4;left:0}.wizard_horizontal ul.wizard_steps li a.disabled .step_no{background:#ccc}.wizard_horizontal ul.wizard_steps li a .step_no{width:40px;height:40px;line-height:40px;border-radius:100px;display:block;margin:0 auto 5px;font-size:16px;text-align:center;position:relative;z-index:5}.wizard_horizontal ul.wizard_steps li a.selected:before,.step_no{background:#34495E;color:#fff}.wizard_horizontal ul.wizard_steps li a.done:before,.wizard_horizontal ul.wizard_steps li a.done .step_no{background:#1ABB9C;color:#fff}.wizard_horizontal ul.wizard_steps li:first-child a:before{left:50%}.wizard_horizontal ul.wizard_steps li:last-child a:before{right:50%;width:50%;left:auto}.wizard_verticle .stepContainer{width:80%;float:left;padding:0 10px}.actionBar{width:100%;border-top:1px solid #ddd;padding:10px 5px;text-align:right;margin-top:10px}.actionBar .buttonDisabled{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.actionBar a{margin:0 3px}.wizard_verticle .wizard_content{width:80%;float:left;padding-left:20px}.wizard_verticle ul.wizard_steps{display:table;list-style:none;position:relative;width:20%;float:left;margin:0 0 20px}.wizard_verticle ul.wizard_steps li{display:list-item;text-align:center}.wizard_verticle ul.wizard_steps li a{height:80px}.wizard_verticle ul.wizard_steps li a:first-child{margin-top:20px}.wizard_verticle ul.wizard_steps li a,.wizard_verticle ul.wizard_steps li:hover{display:block;position:relative;-moz-opacity:1;filter:alpha(opacity=100);opacity:1;color:#666}.wizard_verticle ul.wizard_steps li a:before{content:"";position:absolute;height:100%;background:#ccc;top:20px;width:4px;z-index:4;left:49%}.wizard_verticle ul.wizard_steps li a.disabled .step_no{background:#ccc}.wizard_verticle ul.wizard_steps li a .step_no{width:40px;height:40px;line-height:40px;border-radius:100px;display:block;margin:0 auto 5px;font-size:16px;text-align:center;position:relative;z-index:5}.wizard_verticle ul.wizard_steps li a.selected:before,.step_no{background:#34495E;color:#fff}.wizard_verticle ul.wizard_steps li a.done:before,.wizard_verticle ul.wizard_steps li a.done .step_no{background:#1ABB9C;color:#fff}.wizard_verticle ul.wizard_steps li:first-child a:before{left:49%}.wizard_verticle ul.wizard_steps li:last-child a:before{left:49%;left:auto;width:0}.form_wizard .loader{display:none}.form_wizard .msgBox{display:none}.progress{border-radius:0}.progress-bar-info{background-color:#3498DB}.progress-bar-success{background-color:#26B99A}.progress_summary .progress{margin:5px 0 12px !important}.progress_summary .row{margin-bottom:5px}.progress_summary .row .col-xs-2{padding:0}.progress_summary .more_info span{text-align:right;float:right}.progress_summary .data span{text-align:right;float:right}.progress_summary p{margin-bottom:3px;width:100%}.progress_title .left{float:left;text-align:left}.progress_title .right{float:right;text-align:right;font-weight:300}.progress.progress_sm{border-radius:0;margin-bottom:18px;height:10px !important}.progress.progress_sm .progress-bar{height:10px !important}.dashboard_graph p{margin:0 0 4px}ul.verticle_bars{width:100%}ul.verticle_bars li{width:23%;height:200px;margin:0}.progress.vertical.progress_wide{width:35px}.alert-success{color:#ffffff;background-color:rgba(38,185,154,0.88);border-color:rgba(38,185,154,0.88)}.alert-info{color:#E9EDEF;background-color:rgba(52,152,219,0.88);border-color:rgba(52,152,219,0.88)}.alert-warning{color:#E9EDEF;background-color:rgba(243,156,18,0.88);border-color:rgba(243,156,18,0.88)}.alert-danger,.alert-error{color:#E9EDEF;background-color:rgba(231,76,60,0.88);border-color:rgba(231,76,60,0.88)}.ui-pnotify.dark .ui-pnotify-container{color:#E9EDEF;background-color:rgba(52,73,94,0.88);border-color:rgba(52,73,94,0.88)}.custom-notifications{position:fixed;margin:15px;right:0;float:right;width:400px;z-index:4000;bottom:0}ul.notifications{float:right;display:block;margin-bottom:7px;padding:0;width:100%}.notifications li{float:right;margin:3px;width:36px;box-shadow:3px 3px 3px rgba(0,0,0,0.3)}.notifications li:last-child{margin-left:0}.notifications a{display:block;text-align:center;text-decoration:none;text-transform:uppercase;padding:9px 8px}.tabbed_notifications .text{padding:5px 15px;height:140px;border-radius:7px;box-shadow:6px 6px 6px rgba(0,0,0,0.3)}.tabbed_notifications div p{display:inline-block}.tabbed_notifications h2{font-weight:bold;text-transform:uppercase;width:80%;float:left;height:20px;text-overflow:ellipsis;overflow:hidden;display:block}.tabbed_notifications .close{padding:5px;color:#E9EDEF;float:right;opacity:1}.daterangepicker.dropdown-menu{font-size:13px;padding:0;overflow:hidden}.daterangepicker.picker_1{background:#34495E;color:#ECF0F1}.daterangepicker.picker_1 table.table-condensed thead tr:first-child{background:#1ABB9C}.daterangepicker table.table-condensed thead tr:first-child th{line-height:28px;text-align:center}.daterangepicker.picker_1 table.table-condensed thead tr{background:#213345}.daterangepicker table.table-condensed thead tr{line-height:14px}.daterangepicker table.table-condensed tbody tr:first-child td{padding-top:10px}.daterangepicker table.table-condensed th:first-child,.daterangepicker table.table-condensed td:first-child{padding-left:12px}.daterangepicker table.table-condensed th:last-child,.daterangepicker table.table-condensed td:last-child{padding-right:12px}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px 7px;text-align:center}.daterangepicker table.table-condensed tbody tr:last-child td{padding-bottom:10px}.daterangepicker.picker_2 table.table-condensed thead tr:first-child{color:inherit}.daterangepicker.picker_2 table.table-condensed thead tr{color:#1ABB9C}.daterangepicker.picker_3 table.table-condensed thead tr:first-child{background:#1ABB9C;color:#ECF0F1}.daterangepicker.picker_4 table.table-condensed tbody td{background:#ECF0F1;color:#34495E;border:1px solid #fff;padding:4px 7px}.daterangepicker.picker_4 table.table-condensed tbody td.active{background:#536A7F;color:#fff}.daterangepicker.picker_4 table.table-condensed thead tr:first-child{background:#34495E;color:#ECF0F1}.xdisplay_input{width:240px;overflow:hidden;padding:0}.xdisplay{background-color:#fff;background-clip:padding-box;border:1px solid #ccc;margin-bottom:20px;border:1px solid rgba(0,0,0,0.15);border-radius:4px;width:230px;overflow:hidden;box-shadow:0 6px 12px rgba(0,0,0,0.175)}.daterangepicker.opensright .ranges,.daterangepicker.opensright .calendar,.daterangepicker.openscenter .ranges,.daterangepicker.openscenter .calendar{float:right}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{text-align:center;width:20px;height:20px;cursor:pointer;white-space:nowrap}.daterangepicker td.off{color:#999}.daterangepicker td.disabled{color:#999}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background:#eee;color:#34495E}.daterangepicker td.in-range{background:#E4E7EA;border-radius:0}.daterangepicker td.available+td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.in-range+td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px !important}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#536A7F;color:#fff}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default;height:30px;border:1px solid #ADB2B5;line-height:30px;border-radius:0px !important}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.hourselect,.daterangepicker select.minuteselect,.daterangepicker select.ampmselect{width:50px;margin-bottom:0}.daterangepicker_start_input{float:left}.daterangepicker_end_input{float:left;padding-left:11px}.daterangepicker th.month{width:auto}.daterangepicker .daterangepicker_start_input label,.daterangepicker .daterangepicker_end_input label{color:#333;display:block;font-size:11px;font-weight:normal;height:20px;line-height:20px;margin-bottom:2px;text-shadow:#fff 1px 1px 0px;text-transform:uppercase;width:74px}.daterangepicker .ranges input{font-size:11px}.daterangepicker .ranges .input-mini{background-color:#eee;border:1px solid #ccc;border-radius:4px;color:#555;display:block;font-size:11px;height:30px;line-height:30px;vertical-align:middle;margin:0 0 10px 0;padding:0 6px;width:74px}.daterangepicker .ranges .input-mini:hover{cursor:pointer}.daterangepicker .ranges ul{list-style:none;margin:0;padding:0}.daterangepicker .ranges li{font-size:13px;background:#f5f5f5;border:1px solid #f5f5f5;color:#536A7F;padding:3px 12px;margin-bottom:8px;border-radius:5px;cursor:pointer}.daterangepicker .ranges li.active,.daterangepicker .ranges li:hover{background:#536A7F;border:1px solid #536A7F;color:#fff}.daterangepicker .calendar{display:none;max-width:270px}.daterangepicker.show-calendar .calendar{display:block}.daterangepicker .calendar.single .calendar-date{border:none}.daterangepicker.single .ranges,.daterangepicker.single .calendar{float:none}.daterangepicker .ranges{width:160px;text-align:left;margin:4px}.daterangepicker .ranges .range_inputs>div{float:left}.daterangepicker .ranges .range_inputs>div:nth-child(2){padding-left:11px}.daterangepicker.opensleft .ranges,.daterangepicker.opensleft .calendar{float:left;margin:4px}.daterangepicker .icon{width:20px;height:20px;display:inline-block;vertical-align:middle}.fc-state-default{background:#f5f5f5;color:#73879C}.fc-state-down,.fc-state-active{color:#333;background:#ccc}.dropzone{min-height:300px;border:1px solid #e5e5e5} + */.tabs-left,.tabs-right{border-bottom:none;padding-top:2px}.tabs-left{border-right:1px solid #F7F7F7}.tabs-right{border-left:1px solid #F7F7F7}.tabs-left>li,.tabs-right>li{float:none;margin-bottom:2px}.tabs-left>li{margin-right:-1px}.tabs-right>li{margin-left:-1px}.tabs-left>li.active>a,.tabs-left>li.active>a:hover,.tabs-left>li.active>a:focus{border-bottom-color:#F7F7F7;border-right-color:transparent}.tabs-right>li.active>a,.tabs-right>li.active>a:hover,.tabs-right>li.active>a:focus{border-bottom:1px solid #F7F7F7;border-left-color:transparent}.tabs-left>li>a{border-radius:4px 0 0 4px;margin-right:0;display:block;background:#F7F7F7;text-overflow:ellipsis;overflow:hidden}.tabs-right>li>a{border-radius:0 4px 4px 0;margin-right:0;background:#F7F7F7;text-overflow:ellipsis;overflow:hidden}.sideways{margin-top:50px;border:none;position:relative}.sideways>li{height:20px;width:120px;margin-bottom:100px}.sideways>li>a{border-bottom:1px solid #ddd;border-right-color:transparent;text-align:center;border-radius:4px 4px 0px 0px}.sideways>li.active>a,.sideways>li.active>a:hover,.sideways>li.active>a:focus{border-bottom-color:transparent;border-right-color:#ddd;border-left-color:#ddd}.sideways.tabs-left{left:-50px}.sideways.tabs-right{right:-50px}.sideways.tabs-right>li{transform:rotate(90deg)}.sideways.tabs-left>li{transform:rotate(-90deg)}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{padding:6px;color:#666;background:rgba(243,242,243,0.8);border:solid 2px rgba(195,194,196,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}.price{font-size:40px;font-weight:400;color:#26B99A;margin:0}.prod_title{border-bottom:1px solid #DFDFDF;padding-bottom:5px;margin:30px 0;font-size:20px;font-weight:400}.product-image img{width:90%}.prod_color li{margin:0 10px}.prod_color li p{margin-bottom:0}.prod_size li{padding:0}.prod_color .color{width:25px;height:25px;border:2px solid rgba(51,51,51,0.28) !important;padding:2px;border-radius:50px}.product_gallery a{width:100px;height:100px;float:left;margin:10px;border:1px solid #e5e5e5}.product_gallery a img{width:100%;margin-top:15px}.product_price{margin:20px 0;padding:5px 10px;background-color:#FFFFFF;text-align:left;border:2px dashed #E0E0E0}.price-tax{font-size:18px}.product_social{margin:20px 0}.product_social ul li a i{font-size:35px}.login{background:#F7F7F7}.login .fa-paw{font-size:26px}a.hiddenanchor{display:none}.login_wrapper{right:0px;margin:0px auto;margin-top:5%;max-width:350px;position:relative}.registration_form,.login_form{position:absolute;top:0px;width:100%}.registration_form{z-index:21;opacity:0;width:100%}.login_form{z-index:22}#signup:target ~ .login_wrapper .registration_form,#signin:target ~ .login_wrapper .login_form{z-index:22;animation-name:fadeInLeft;animation-delay:.1s}#signup:target ~ .login_wrapper .login_form,#signin:target ~ .login_wrapper .registration_form{animation-name:fadeOutLeft}.animate{-webkit-animation-duration:0.5s;-webkit-animation-timing-function:ease;-webkit-animation-fill-mode:both;-moz-animation-duration:0.5s;-moz-animation-timing-function:ease;-moz-animation-fill-mode:both;-o-animation-duration:0.5s;-o-animation-timing-function:ease;-o-animation-fill-mode:both;-ms-animation-duration:0.5s;-ms-animation-timing-function:ease;-ms-animation-fill-mode:both;animation-duration:0.5s;animation-timing-function:ease;animation-fill-mode:both}.login_box{padding:20px;margin:auto}.left{float:left}.alignleft{float:left;margin-right:15px}.alignright{float:right;margin-left:15px}.clearfix:after,form:after{content:".";display:block;height:0;clear:both;visibility:hidden}.login_content{margin:0 auto;padding:25px 0 0;position:relative;text-align:center;text-shadow:0 1px 0 #fff;min-width:280px}.login_content a,.login_content .btn-default:hover{text-decoration:none}.login_content a:hover{text-decoration:underline}.login_content h1{font:normal 25px Helvetica, Arial, sans-serif;letter-spacing:-0.05em;line-height:20px;margin:10px 0 30px}.login_content h1:before,.login_content h1:after{content:"";height:1px;position:absolute;top:10px;width:27%}.login_content h1:after{background:#7e7e7e;background:linear-gradient(left, #7e7e7e 0%, #fff 100%);right:0}.login_content h1:before{background:#7e7e7e;background:linear-gradient(right, #7e7e7e 0%, #fff 100%);left:0}.login_content h1:before,.login_content h1:after{content:"";height:1px;position:absolute;top:10px;width:20%}.login_content h1:after{background:#7e7e7e;background:linear-gradient(left, #7e7e7e 0%, #fff 100%);right:0}.login_content h1:before{background:#7e7e7e;background:linear-gradient(right, #7e7e7e 0%, #fff 100%);left:0}.login_content form{margin:20px 0;position:relative}.login_content form input[type="text"],.login_content form input[type="email"],.login_content form input[type="password"]{border-radius:3px;-ms-box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,0.08) inset;-o-box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,0.08) inset;box-shadow:0 1px 0 #fff,0 -2px 5px rgba(0,0,0,0.08) inset;border:1px solid #c8c8c8;color:#777;margin:0 0 20px;width:100%}.login_content form input[type="text"]:focus,.login_content form input[type="email"]:focus,.login_content form input[type="password"]:focus{-ms-box-shadow:0 0 2px #ed1c24 inset;-o-box-shadow:0 0 2px #ed1c24 inset;box-shadow:0 0 2px #A97AAD inset;background-color:#fff;border:1px solid #A878AF;outline:none}#username{background-position:10px 10px !important}#password{background-position:10px -53px !important}.login_content form div a{font-size:12px;margin:10px 15px 0 0}.reset_pass{margin-top:10px !important}.login_content div .reset_pass{margin-top:13px !important;margin-right:39px;float:right}.separator{border-top:1px solid #D8D8D8;margin-top:10px;padding-top:10px}.button{background:#f7f9fa;background:linear-gradient(top, #f7f9fa 0%, #f0f0f0 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f9fa', endColorstr='#f0f0f0', GradientType=0);-ms-box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;-o-box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;border-radius:0 0 5px 5px;border-top:1px solid #CFD5D9;padding:15px 0}.login_content form input[type="submit"],#content form .submit{float:left;margin-left:38px}.button a{background:url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat;color:#7E7E7E;font-size:17px;padding:2px 0 2px 40px;text-decoration:none;transition:all 0.3s ease}.button a:hover{background-position:0 -135px;color:#00aeef}header{width:100%}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0px;width:100px;height:100%;box-shadow:0 0 10px #29d, 0 0 5px #29d;opacity:1.0;transform:rotate(3deg) translate(0px, -4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.editor-wrapper{min-height:250px;background-color:white;border-collapse:separate;border:1px solid #ccc;padding:4px;box-sizing:content-box;box-shadow:rgba(0,0,0,0.07451) 0px 1px 1px 0px inset;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px;overflow:scroll;outline:none}.voiceBtn{width:20px;color:transparent;background-color:transparent;transform:scale(2, 2);-webkit-transform:scale(2, 2);-moz-transform:scale(2, 2);border:transparent;cursor:pointer;box-shadow:none;-webkit-box-shadow:none}div[data-role="editor-toolbar"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dropdown-menu a{cursor:pointer}.select2-container--default .select2-selection--single,.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #ccc;border-radius:0;min-height:38px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#73879C;padding-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-top:3px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:36px}.select2-container--default .select2-selection--multiple .select2-selection__choice,.select2-container--default .select2-selection--multiple .select2-selection__clear{margin-top:2px;border:none;border-radius:0;padding:3px 5px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #ccc}.switchery{width:32px;height:20px}.switchery>small{width:20px;height:20px}fieldset{border:none;margin:0;padding:0}.cropper .img-container,.cropper .img-preview{background-color:#f7f7f7;width:100%;text-align:center}.cropper .img-container{min-height:200px;max-height:516px;margin-bottom:20px}@media (min-width: 768px){.cropper .img-container{min-height:516px}}.cropper .img-container>img{max-width:100%}.cropper .docs-preview{margin-right:-15px}.cropper .img-preview{float:left;margin-right:10px;margin-bottom:10px;overflow:hidden}.cropper .img-preview>img{max-width:100%}.cropper .preview-lg{width:263px;height:148px}.cropper .preview-md{width:139px;height:78px}.cropper .preview-sm{width:69px;height:39px}.cropper .preview-xs{width:35px;height:20px;margin-right:0}.cropper .docs-data>.input-group{margin-bottom:10px}.cropper .docs-data>.input-group>label{min-width:80px}.cropper .docs-data>.input-group>span{min-width:50px}.cropper .docs-buttons>.btn,.cropper .docs-buttons>.btn-group,.cropper .docs-buttons>.form-control{margin-right:5px;margin-bottom:10px}.cropper .docs-toggles>.btn,.cropper .docs-toggles>.btn-group,.cropper .docs-toggles>.dropdown{margin-bottom:10px}.cropper .docs-tooltip{display:block;margin:-6px -12px;padding:6px 12px}.cropper .docs-tooltip>.icon{margin:0 -3px;vertical-align:top}.cropper .tooltip-inner{white-space:normal}.cropper .btn-upload .tooltip-inner,.cropper .btn-toggle .tooltip-inner{white-space:nowrap}.cropper .btn-toggle{padding:6px}.cropper .btn-toggle>.docs-tooltip{margin:-6px;padding:6px}@media (max-width: 400px){.cropper .btn-group-crop{margin-right:-15px !important}.cropper .btn-group-crop>.btn{padding-left:5px;padding-right:5px}.cropper .btn-group-crop .docs-tooltip{margin-left:-5px;margin-right:-5px;padding-left:5px;padding-right:5px}}.cropper .docs-options .dropdown-menu{width:100%}.cropper .docs-options .dropdown-menu>li{padding:3px 20px}.cropper .docs-options .dropdown-menu>li:hover{background-color:#f7f7f7}.cropper .docs-options .dropdown-menu>li>label{display:block}.cropper .docs-cropped .modal-body{text-align:center}.cropper .docs-cropped .modal-body>img,.cropper .docs-cropped .modal-body>canvas{max-width:100%}.cropper .docs-diagram .modal-dialog{max-width:352px}.cropper .docs-cropped canvas{max-width:100%}.form_wizard .stepContainer{display:block;position:relative;margin:0;padding:0;border:0 solid #CCC;overflow-x:hidden}.wizard_horizontal ul.wizard_steps{display:table;list-style:none;position:relative;width:100%;margin:0 0 20px}.wizard_horizontal ul.wizard_steps li{display:table-cell;text-align:center}.wizard_horizontal ul.wizard_steps li a,.wizard_horizontal ul.wizard_steps li:hover{display:block;position:relative;-moz-opacity:1;filter:alpha(opacity=100);opacity:1;color:#666}.wizard_horizontal ul.wizard_steps li a:before{content:"";position:absolute;height:4px;background:#ccc;top:20px;width:100%;z-index:4;left:0}.wizard_horizontal ul.wizard_steps li a.disabled .step_no{background:#ccc}.wizard_horizontal ul.wizard_steps li a .step_no{width:40px;height:40px;line-height:40px;border-radius:100px;display:block;margin:0 auto 5px;font-size:16px;text-align:center;position:relative;z-index:5}.wizard_horizontal ul.wizard_steps li a.selected:before,.step_no{background:#34495E;color:#fff}.wizard_horizontal ul.wizard_steps li a.done:before,.wizard_horizontal ul.wizard_steps li a.done .step_no{background:#1ABB9C;color:#fff}.wizard_horizontal ul.wizard_steps li:first-child a:before{left:50%}.wizard_horizontal ul.wizard_steps li:last-child a:before{right:50%;width:50%;left:auto}.wizard_verticle .stepContainer{width:80%;float:left;padding:0 10px}.actionBar{width:100%;border-top:1px solid #ddd;padding:10px 5px;text-align:right;margin-top:10px}.actionBar .buttonDisabled{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.actionBar a{margin:0 3px}.wizard_verticle .wizard_content{width:80%;float:left;padding-left:20px}.wizard_verticle ul.wizard_steps{display:table;list-style:none;position:relative;width:20%;float:left;margin:0 0 20px}.wizard_verticle ul.wizard_steps li{display:list-item;text-align:center}.wizard_verticle ul.wizard_steps li a{height:80px}.wizard_verticle ul.wizard_steps li a:first-child{margin-top:20px}.wizard_verticle ul.wizard_steps li a,.wizard_verticle ul.wizard_steps li:hover{display:block;position:relative;-moz-opacity:1;filter:alpha(opacity=100);opacity:1;color:#666}.wizard_verticle ul.wizard_steps li a:before{content:"";position:absolute;height:100%;background:#ccc;top:20px;width:4px;z-index:4;left:49%}.wizard_verticle ul.wizard_steps li a.disabled .step_no{background:#ccc}.wizard_verticle ul.wizard_steps li a .step_no{width:40px;height:40px;line-height:40px;border-radius:100px;display:block;margin:0 auto 5px;font-size:16px;text-align:center;position:relative;z-index:5}.wizard_verticle ul.wizard_steps li a.selected:before,.step_no{background:#34495E;color:#fff}.wizard_verticle ul.wizard_steps li a.done:before,.wizard_verticle ul.wizard_steps li a.done .step_no{background:#1ABB9C;color:#fff}.wizard_verticle ul.wizard_steps li:first-child a:before{left:49%}.wizard_verticle ul.wizard_steps li:last-child a:before{left:49%;left:auto;width:0}.form_wizard .loader{display:none}.form_wizard .msgBox{display:none}.progress{border-radius:0}.progress-bar-info{background-color:#3498DB}.progress-bar-success{background-color:#26B99A}.progress_summary .progress{margin:5px 0 12px !important}.progress_summary .row{margin-bottom:5px}.progress_summary .row .col-xs-2{padding:0}.progress_summary .more_info span{text-align:right;float:right}.progress_summary .data span{text-align:right;float:right}.progress_summary p{margin-bottom:3px;width:100%}.progress_title .left{float:left;text-align:left}.progress_title .right{float:right;text-align:right;font-weight:300}.progress.progress_sm{border-radius:0;margin-bottom:18px;height:10px !important}.progress.progress_sm .progress-bar{height:10px !important}.dashboard_graph p{margin:0 0 4px}ul.verticle_bars{width:100%}ul.verticle_bars li{width:23%;height:200px;margin:0}.progress.vertical.progress_wide{width:35px}.alert-success{color:#ffffff;background-color:rgba(38,185,154,0.88);border-color:rgba(38,185,154,0.88)}.alert-info{color:#E9EDEF;background-color:rgba(52,152,219,0.88);border-color:rgba(52,152,219,0.88)}.alert-warning{color:#E9EDEF;background-color:rgba(243,156,18,0.88);border-color:rgba(243,156,18,0.88)}.alert-danger,.alert-error{color:#E9EDEF;background-color:rgba(231,76,60,0.88);border-color:rgba(231,76,60,0.88)}.ui-pnotify.dark .ui-pnotify-container{color:#E9EDEF;background-color:rgba(52,73,94,0.88);border-color:rgba(52,73,94,0.88)}.custom-notifications{position:fixed;margin:15px;right:0;float:right;width:400px;z-index:4000;bottom:0}ul.notifications{float:right;display:block;margin-bottom:7px;padding:0;width:100%}.notifications li{float:right;margin:3px;width:36px;box-shadow:3px 3px 3px rgba(0,0,0,0.3)}.notifications li:last-child{margin-left:0}.notifications a{display:block;text-align:center;text-decoration:none;text-transform:uppercase;padding:9px 8px}.tabbed_notifications .text{padding:5px 15px;height:140px;border-radius:7px;box-shadow:6px 6px 6px rgba(0,0,0,0.3)}.tabbed_notifications div p{display:inline-block}.tabbed_notifications h2{font-weight:bold;text-transform:uppercase;width:80%;float:left;height:20px;text-overflow:ellipsis;overflow:hidden;display:block}.tabbed_notifications .close{padding:5px;color:#E9EDEF;float:right;opacity:1}.daterangepicker.dropdown-menu{font-size:13px;padding:0;overflow:hidden}.daterangepicker.picker_1{background:#34495E;color:#ECF0F1}.daterangepicker.picker_1 table.table-condensed thead tr:first-child{background:#1ABB9C}.daterangepicker table.table-condensed thead tr:first-child th{line-height:28px;text-align:center}.daterangepicker.picker_1 table.table-condensed thead tr{background:#213345}.daterangepicker table.table-condensed thead tr{line-height:14px}.daterangepicker table.table-condensed tbody tr:first-child td{padding-top:10px}.daterangepicker table.table-condensed th:first-child,.daterangepicker table.table-condensed td:first-child{padding-left:12px}.daterangepicker table.table-condensed th:last-child,.daterangepicker table.table-condensed td:last-child{padding-right:12px}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px 7px;text-align:center}.daterangepicker table.table-condensed tbody tr:last-child td{padding-bottom:10px}.daterangepicker.picker_2 table.table-condensed thead tr:first-child{color:inherit}.daterangepicker.picker_2 table.table-condensed thead tr{color:#1ABB9C}.daterangepicker.picker_3 table.table-condensed thead tr:first-child{background:#1ABB9C;color:#ECF0F1}.daterangepicker.picker_4 table.table-condensed tbody td{background:#ECF0F1;color:#34495E;border:1px solid #fff;padding:4px 7px}.daterangepicker.picker_4 table.table-condensed tbody td.active{background:#536A7F;color:#fff}.daterangepicker.picker_4 table.table-condensed thead tr:first-child{background:#34495E;color:#ECF0F1}.xdisplay_input{width:240px;overflow:hidden;padding:0}.xdisplay{background-color:#fff;background-clip:padding-box;border:1px solid #ccc;margin-bottom:20px;border:1px solid rgba(0,0,0,0.15);border-radius:4px;width:230px;overflow:hidden;box-shadow:0 6px 12px rgba(0,0,0,0.175)}.daterangepicker.opensright .ranges,.daterangepicker.opensright .calendar,.daterangepicker.openscenter .ranges,.daterangepicker.openscenter .calendar{float:right}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{text-align:center;width:20px;height:20px;cursor:pointer;white-space:nowrap}.daterangepicker td.off{color:#999}.daterangepicker td.disabled{color:#999}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background:#eee;color:#34495E}.daterangepicker td.in-range{background:#E4E7EA;border-radius:0}.daterangepicker td.available+td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.in-range+td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px !important}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#536A7F;color:#fff}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default;height:30px;border:1px solid #ADB2B5;line-height:30px;border-radius:0px !important}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.hourselect,.daterangepicker select.minuteselect,.daterangepicker select.ampmselect{width:50px;margin-bottom:0}.daterangepicker_start_input{float:left}.daterangepicker_end_input{float:left;padding-left:11px}.daterangepicker th.month{width:auto}.daterangepicker .daterangepicker_start_input label,.daterangepicker .daterangepicker_end_input label{color:#333;display:block;font-size:11px;font-weight:normal;height:20px;line-height:20px;margin-bottom:2px;text-shadow:#fff 1px 1px 0px;text-transform:uppercase;width:74px}.daterangepicker .ranges input{font-size:11px}.daterangepicker .ranges .input-mini{background-color:#eee;border:1px solid #ccc;border-radius:4px;color:#555;display:block;font-size:11px;height:30px;line-height:30px;vertical-align:middle;margin:0 0 10px 0;padding:0 6px;width:74px}.daterangepicker .ranges .input-mini:hover{cursor:pointer}.daterangepicker .ranges ul{list-style:none;margin:0;padding:0}.daterangepicker .ranges li{font-size:13px;background:#f5f5f5;border:1px solid #f5f5f5;color:#536A7F;padding:3px 12px;margin-bottom:8px;border-radius:5px;cursor:pointer}.daterangepicker .ranges li.active,.daterangepicker .ranges li:hover{background:#536A7F;border:1px solid #536A7F;color:#fff}.daterangepicker .calendar{display:none;max-width:270px}.daterangepicker.show-calendar .calendar{display:block}.daterangepicker .calendar.single .calendar-date{border:none}.daterangepicker.single .ranges,.daterangepicker.single .calendar{float:none}.daterangepicker .ranges{width:160px;text-align:left;margin:4px}.daterangepicker .ranges .range_inputs>div{float:left}.daterangepicker .ranges .range_inputs>div:nth-child(2){padding-left:11px}.daterangepicker.opensleft .ranges,.daterangepicker.opensleft .calendar{float:left;margin:4px}.daterangepicker .icon{width:20px;height:20px;display:inline-block;vertical-align:middle}.fc-state-default{background:#f5f5f5;color:#73879C}.fc-state-down,.fc-state-active{color:#333;background:#ccc}.dropzone{min-height:300px;border:1px solid #e5e5e5} diff --git a/production/e_commerce.html b/production/e_commerce.html index f1311ad8..f395a2b3 100755 --- a/production/e_commerce.html +++ b/production/e_commerce.html @@ -314,20 +314,20 @@
- ... + ...
diff --git a/production/form_advanced.html b/production/form_advanced.html index 281a11b6..30214e72 100755 --- a/production/form_advanced.html +++ b/production/form_advanced.html @@ -1406,13 +1406,11 @@
-
- Picture + Picture
-
@@ -1420,7 +1418,6 @@
-
diff --git a/production/images/back_disabled.png b/production/images/back_disabled.png deleted file mode 100755 index 881de797..00000000 Binary files a/production/images/back_disabled.png and /dev/null differ diff --git a/production/images/back_enabled.png b/production/images/back_enabled.png deleted file mode 100755 index c608682b..00000000 Binary files a/production/images/back_enabled.png and /dev/null differ diff --git a/production/images/back_enabled_hover.png b/production/images/back_enabled_hover.png deleted file mode 100755 index d300f106..00000000 Binary files a/production/images/back_enabled_hover.png and /dev/null differ diff --git a/production/images/bootstrap-colorpicker/alpha-horizontal.png b/production/images/bootstrap-colorpicker/alpha-horizontal.png deleted file mode 100755 index d0a65c08..00000000 Binary files a/production/images/bootstrap-colorpicker/alpha-horizontal.png and /dev/null differ diff --git a/production/images/bootstrap-colorpicker/alpha.png b/production/images/bootstrap-colorpicker/alpha.png deleted file mode 100755 index 38043f1c..00000000 Binary files a/production/images/bootstrap-colorpicker/alpha.png and /dev/null differ diff --git a/production/images/bootstrap-colorpicker/hue-horizontal.png b/production/images/bootstrap-colorpicker/hue-horizontal.png deleted file mode 100755 index a0d9add8..00000000 Binary files a/production/images/bootstrap-colorpicker/hue-horizontal.png and /dev/null differ diff --git a/production/images/bootstrap-colorpicker/hue.png b/production/images/bootstrap-colorpicker/hue.png deleted file mode 100755 index d89560e9..00000000 Binary files a/production/images/bootstrap-colorpicker/hue.png and /dev/null differ diff --git a/production/images/bootstrap-colorpicker/saturation.png b/production/images/bootstrap-colorpicker/saturation.png deleted file mode 100755 index 594ae50e..00000000 Binary files a/production/images/bootstrap-colorpicker/saturation.png and /dev/null differ diff --git a/production/images/picture2.jpg b/production/images/cropper.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/picture2.jpg rename to production/images/cropper.jpg diff --git a/production/images/data.png b/production/images/data.png deleted file mode 100755 index 669983e5..00000000 Binary files a/production/images/data.png and /dev/null differ diff --git a/production/images/favicon.ico b/production/images/favicon.ico deleted file mode 100755 index 6eeaa2a0..00000000 Binary files a/production/images/favicon.ico and /dev/null differ diff --git a/production/images/forward_disabled.png b/production/images/forward_disabled.png deleted file mode 100755 index 6a6ded7d..00000000 Binary files a/production/images/forward_disabled.png and /dev/null differ diff --git a/production/images/forward_enabled.png b/production/images/forward_enabled.png deleted file mode 100755 index a4e6b538..00000000 Binary files a/production/images/forward_enabled.png and /dev/null differ diff --git a/production/images/forward_enabled_hover.png b/production/images/forward_enabled_hover.png deleted file mode 100755 index fc46c5eb..00000000 Binary files a/production/images/forward_enabled_hover.png and /dev/null differ diff --git a/production/images/icons.png b/production/images/icons.png deleted file mode 100755 index 903afb4a..00000000 Binary files a/production/images/icons.png and /dev/null differ diff --git a/production/images/1.png b/production/images/inbox.png old mode 100755 new mode 100644 similarity index 100% rename from production/images/1.png rename to production/images/inbox.png diff --git a/production/images/loading.gif b/production/images/loading.gif deleted file mode 100644 index 2e4f98c7..00000000 Binary files a/production/images/loading.gif and /dev/null differ diff --git a/production/images/4.jpg b/production/images/media.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/4.jpg rename to production/images/media.jpg diff --git a/production/images/paypal2.png b/production/images/paypal.png old mode 100755 new mode 100644 similarity index 100% rename from production/images/paypal2.png rename to production/images/paypal.png diff --git a/production/images/picture-2.jpg b/production/images/picture-2.jpg deleted file mode 100755 index 9d4df0f3..00000000 Binary files a/production/images/picture-2.jpg and /dev/null differ diff --git a/production/images/prod1.jpg b/production/images/prod-1.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/prod1.jpg rename to production/images/prod-1.jpg diff --git a/production/images/prod2.jpg b/production/images/prod-2.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/prod2.jpg rename to production/images/prod-2.jpg diff --git a/production/images/prod3.jpg b/production/images/prod-3.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/prod3.jpg rename to production/images/prod-3.jpg diff --git a/production/images/prod4.jpg b/production/images/prod-4.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/prod4.jpg rename to production/images/prod-4.jpg diff --git a/production/images/prod5.jpg b/production/images/prod-5.jpg old mode 100755 new mode 100644 similarity index 100% rename from production/images/prod5.jpg rename to production/images/prod-5.jpg diff --git a/production/images/sprite-skin-flat.png b/production/images/sprite-skin-flat.png deleted file mode 100755 index 0f11c7cb..00000000 Binary files a/production/images/sprite-skin-flat.png and /dev/null differ diff --git a/production/images/sprite-skin-modern.png b/production/images/sprite-skin-modern.png deleted file mode 100755 index c9060f27..00000000 Binary files a/production/images/sprite-skin-modern.png and /dev/null differ diff --git a/production/images/sprite-skin-nice.png b/production/images/sprite-skin-nice.png deleted file mode 100755 index 9b0a4bcf..00000000 Binary files a/production/images/sprite-skin-nice.png and /dev/null differ diff --git a/production/images/sprite-skin-simple.png b/production/images/sprite-skin-simple.png deleted file mode 100755 index 0dc5e68e..00000000 Binary files a/production/images/sprite-skin-simple.png and /dev/null differ diff --git a/production/inbox.html b/production/inbox.html index 38c6389c..79af7791 100755 --- a/production/inbox.html +++ b/production/inbox.html @@ -452,7 +452,7 @@
  • - img + img
    @@ -469,7 +469,7 @@
  • - img + img
    @@ -484,7 +484,7 @@
  • - img + img
    diff --git a/production/index.html b/production/index.html index f4d23c48..1f8e20d5 100755 --- a/production/index.html +++ b/production/index.html @@ -988,7 +988,7 @@ - + diff --git a/production/index3.html b/production/index3.html index ab05c0e7..86ebe541 100755 --- a/production/index3.html +++ b/production/index3.html @@ -856,7 +856,7 @@ - + diff --git a/production/invoice.html b/production/invoice.html index 405cc4fe..0a81c6fe 100755 --- a/production/invoice.html +++ b/production/invoice.html @@ -415,7 +415,7 @@ Visa Mastercard American Express - Paypal + Paypal

    Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, weebly ning heekya handango imeem plugg dopplr jibjab, movity jajah plickers sifteo edmodo ifttt zimbra.

    diff --git a/production/less/custom.css b/production/less/custom.css deleted file mode 100755 index 05d26f34..00000000 --- a/production/less/custom.css +++ /dev/null @@ -1,4775 +0,0 @@ -.nav-sm .container.body .left_col { - width: 70px; - padding: 0; - z-index: 9999; - position: absolute; -} -.nav-sm .hidden-small { - visibility: hidden; -} -.nav-sm .container.body .right_col { - padding: 10px 20px; - margin-left: 70px; - z-index: 2; -} -.nav-sm .navbar.nav_title { - width: 70px; -} -.nav-sm .navbar.nav_title a span { - display: none; -} -.nav-sm .navbar.nav_title a i { - font-size: 27px; - margin: 13px 0 0 3px; -} -.site_title i { - border: 1px solid #EAEAEA; - padding: 5px 6px; - border-radius: 50%; -} -.nav-sm .main_container .top_nav { - display: block; - margin-left: 70px; - z-index: 2; -} -.nav-sm .nav.side-menu li a { - text-align: center !important; - font-weight: 400; - font-size: 10px; - padding: 10px 5px; -} -.nav-sm .nav.child_menu li.active, -.nav-sm .nav.side-menu li.active-sm { - border-right: 5px solid #1ABB9C; -} -.nav-sm ul.nav.child_menu ul, -.nav-sm .nav.side-menu li.active-sm ul ul { - position: static; - width: 200px; - background: none; -} -.nav-sm > .nav.side-menu > li.active-sm > a { - color: #1ABB9C !important; -} -.nav-sm .nav.side-menu li a i.toggle-up { - display: none !important; -} -.nav-sm .nav.side-menu li a i { - font-size: 25px !important; - text-align: center; - width: 100% !important; - margin-bottom: 5px; -} -.nav-sm ul.nav.child_menu { - left: 100%; - position: absolute; - top: 0; - width: 210px; - z-index: 4000; - background: #3E5367; - display: none; -} -.nav-sm ul.nav.child_menu li { - padding: 0 10px; -} -.nav-sm ul.nav.child_menu li a { - text-align: left !important; -} -.nav-sm .profile { - display: none; -} -.menu_section { - margin-bottom: 35px; -} -.menu_section h3 { - padding-left: 23px; - color: #fff; - text-transform: uppercase; - letter-spacing: .5px; - font-weight: bold; - font-size: 11px; - margin-bottom: 0; - margin-top: 0; - text-shadow: 1px 1px #000; -} -.menu_section >ul { - margin-top: 10px; -} -.profile_pic { - width: 35%; - float: left; -} -.img-circle.profile_img { - width: 70%; - background: #fff; - margin-left: 15%; - z-index: 1000; - position: inherit; - margin-top: 20px; - border: 1px solid rgba(52, 73, 94, 0.44); - padding: 4px; -} -.profile_info { - padding: 25px 10px 10px; - width: 65%; - float: left; -} -.profile_info span { - font-size: 13px; - line-height: 30px; - color: #BAB8B8; -} -.profile_info h2 { - font-size: 14px; - color: #ECF0F1; - margin: 0; - font-weight: 300; -} -.profile.img_2 { - text-align: center; -} -.profile.img_2 .profile_pic { - width: 100%; -} -.profile.img_2 .profile_pic .img-circle.profile_img { - width: 50%; - margin: 10px 0 0; -} -.profile.img_2 .profile_info { - padding: 15px 10px 0; - width: 100%; - margin-bottom: 10px; - float: left; -} -.main_menu span.fa { - float: right; - text-align: center; - margin-top: 5px; - font-size: 10px; - min-width: inherit; - color: #C4CFDA; -} -.active a span.fa { - text-align: right !important; - margin-right: 4px; -} -.nav-sm .menu_section { - margin: 0; -} -.nav-sm span.fa, -.nav-sm .menu_section h3 { - display: none; -} -.nav-sm li li span.fa { - display: inline-block; -} -.nav_menu { - float: left; - background: #EDEDED; - border-bottom: 1px solid #D9DEE4; - margin-bottom: 10px; - width: 100%; - position: relative; -} -@media (min-width: 480px) { - .nav_menu { - position: static; - } -} -.nav-md .container.body .col-md-3.left_col { - width: 230px; - padding: 0; - position: absolute; - display: flex; -} -body .container.body .right_col { - background: #F7F7F7; -} -.nav-md .container.body .right_col { - padding: 10px 20px 0; - margin-left: 230px; -} -.nav_title { - width: 230px; - float: left; - background: #2A3F54; - border-radius: 0; - height: 57px; -} -@media (max-width: 991px) { - .nav-md .container.body .right_col, .nav-md .container.body .top_nav { - width: 100%; - margin: 0; - } - .nav-md .container.body .col-md-3.left_col { - display: none; - } - .nav-md .container.body .right_col { - width: 100%; - padding-right: 0 - } - .right_col { - padding: 10px !important; - } -} -@media (max-width: 1200px) { - .x_title h2 { - width: 62%; - font-size: 17px; - } - .tile, .graph { - zoom: 85%; - height: inherit; - } -} -@media (max-width: 1270px) and (min-width: 192px) { - .x_title h2 small { - display: none - } -} - -/** ------------------------------------------ **/ - -.blue { - color: #3498DB; -} -.purple { - color: #9B59B6; -} -.green { - color: #1ABB9C; -} -.aero { - color: #9CC2CB; -} -.red { - color: #E74C3C; -} -.dark { - color: #34495E; -} -.border-blue { - border-color: #3498DB !important; -} -.border-purple { - border-color: #9B59B6 !important; -} -.border-green { - border-color: #1ABB9C !important; -} -.border-aero { - border-color: #9CC2CB !important; -} -.border-red { - border-color: #E74C3C !important; -} -.border-dark { - border-color: #34495E !important; -} -.bg-white { - background: #fff !important; - border: 1px solid #fff !important; - color: #73879C; -} -.bg-green { - background: #1ABB9C !important; - border: 1px solid #1ABB9C !important; - color: #fff; -} -.bg-red { - background: #E74C3C !important; - border: 1px solid #E74C3C !important; - color: #fff; -} -.bg-blue { - background: #3498DB !important; - border: 1px solid #3498DB !important; - color: #fff; -} -.bg-orange { - background: #F39C12 !important; - border: 1px solid #F39C12 !important; - color: #fff; -} -.bg-purple { - background: #9B59B6 !important; - border: 1px solid #9B59B6 !important; - color: #fff; -} -.bg-blue-sky { - background: #50C1CF !important; - border: 1px solid #50C1CF !important; - color: #fff; -} -.container { - width: 100%; - padding: 0 -} -.navbar-nav>li>a, .navbar-brand, .navbar-nav>li>a { - color: #fff !important; -} -.top_nav .nav>li>a:focus, .top_nav .nav>li>a:hover, .top_nav .nav .open>a, .top_nav .nav .open>a:focus, .top_nav .nav .open>a:hover { - background: #D9DEE4; -} -body { - color: #73879C; - background: #2A3F54; - /*#ECF0F1; #FCFCFC*/ - font-family: "Helvetica Neue", Roboto, Arial, "Droid Sans", sans-serif; - font-size: 13px; - font-weight: 400; - line-height: 1.471; -} -.main_container .top_nav { - display: block; - margin-left: 230px; -} -.main_container {} -.no-padding { - padding: 0 !important; -} -.page-title { - width: 100%; - height: 65px; - padding: 10px 0; -} -.page-title .title_left { - width: 45%; - float: left; - display: block; -} -.page-title .title_left h3 { - margin: 9px 0; -} -.page-title .title_right { - width: 55%; - float: left; - display: block; -} -.page-title .title_right .pull-right { - margin: 10px 0; -} -.fixed_height_320 { - height: 320px; -} -.fixed_height_390 { - height: 390px; -} -.fixed_height_200 { - height: 200px; -} -.overflow_hidden { - overflow: hidden -} -.progress-bar-dark { - background-color: #34495E !important; -} -.progress-bar-gray { - background-color: #BDC3C7 !important; -} -table.no-margin .progress { - margin-bottom: 0; -} -.main_content { - padding: 10px 20px; -} -.col-md-55 { - width: 50%; - margin-bottom: 10px; -} -@media (min-width: 768px) { - .col-md-55 { - width: 20%; - } -} -@media (min-width: 992px) { - .col-md-55 { - width: 20%; - } -} -@media (min-width: 1200px) { - .col-md-55 { - width: 20%; - } -} -@media (min-width: 192px) and (max-width: 1270px) { - table.tile_info span.right { - margin-right: 7px; - float: left; - } -} -.center-margin { - margin: 0 auto; - float: none!important; -} -.col-md-55, .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - float: left; - padding-right: 10px; - padding-left: 10px; -} -.row { - margin-right: -10px; - margin-left: -10px; -} -.grid_slider .col-md-6 { - padding: 0 40px; -} -h1, .h1, h2, .h2, h3, .h3 { - margin-top: 10px; - margin-bottom: 10px; -} -a { - color: #5A738E; - text-decoration: none; -} -a, a:visited, a:focus, a:active, :visited, :focus, :active, .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { - outline: 0; -} -a:hover, a:focus { - text-decoration: none -} -.navbar { - margin-bottom: 0 -} -.navbar-header { - background: #34495E; -} -.navbar-right { - margin-right: 0; -} -.top_nav .navbar-right { - margin: 0; - width: 70%; - float: right; -} -.top_nav .navbar-right li { - display: inline-block; - float: right; - position: static; -} -@media (min-width: 480px) { - .top_nav .navbar-right li { - position: relative; - } -} -.top_nav .dropdown-menu li { - width: 100%; -} -.top_nav .dropdown-menu li a { - width: 100%; - padding: 12px 20px; -} -.top_nav li a i { - font-size: 15px -} -.navbar-static-top { - position: fixed; - top: 0; - width: 100%; -} -.sidebar-header { - border-bottom: 0; - margin-top: 46px; -} -.sidebar-header:first-of-type { - margin-top: 0 -} -.nav.side-menu> li { - position: relative; - display: block; - cursor: pointer; -} -.nav.side-menu> li > a { - margin-bottom: 6px; -} -.nav.side-menu> li > a:hover { - color: #F2F5F7 !important; -} -.nav.side-menu>li>a:hover, .nav>li>a:focus { - text-decoration: none; - background: transparent; -} -.nav.child_menu { - display: none; -} -.nav.child_menu li:hover, -.nav.child_menu li.active { - background-color: rgba(255, 255, 255, 0.06); -} -.nav.child_menu li { - padding-left: 36px; -} -.nav-md ul.nav.child_menu li:before { - background: #425668; - bottom: auto; - content: ""; - height: 8px; - left: 23px; - margin-top: 15px; - position: absolute; - right: auto; - width: 8px; - z-index: 1; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} -.nav-md ul.nav.child_menu li:after { - border-left: 1px solid #425668; - bottom: 0; - content: ""; - left: 27px; - position: absolute; - top: 0; -} -.nav.side-menu>li>a, .nav.child_menu>li>a { - color: #E7E7E7; - font-weight: 500; -} -.nav.child_menu li li:hover, -.nav.child_menu li li.active { - background: none; -} -.nav.child_menu li li a:hover, -.nav.child_menu li li a.active { - color: #fff; -} -.nav>li>a { - position: relative; - display: block; - padding: 13px 15px 12px; -} -.nav.side-menu> li.current-page, .nav.side-menu> li.active { - border-right: 5px solid #1ABB9C; -} -.nav li.current-page { - background: rgba(255, 255, 255, 0.05); -} -.nav li li li.current-page { - background: none; -} -.nav li li.current-page a { - color: #fff; -} -.nav.side-menu> li.active > a { - text-shadow: rgba(0, 0, 0, 0.25) 0 -1px 0; - background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b6479), color-stop(100%, #4c5566)), #686e78; - background: -webkit-linear-gradient(#334556, #2C4257), #2A3F54; - background: -moz-linear-gradient(#334556, #2C4257), #2A3F54; - background: -o-linear-gradient(#334556, #2C4257), #2A3F54; - background: linear-gradient(#334556, #2C4257), #2A3F54; - -webkit-box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0; - -moz-box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0; - box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0; -} -.navbar-brand, .navbar-nav>li>a { - font-weight: 500; - color: #ECF0F1 !important; - margin-left: 0 !important; - line-height: 32px; -} -.site_title { - text-overflow: ellipsis; - overflow: hidden; - font-weight: 400; - font-size: 22px; - width: 100%; - color: #ECF0F1 !important; - margin-left: 0 !important; - line-height: 59px; - display: block; - height: 55px; - margin: 0; - padding-left: 10px; -} -.site_title:hover, .site_title:focus { - text-decoration: none -} -.nav.navbar-nav>li>a { - color: #515356 !important; -} -.nav.top_menu>li>a { - position: relative; - display: block; - padding: 10px 15px; - color: #34495E !important; -} -.nav>li>a:hover, .nav>li>a:focus { - background-color: transparent; -} -.top_search { - padding: 0; -} -.top_search .form-control { - border-right: 0; - box-shadow: inset 0 1px 0px rgba(0, 0, 0, 0.075); - border-radius: 25px 0px 0px 25px; - padding-left: 20px; - border: 1px solid rgba(221, 226, 232, 0.49); -} -.top_search .form-control:focus { - border: 1px solid rgba(221, 226, 232, 0.49); - border-right: 0; -} -.top_search .input-group-btn button { - border-radius: 0px 25px 25px 0px; - border: 1px solid rgba(221, 226, 232, 0.49); - border-left: 0; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - color: #93A2B2; - margin-bottom: 0 !important; -} -.toggle { - float: left; - margin: 0; - padding-top: 16px; - width: 70px; -} -.toggle a { - padding: 15px 15px 0; - margin: 0; - cursor: pointer; -} -.toggle a i { - font-size: 26px; -} -.nav.child_menu > li > a { - color: rgba(255, 255, 255, 0.75); - font-size: 12px; - padding: 9px; -} -.panel_toolbox { - float: right; - min-width: 70px; -} -.panel_toolbox>li { - float: left; - cursor: pointer; -} -.panel_toolbox>li>a { - padding: 5px; - color: #C5C7CB; - font-size: 14px; -} -.panel_toolbox>li>a:hover { - background: #F5F7FA; -} -.line_30 { - line-height: 30px; -} -.main_menu_side { - padding: 0; -} -.bs-docs-sidebar .nav>li>a { - display: block; - padding: 4px 6px; -} -footer { - background: #fff; - padding: 15px 20px; - display: block; -} -@media (min-width: 768px) { - footer { - margin-left: 230px; - } -} -.nav-sm footer { - margin-left: 70px ; -} -.tile-stats.sparkline { - padding: 10px; - text-align: center; -} -.jqstooltip { - background: #34495E !important; - width: 30px !important; - height: 22px !important; - text-decoration: none; -} -.tooltip { - display: block !important; -} -.tiles { - border-top: 1px solid #ccc; - margin-top: 15px; - padding-top: 5px; - margin-bottom: 0; -} -.tile { - overflow: hidden; -} -.top_tiles { - margin-bottom: 0; -} -.top_tiles .tile span {} -.top_tiles .tile h2 { - font-size: 30px; - line-height: 30px; - margin: 3px 0 7px; - font-weight: bold; -} -article.media { - width: 100%; -} - -/* ********* custom accordion **************************** */ - -*, *:before, *:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -#integration-list { - width: 100%; - margin: 0 auto; - display: table; -} -#integration-list ul { - padding: 0; - margin: 20px 0; - color: #555; -} -#integration-list ul > li { - list-style: none; - border-top: 1px solid #ddd; - display: block; - padding: 15px; - overflow: hidden; -} -#integration-list ul:last-child { - border-bottom: 1px solid #ddd; -} -#integration-list ul > li:hover { - background: #efefef; -} -.expand { - display: block; - text-decoration: none; - color: #555; - cursor: pointer; -} -.expand h2 { - width: 85%; - float: left; -} -h2 { - font-size: 18px; - font-weight: 400; -} -#left, #right { - display: table; -} -#sup { - display: table-cell; - vertical-align: middle; - width: 80%; -} -.detail a { - text-decoration: none; - color: #C0392B; - border: 1px solid #C0392B; - padding: 6px 10px 5px; - font-size: 13px; - margin-right: 7px; -} -.detail { - margin: 10px 0 10px 0px; - display: none; - line-height: 22px; - height: 150px; -} -.detail span { - margin: 0; -} -.right-arrow { - width: 10px; - float: right; - font-weight: bold; - font-size: 20px; -} -.accordion .panel { - margin-bottom: 5px; - border-radius: 0; - border-bottom: 1px solid #efefef; -} -.accordion .panel-heading { - background: #F2F5F7; - padding: 13px; - width: 100%; - display: block; -} -.accordion .panel:hover { - background: #F2F5F7; -} -.x_panel { - position: relative; - width: 100%; - margin-bottom: 10px; - padding: 10px 17px; - display: inline-block; - background: #fff; - border: 1px solid #E6E9ED; - -webkit-column-break-inside: avoid; - -moz-column-break-inside: avoid; - column-break-inside: avoid; - opacity: 1; - -moz-transition: all .2s ease; - -o-transition: all .2s ease; - -webkit-transition: all .2s ease; - -ms-transition: all .2s ease; - transition: all .2s ease; -} -.x_title { - border-bottom: 2px solid #E6E9ED; - padding: 1px 5px 6px; - margin-bottom: 10px; -} -.x_title .filter { - width: 40%; - float: right; -} -.x_title h2 { - margin: 5px 0 6px; - float: left; - display: block; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} -.x_title h2 small { - margin-left: 10px; -} -.x_title span { - color: #BDBDBD; -} -.x_content { - padding: 0 5px 6px; - position: relative; - width: 100%; - float: left; - clear: both; - margin-top: 5px; -} -.x_content h4 { - font-size: 16px; - font-weight: 500; -} -legend { - padding-bottom: 7px; -} -.demo-placeholder { - height: 280px; -} - -/** Contacts **/ -.profile_details:nth-child(3n){ - clear:both; -} - -.profile_details .profile_view { - display: inline-block; - padding: 10px 0 0; - background: #fff; -} - -.profile_details .profile_view .divider { - border-top: 1px solid #e5e5e5; - padding-top: 5px; - margin-top: 5px; -} - -.profile_details .profile_view .ratings { - margin-bottom: 0; -} - -.profile_details .profile_view .bottom { - background: #F2F5F7; - padding: 9px 0; - border-top: 1px solid #E6E9ED; -} - -.profile_details .profile_view .left { - margin-top: 20px; -} - -.profile_details .profile_view .left p { - margin-bottom: 3px; -} - -.profile_details .profile_view .right { - margin-top: 0px; - padding: 10px; -} - -.profile_details .profile_view .img-circle { - border: 1px solid #E6E9ED; - padding: 2px; -} - -.profile_details .profile_view h2 { - margin: 5px 0; -} - -.profile_details .profile_view .ratings { - text-align: left; - font-size: 16px; -} - -.profile_details .profile_view .brief { - margin: 0; - font-weight: 300; -} - -.profile_details .profile_left { - background: white; -} - -.pagination.pagination-split li { - display: inline-block; - margin-right: 3px; -} - -.pagination.pagination-split li a { - border-radius: 4px; - color: #768399; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} -/** Contacts **/ - - -/* ********* /custom accordion **************************** */ - - -/* ********* dashboard widget **************************** */ - -table.tile h3, table.tile h4, table.tile span { - font-weight: bold; - vertical-align: middle !important; -} -table.tile th, table.tile td { - text-align: center; -} -table.tile th { - border-bottom: 1px solid #E6ECEE; -} -table.tile td { - padding: 5px 0; -} -table.tile td ul { - text-align: left; - padding-left: 0 -} -table.tile td ul li { - list-style: none; - width: 100%; -} -table.tile td ul li a { - width: 100% -} -table.tile td ul li a big { - right: 0; - float: right; - margin-right: 13px; -} -table.tile_info { - width: 100%; -} -table.tile_info td { - text-align: left; - padding: 1px; - font-size: 15px -} -table.tile_info td p { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - margin: 0; - line-height: 28px; -} -table.tile_info td i { - margin-right: 8px; - font-size: 17px; - float: left; - width: 18px; - line-height: 28px -} -table.tile_info td:first-child { - width: 83%; -} -td span { - line-height: 28px; -} -.sidebar-widget { - overflow: hidden; -} -.error-number { - font-size: 90px; - line-height: 90px; - margin: 20px 0; -} -.col-middle { - margin-top: 5%; -} -.mid_center { - width: 370px; - margin: 0 auto; - text-align: center; - padding: 10px 20px; -} -h3.degrees { - font-size: 22px; - font-weight: 400; - text-align: center; -} -.degrees:after { - content: "o"; - position: relative; - top: -12px; - font-size: 13px; - font-weight: 300; -} -.daily-weather .day { - font-size: 14px; - border-top: 2px solid rgba(115, 135, 156, 0.36); - text-align: center; - border-bottom: 2px solid rgba(115, 135, 156, 0.36); - padding: 5px 0; -} -.weather-days .col-sm-2 { - overflow: hidden; - width: 16.66666667%; -} -.weather .row { - margin-bottom: 0 -} - -/* ********* tables styling ******************************* */ - -.bulk-actions { - display: none; -} -table.countries_list { - width: 100%; -} -table.countries_list td { - padding: 0 10px; - line-height: 30px; - border-top: 1px solid #eeeeee; -} -.dataTables_paginate a { - padding: 6px 9px !important; - background: #ddd !important; - border-color: #ddd !important; -} -.paging_full_numbers a.paginate_active { - background-color: rgba(38, 185, 154, 0.59) !important; - border-color: rgba(38, 185, 154, 0.59) !important; -} -button.DTTT_button, div.DTTT_button, a.DTTT_button { - border: 1px solid #E7E7E7 !important; - background: #E7E7E7 !important; - box-shadow: none !important; -} -table.jambo_table { - border: 1px solid rgba(221, 221, 221, 0.78); -} -table.jambo_table thead { - background: rgba(52, 73, 94, 0.94); - color: #ECF0F1; -} -table.jambo_table tbody tr:hover td { - background: rgba(38, 185, 154, 0.07); - border-top: 1px solid rgba(38, 185, 154, 0.11); - border-bottom: 1px solid rgba(38, 185, 154, 0.11); -} -table.jambo_table tbody tr.selected { - background: rgba(38, 185, 154, 0.16); -} -table.jambo_table tbody tr.selected td { - border-top: 1px solid rgba(38, 185, 154, 0.40); - border-bottom: 1px solid rgba(38, 185, 154, 0.40); -} -.dataTables_paginate a { - background: #ff0000; -} -.dataTables_wrapper { - position: relative; - clear: both; - zoom: 1; - /* Feeling sorry for IE */ -} -.dataTables_processing { - position: absolute; - top: 50%; - left: 50%; - width: 250px; - height: 30px; - margin-left: -125px; - margin-top: -15px; - padding: 14px 0 2px 0; - border: 1px solid #ddd; - text-align: center; - color: #999; - font-size: 14px; - background-color: white; -} -.dataTables_length { - width: 40%; - float: left; -} -.dataTables_filter { - width: 50%; - float: right; - text-align: right; -} -.dataTables_info { - width: 60%; - float: left; -} -.dataTables_paginate { - float: right; - text-align: right; -} -table.dataTable th.focus, -table.dataTable td.focus { - outline: 2px solid #1ABB9C !important; - outline-offset: -1px; -} - -/* Pagination nested */ - -.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { - height: 19px; - float: left; - cursor: pointer; - color: #111 !important; -} -.paginate_disabled_previous:hover, .paginate_enabled_previous:hover, .paginate_disabled_next:hover, .paginate_enabled_next:hover { - text-decoration: none !important; -} -.paginate_disabled_previous:active, .paginate_enabled_previous:active, .paginate_disabled_next:active, .paginate_enabled_next:active { - outline: none; -} -.paginate_disabled_previous, .paginate_disabled_next { - color: #666 !important; -} -.paginate_disabled_previous, .paginate_enabled_previous { - padding-left: 23px; -} -.paginate_disabled_next, .paginate_enabled_next { - padding-right: 23px; - margin-left: 10px; -} -.paginate_disabled_previous { - background: url('../images/back_disabled.png') no-repeat top left; -} -.paginate_enabled_previous { - background: url('../images/back_enabled.png') no-repeat top left; -} -.paginate_enabled_previous:hover { - background: url('../images/back_enabled_hover.png') no-repeat top left; -} -.paginate_disabled_next { - background: url('../images/forward_disabled.png') no-repeat top right; -} -.paginate_enabled_next { - background: url('../images/forward_enabled.png') no-repeat top right; -} -.paginate_enabled_next:hover { - background: url('../images/forward_enabled_hover.png') no-repeat top right; -} -table.display { - margin: 0 auto; - clear: both; - width: 100%; -} -table.display thead th { - padding: 8px 18px 8px 10px; - border-bottom: 1px solid black; - font-weight: bold; - cursor: pointer; -} -table.display tfoot th { - padding: 3px 18px 3px 10px; - border-top: 1px solid black; - font-weight: bold; -} -table.display tr.heading2 td { - border-bottom: 1px solid #aaa; -} -table.display td { - padding: 3px 10px; -} -table.display td.center { - text-align: center; -} -table.display thead th:active, table.display thead td:active { - outline: none; -} -.dataTables_scroll { - clear: both; -} -.dataTables_scrollBody { - *margin-top: -1px; - -webkit-overflow-scrolling: touch; -} -.top, .bottom {} -.top .dataTables_info { - float: none; -} -.clear { - clear: both; -} -.dataTables_empty { - text-align: center; -} -tfoot input { - margin: 0.5em 0; - width: 100%; - color: #444; -} -tfoot input.search_init { - color: #999; -} -td.group { - background-color: #d1cfd0; - border-bottom: 2px solid #A19B9E; - border-top: 2px solid #A19B9E; -} -td.details { - background-color: #d1cfd0; - border: 2px solid #A19B9E; -} -.example_alt_pagination div.dataTables_info { - width: 40%; -} -.paging_full_numbers { - width: 400px; - height: 22px; - line-height: 22px; -} -.paging_full_numbers a:active { - outline: none -} -.paging_full_numbers a:hover { - text-decoration: none; -} -.paging_full_numbers a.paginate_button, .paging_full_numbers a.paginate_active { - border: 1px solid #aaa; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - padding: 2px 5px; - margin: 0 3px; - cursor: pointer; -} -.paging_full_numbers a.paginate_button { - background-color: #ddd; -} -.paging_full_numbers a.paginate_button:hover { - background-color: #ccc; - text-decoration: none !important; -} -.paging_full_numbers a.paginate_active { - background-color: #99B3FF; -} -table.display tr.even.row_selected td { - background-color: #B0BED9; -} -table.display tr.odd.row_selected td { - background-color: #9FAFD1; -} -div.box { - height: 100px; - padding: 10px; - overflow: auto; - border: 1px solid #8080FF; - background-color: #E5E5FF; -} - -/* ********* /tables styleing ****************************** */ - - -/* ********* /dashboard widget **************************** */ - - -/* ********* widgets *************************************** */ - -ul.msg_list li { - background: #f7f7f7; - padding: 5px; - display: flex; - margin: 6px 6px 0; - width: 96% !important; -} -ul.msg_list li:last-child { - margin-bottom: 6px; - padding: 10px; -} -ul.msg_list li a { - padding: 3px 5px !important; -} -ul.msg_list li a .image img { - border-radius: 2px 2px 2px 2px; - -webkit-border-radius: 2px 2px 2px 2px; - float: left; - margin-right: 10px; - width: 11%; -} -ul.msg_list li a .time { - font-size: 11px; - font-style: italic; - font-weight: bold; - position: absolute; - right: 35px; -} -ul.msg_list li a .message { - display: block !important; - font-size: 11px; -} -.dropdown-menu.msg_list span { - white-space: normal; -} -.dropdown-menu { - border: medium none; - box-shadow: none; - display: none; - float: left; - font-size: 12px; - left: 0; - list-style: none outside none; - padding: 0; - position: absolute; - text-shadow: none; - top: 100%; - z-index: 1000; - border: 1px solid #D9DEE4; - border-top-left-radius: 0; - border-top-right-radius: 0; - -} -.dropdown-menu>li>a { - color: #5A738E; -} -.navbar-nav .open .dropdown-menu { - position: absolute; - background: #fff; - margin-top: 0; - border: 1px solid #D9DEE4; - -webkit-box-shadow: none; - right: 0; - left: auto; - width: 220px; -} -.navbar-nav .open .dropdown-menu.msg_list { - width: 300px; -} -.info-number .badge { - font-size: 10px; - font-weight: normal; - line-height: 13px; - padding: 2px 6px; - position: absolute; - right: 2px; - top: 8px; -} -ul.to_do { - padding: 0; -} -ul.to_do li { - background: #f3f3f3; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - position: relative; - padding: 7px; - margin-bottom: 5px; - list-style: none; -} -ul.to_do p { - margin: 0; -} -.dashboard-widget { - background: #f6f6f6; - border-top: 5px solid #79C3DF; - border-radius: 3px; - padding: 5px 10px 10px; -} -.dashboard-widget .dashboard-widget-title { - font-weight: normal; - border-bottom: 1px solid #c1cdcd; - margin: 0 0 10px 0; - padding-bottom: 5px; - padding-left: 40px; - line-height: 30px; -} -.dashboard-widget .dashboard-widget-title i { - font-size: 100%; - margin-left: -35px; - margin-right: 10px; - color: #33a1c9; - padding: 3px 6px; - border: 1px solid #abd9ea; - border-radius: 5px; - background: #fff; -} -ul.quick-list { - width: 45%; - padding-left: 0; - display: inline-block; -} -ul.quick-list li { - padding-left: 10px; - list-style: none; - margin: 0; - padding-bottom: 6px; - padding-top: 4px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} -ul.quick-list li i { - padding-right: 10px; - color: #757679; -} -.dashboard-widget-content { - padding-top: 9px; -} -.dashboard-widget-content .sidebar-widget { - width: 50%; - display: inline-block; - vertical-align: top; - background: #fff; - border: 1px solid #abd9ea; - border-radius: 5px; - text-align: center; - float: right; - padding: 2px; - margin-top: 10px; -} -.widget_summary { - width: 100%; - display: inline-flex; -} -.widget_summary .w_left { - float: left; - text-align: left; -} -.widget_summary .w_center { - float: left; -} -.widget_summary .w_right { - float: left; - text-align: right; -} -.widget_summary .w_right span { - font-size: 20px; -} -.w_20 { - width: 20% -} -.w_25 { - width: 25% -} -.w_55 { - width: 55% -} -h5.graph_title { - text-align: left; - margin-left: 10px -} -h5.graph_title i { - margin-right: 10px; - font-size: 17px -} -span.right { - float: right; - font-size: 14px !important -} -.tile_info a { - text-overflow: ellipsis; -} -.sidebar-footer { - bottom: 0px; - clear: both; - display: block; - padding: 5px 0 0 0; - position: fixed; - width: 230px; - z-index: 1000; - background: #2A3F54; -} -.sidebar-footer a { - padding: 7px 0 3px; - text-align: center; - width: 25%; - font-size: 17px; - display: block; - float: left; - background: #172D44; -} -.sidebar-footer a:hover { - background: #425567; -} - -/** top tiles */ -.tile_count { - margin-bottom: 20px; - margin-top: 20px; -} -.tile_count .tile_stats_count { - border-bottom: 1px solid #D9DEE4; - padding: 0 10px 0 20px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - position: relative; -} -@media (min-width: 992px) { - .tile_count .tile_stats_count { - margin-bottom: 10px; - border-bottom: 0; - padding-bottom: 10px; - } -} -.tile_count .tile_stats_count:before { - content:""; - position: absolute; - left: 0; - height: 65px; - border-left: 2px solid #ADB2B5; - margin-top: 10px; -} -@media (min-width:992px) { - .tile_count .tile_stats_count:first-child:before { - border-left: 0; - } -} -.tile_count .tile_stats_count .count { - font-size: 30px; - line-height: 47px; - font-weight: 600; -} -@media (min-width:768px) { - .tile_count .tile_stats_count .count { - font-size: 40px; - } -} -@media (min-width: 992px) and (max-width: 1100px) { - .tile_count .tile_stats_count .count { - font-size: 30px; - } -} -.tile_count .tile_stats_count span { - font-size: 12px; -} -@media (min-width:768px) { - .tile_count .tile_stats_count span { - font-size: 13px; - } -} -.tile_count .tile_stats_count .count_bottom i { - width: 12px; -} -/** /top tiles **/ - -.dashboard_graph { - background: #fff; - padding: 7px 10px; -} -.dashboard_graph .col-md-9, .dashboard_graph .col-md-3 { - padding: 0; -} -a.user-profile { - color: #5E6974 !important; -} -.user-profile img { - width: 29px; - height: 29px; - border-radius: 50%; - margin-right: 10px; -} -ul.top_profiles { - height: 330px; - width: 100%; -} -ul.top_profiles li { - margin: 0; - padding: 3px 5px; -} -ul.top_profiles li:nth-child(odd) { - background-color: #eee; -} -.media .profile_thumb { - border: 1px solid; - width: 50px; - height: 50px; - margin: 5px 10px 5px 0; - border-radius: 50%; - padding: 9px 12px; -} -.media .profile_thumb i { - font-size: 30px; -} -.media .date { - background: #ccc; - width: 52px; - margin-right: 10px; - border-radius: 10px; - padding: 5px; -} -.media .date .month { - margin: 0; - text-align: center; - color: #fff; -} -.media .date .day { - text-align: center; - color: #fff; - font-size: 27px; - margin: 0; - line-height: 27px; - font-weight: bold; -} -.event .media-body a.title { - font-weight: bold; -} -.event .media-body p { - margin-bottom: 0; -} -h4.graph_title { - margin: 7px; - text-align: center; -} - -/* ********* /widgets *************************************** */ - - -/* ********* iconts-display **************************** */ - -.fontawesome-icon-list .fa-hover a:hover { - background-color: #ddd; - color: #fff; - text-decoration: none; -} -.fontawesome-icon-list .fa-hover a { - display: block; - line-height: 32px; - height: 32px; - padding-left: 10px; - border-radius: 4px; -} -.fontawesome-icon-list .fa-hover a:hover .fa { - font-size: 28px; - vertical-align: -6px; -} -.fontawesome-icon-list .fa-hover a .fa { - width: 32px; - font-size: 16px; - display: inline-block; - text-align: right; - margin-right: 10px; -} -.main_menu .fa { - width: 26px; - opacity: .99; - display: inline-block; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - font-size: 18px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* ********* /iconts-display **************************** */ - - -/** tile stats **/ -.tile-stats { - position: relative; - display: block; - margin-bottom: 12px; - border: 1px solid #E4E4E4; - -webkit-border-radius: 5px; - overflow: hidden; - padding-bottom: 5px; - -webkit-background-clip: padding-box; - -moz-border-radius: 5px; - -moz-background-clip: padding; - border-radius: 5px; - background-clip: padding-box; - background: #FFF; - -moz-transition: all 300ms ease-in-out; - -o-transition: all 300ms ease-in-out; - -webkit-transition: all 300ms ease-in-out; - transition: all 300ms ease-in-out; -} - -.tile-stats:hover .icon i { - animation-name: tansformAnimation; - animation-duration: .5s; - animation-iteration-count: 1; - color: rgba(58, 58, 58, 0.41); - animation-timing-function: ease; - animation-fill-mode: forwards; - -webkit-animation-name: tansformAnimation; - -webkit-animation-duration: .5s; - -webkit-animation-iteration-count: 1; - -webkit-animation-timing-function: ease; - -webkit-animation-fill-mode: forwards; - -moz-animation-name: tansformAnimation; - -moz-animation-duration: .5s; - -moz-animation-iteration-count: 1; - -moz-animation-timing-function: ease; - -moz-animation-fill-mode: forwards; -} - -.tile-stats .icon { - width: 20px; - height: 20px; - color: #BAB8B8; - position: absolute; - right: 53px; - top: 22px; - z-index: 1; -} - -.tile-stats .icon i { - margin: 0; - font-size: 60px; - line-height: 0; - vertical-align: bottom; - padding: 0; -} - -.tile-stats .count { - font-size: 38px; - font-weight: bold; - line-height: 1.65857143 -} - -.tile-stats .count, .tile-stats h3, .tile-stats p { - position: relative; - margin: 0; - margin-left: 10px; - z-index: 5; - padding: 0; -} - -.tile-stats h3 { - color: #BAB8B8; -} - -.tile-stats p { - margin-top: 5px; - font-size: 12px; -} - -.tile-stats > .dash-box-footer { - position: relative; - text-align: center; - margin-top: 5px; - padding: 3px 0; - color: #fff; - color: rgba(255, 255, 255, 0.8); - display: block; - z-index: 10; - background: rgba(0, 0, 0, 0.1); - text-decoration: none; -} - -.tile-stats > .dash-box-footer:hover { - color: #fff; - background: rgba(0, 0, 0, 0.15); -} - -.tile-stats > .dash-box-footer:hover { - color: #fff; - background: rgba(0, 0, 0, 0.15); -} - -table.tile_info { - padding: 10px 15px; -} - -table.tile_info span.right { - margin-right: 0; - float: right; - position: absolute; - right: 4%; -} - -.tile:hover { - text-decoration: none; -} - -.tile_header { - border-bottom: transparent; - padding: 7px 15px; - margin-bottom: 15px; - background: #E7E7E7; -} - -.tile_head h4 { - margin-top: 0; - margin-bottom: 5px; -} - -.tiles-bottom { - padding: 5px 10px; - margin-top: 10px; - background: rgba(194, 194, 194, 0.3); - text-align: left; -} - - -/** /tile stats **/ - -/** inbox **/ -a.star { - color: #428bca !important -} - -.mail_content { - background: none repeat scroll 0 0 #FFFFFF; - border-radius: 4px; - margin-top: 20px; - min-height: 500px; - padding: 10px 11px; - width: 100%; -} - -.list-btn-mail { - margin-bottom: 15px; -} - -.list-btn-mail.active { - border-bottom: 1px solid #39B3D7; - padding: 0 0 14px; -} - -.list-btn-mail > i { - float: left; - font-size: 18px; - font-style: normal; - width: 33px; -} - -.list-btn-mail > .cn { - background: none repeat scroll 0 0 #39B3D7; - border-radius: 12px; - color: #FFFFFF; - float: right; - font-style: normal; - padding: 0 5px; -} - -.button-mail { - margin: 0 0 15px !important; - text-align: left; - width: 100%; -} - -.buttons, button, .btn { - margin-bottom: 5px; - margin-right: 5px; -} - -.btn-group-vertical .btn, .btn-group .btn { - margin-bottom: 0; - margin-right: 0; -} - -.mail_list_column { - border-left: 1px solid #DBDBDB; -} - -.mail_view { - border-left: 1px solid #DBDBDB -} - -.mail_list { - width: 100%; - border-bottom: 1px solid #DBDBDB; - margin-bottom: 2px; - display: inline-block; -} - -.mail_list .left { - width: 5%; - float: left; - margin-right: 3% -} - -.mail_list .right { - width: 90%; - float: left -} - -.mail_list h3 { - font-size: 15px; - font-weight: bold; - margin: 0px 0 6px; -} - -.mail_list h3 small { - float: right; - color: #ADABAB; - font-size: 11px; - line-height: 20px; -} - -.mail_list .badge { - padding: 3px 6px; - font-size: 8px; - background: #BAB7B7 -} - -@media (max-width: 767px) { - .mail_list { - margin-bottom: 5px; - display: inline-block; - } -} - -.mail_heading h4 { - font-size: 18px; - border-bottom: 1px solid #ddd; - padding-bottom: 10px; - margin-top: 20px; -} - -.attachment { - margin-top: 30px; -} - -.attachment ul { - width: 100%; - list-style: none; - padding-left: 0; - display: inline-block; - margin-bottom: 30px; -} - -.attachment ul li { - float: left; - width: 150px; - margin-right: 10px; - margin-bottom: 10px; -} - -.attachment ul li img { - height: 150px; - border: 1px solid #ddd; - padding: 5px; - margin-bottom: 10px; -} - -.attachment ul li span { - float: right; -} - -.attachment .file-name { - float: left; -} - -.attachment .links { - width: 100%; - display: inline-block; -} - -.compose { - padding: 0; - position: fixed; - bottom: 0; - right: 0; - background: #fff; - border: 1px solid #D9DEE4; - border-right: 0; - border-bottom: 0; - border-top-left-radius: 5px; - z-index: 9999; - display: none; -} - -.compose .compose-header { - padding: 5px; - background: #169F85; - color: #fff; - border-top-left-radius: 5px; -} - -.compose .compose-header .close { - text-shadow: 0 1px 0 #ffffff; - line-height: .8; -} - -.compose .compose-body .editor.btn-toolbar { - margin: 0; -} - -.compose .compose-body .editor-wrapper { - height: 100%; - min-height: 50px; - max-height: 180px; - border-radius: 0; - border-left: none; - border-right: none; - overflow: auto; -} - -.compose .compose-footer { - padding: 10px; -} -/** /inbox **/ - -/* ********* form design **************************** */ - -.editor.btn-toolbar { - zoom: 1; - background: #F7F7F7; - margin: 5px 2px; - padding: 3px 0; - border: 1px solid #EFEFEF; -} -.input-group { - margin-bottom: 10px; -} -.ln_solid { - border-top: 1px solid #e5e5e5; - color: #ffffff; - background-color: #ffffff; - height: 1px; - margin: 20px 0; -} -span.section { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -.form-control { - border-radius: 0; - width: 100%; -} -.form-horizontal .control-label { - padding-top: 8px -} -.form-control:focus { - border-color: #CCD0D7; - box-shadow: none !important; -} -legend { - font-size: 18px; - color: inherit; -} -.checkbox {} -.form-horizontal .form-group { - margin-right: 0; - margin-left: 0; -} -.form-control-feedback { - margin-top: 8px; - height: 23px; - color: #bbb; - line-height: 24px; - font-size: 15px; -} -.form-control-feedback.left { - border-right: 1px solid #ccc; - left: 13px; -} -.form-control-feedback.right { - border-left: 1px solid #ccc; - right: 13px; -} -.form-control.has-feedback-left { - padding-left: 45px; -} -.form-control.has-feedback-right { - padding-right: 45px; -} -.form-group { - margin-bottom: 10px; -} -.validate { - margin-top: 10px; -} -.invalid-form-error-message { - margin-top: 10px; - padding: 5px; -} -.invalid-form-error-message.filled { - border-left: 2px solid #E74C3C; -} -p.parsley-success { - color: #468847; - background-color: #DFF0D8; - border: 1px solid #D6E9C6; -} -p.parsley-error { - color: #B94A48; - background-color: #F2DEDE; - border: 1px solid #EED3D7; -} -ul.parsley-errors-list { - list-style: none; - color: #E74C3C; - padding-left: 0; -} -input.parsley-error, textarea.parsley-error, select.parsley-error { - background: #FAEDEC; - border: 1px solid #E85445; -} -.btn-group .parsley-errors-list { - display: none; -} -.bad input, .bad select, .bad textarea { - border: 1px solid #CE5454; - box-shadow: 0 0 4px -2px #CE5454; - position: relative; - left: 0; - -moz-animation: .7s 1 shake linear; - -webkit-animation: 0.7s 1 shake linear; -} -.item input, .item textarea { - -webkit-transition: 0.42s; - -moz-transition: 0.42s; - transition: 0.42s; -} - -/* alerts (when validation fails) */ - -.item .alert { - float: left; - margin: 0 0 0 20px; - padding: 3px 10px; - color: #FFF; - border-radius: 3px 4px 4px 3px; - background-color: #CE5454; - max-width: 170px; - white-space: pre; - position: relative; - left: -15px; - opacity: 0; - z-index: 1; - transition: 0.15s ease-out; -} -.item .alert::after { - content: ''; - display: block; - height: 0; - width: 0; - border-color: transparent #CE5454 transparent transparent; - border-style: solid; - border-width: 11px 7px; - position: absolute; - left: -13px; - top: 1px; -} -.item.bad .alert { - left: 0; - opacity: 1; -} - -.inl-bl { - display: inline-block; -} -.well .markup-heading {} -.well .markup { - background: #fff; - color: #777; - position: relative; - padding: 45px 15px 15px; - margin: 15px 0 0 0; - background-color: #fff; - border-radius: 0 0 4px 4px; - box-shadow: none; -} -.well .markup::after { - content: "Example"; - position: absolute; - top: 15px; - left: 15px; - font-size: 12px; - font-weight: bold; - color: #bbb; - text-transform: uppercase; - letter-spacing: 1px; -} - -/* ***** autocomplete ***** */ - -.autocomplete-suggestions { - border: 1px solid #e4e4e4; - background: #F4F4F4; - cursor: default; - overflow: auto; -} -.autocomplete-suggestion { - padding: 2px 5px; - font-size: 1.2em; - white-space: nowrap; - overflow: hidden; -} -.autocomplete-selected { - background: #f0f0f0; -} -.autocomplete-suggestions strong { - font-weight: normal; - color: #3399ff; - font-weight: bolder; -} -/* ***** /autocomplete *****/ - -/* ***** buttons ********/ -.btn { - border-radius: 3px; -} -a.btn-success, a.btn-primary, a.btn-warning, a.btn-danger { - color: #fff; -} -.btn-success { - background: #26B99A; - border: 1px solid #169F85; -} -.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { - background: #169F85; -} -.btn-dark { - color: #E9EDEF; - background-color: #4B5F71; - border-color: #364B5F; -} -.btn-dark:hover, .btn-dark:focus, .btn-dark:active, .btn-dark.active, .open .dropdown-toggle.btn-dark { - color: #FFFFFF; - background-color: #394D5F; - border-color: #394D5F; -} -.btn-round { - border-radius: 30px; -} -.btn.btn-app { - position: relative; - padding: 15px 5px; - margin: 0 0 10px 10px; - min-width: 80px; - height: 60px; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - text-align: center; - color: #666; - border: 1px solid #ddd; - background-color: #fafafa; - font-size: 12px; -} -.btn.btn-app > .fa, .btn.btn-app > .glyphicon, .btn.btn-app > .ion { - font-size: 20px; - display: block; -} -.btn.btn-app:hover { - background: #f4f4f4; - color: #444; - border-color: #aaa; -} -.btn.btn-app:active, .btn.btn-app:focus { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn.btn-app > .badge { - position: absolute; - top: -3px; - right: -10px; - font-size: 10px; - font-weight: 400; -} -/* ***** /buttons *******/ - -/* ********* /form design **************************** */ - -/* ********* form textarea **************************** */ - -textarea { - padding: 10px; - vertical-align: top; - width: 200px; -} -textarea:focus { - outline-style: solid; - outline-width: 2px; -} -.btn_ { - display: inline-block; - padding: 3px 9px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - 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; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - 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); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - border: 1px solid #cccccc; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); -} - -/* ********* /form textarea **************************** */ - - -/* ********* glyphicons **************************** */ - -.bs-glyphicons { - margin: 0 -10px 20px; - overflow: hidden -} -.bs-glyphicons-list { - padding-left: 0; - list-style: none -} -.bs-glyphicons li { - float: left; - width: 25%; - height: 115px; - padding: 10px; - font-size: 10px; - line-height: 1.4; - text-align: center; - background-color: #f9f9f9; - border: 1px solid #fff -} -.bs-glyphicons .glyphicon { - margin-top: 5px; - margin-bottom: 10px; - font-size: 24px -} -.bs-glyphicons .glyphicon-class { - display: block; - text-align: center; - word-wrap: break-word -} -.bs-glyphicons li:hover { - color: #fff; - background-color: #1ABB9C -} -@media (min-width: 768px) { - .bs-glyphicons { - margin-right: 0; - margin-left: 0 - } - .bs-glyphicons li { - width: 12.5%; - font-size: 12px - } -} - -/* ********* /glyphicons **************************** */ - - -/* ********* form tags input **************************** */ - -.tagsinput { - border: 1px solid #CCC; - background: #FFF; - padding: 6px 6px 0; - width: 300px; - overflow-y: auto; -} -span.tag { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - display: block; - float: left; - padding: 5px 9px; - text-decoration: none; - background: #1ABB9C; - color: #F1F6F7; - margin-right: 5px; - font-weight: 500; - margin-bottom: 5px; - font-family: helvetica; -} -span.tag a { - color: #F1F6F7 !important; -} -.tagsinput span.tag a { - font-weight: bold; - color: #82ad2b; - text-decoration: none; - font-size: 11px; -} -.tagsinput input { - width: 80px; - margin: 0px; - font-family: helvetica; - font-size: 13px; - border: 1px solid transparent; - padding: 3px; - background: transparent; - color: #000; - outline: 0px; -} -.tagsinput div { - display: block; - float: left; -} -.tags_clear { - clear: both; - width: 100%; - height: 0px; -} -.not_valid { - background: #FBD8DB !important; - color: #90111A !important; -} - -/* ********* /form tags input **************************** */ - - -/** Tabs **/ -ul.bar_tabs { - overflow: visible; - background: #F5F7FA; - height: 25px; - margin: 21px 0 14px; - padding-left: 14px; - position: relative; - z-index: 1; - width: 100%; - border-bottom: 1px solid #E6E9ED; -} -ul.bar_tabs > li { - border: 1px solid #E6E9ED; - color: #333 !important; - margin-top: -17px; - margin-left: 8px; - background: #fff; - border-bottom: none; - border-radius: 4px 4px 0 0; -} -ul.bar_tabs > li.active { - border-right: 6px solid #D3D6DA; - border-top: 0; - margin-top: -15px; -} -ul.bar_tabs > li a { - padding: 10px 17px; - background: #F5F7FA; - margin: 0; - border-top-right-radius: 0; -} -ul.bar_tabs > li a:hover { - border: 1px solid transparent; -} -ul.bar_tabs > li.active a { - border-bottom: none; -} -ul.bar_tabs.right { - padding-right: 14px; -} -ul.bar_tabs.right li { - float: right -} -a:focus { - outline: none; -} -/** /Tabs **/ - - -/* ********* timeline **************************** */ - -ul.timeline li { - position: relative; - border-bottom: 1px solid #e8e8e8; - clear: both; -} -.timeline .block { - margin: 0; - border-left: 3px solid #e8e8e8; - overflow: visible; - padding: 10px 15px; - margin-left: 105px; -} -.timeline.widget { - min-width: 0; - max-width: inherit; -} -.timeline.widget .block { - margin-left: 5px; -} -.timeline .tags { - position: absolute; - top: 15px; - left: 0; - width: 84px; -} -.timeline .tag { - display: block; - height: 30px; - font-size: 13px; - padding: 8px; -} -.timeline .tag span { - display: block; - overflow: hidden; - width: 100%; - white-space: nowrap; - text-overflow: ellipsis; -} -.tag { - line-height: 1; - background: #1ABB9C; - color: #fff !important; -} -.tag:after { - content: " "; - height: 30px; - width: 0; - position: absolute; - left: 100%; - top: 0; - margin: 0; - pointer-events: none; - border-top: 14px solid transparent; - border-bottom: 14px solid transparent; - border-left: 11px solid #1ABB9C; -} -.timeline h2.title { - position: relative; - font-size: 16px; - margin: 0; -} -.timeline h2.title:before { - content: ""; - position: absolute; - left: -23px; - top: 3px; - display: block; - width: 14px; - height: 14px; - border: 3px solid #d2d3d2; - border-radius: 14px; - background: #f9f9f9; -} -.timeline .byline { - padding: .25em 0; -} -.byline { - -webkit-font-smoothing: antialiased; - font-style: italic; - font-size: .9375em; - line-height: 1.3; - color: #aab6aa; -} -ul.social li { - border: 0; -} - -/* ********* /timeline **************************** */ - -/* ********* profile/social **************************** */ - -.social-sidebar, .social-body { - float: right; -} -.social-sidebar { - background: #EDEDED; - width: 22%; -} -.social-body { - border: 1px solid #ccc; - width: 78%; -} -.thumb img { - width: 50px; - height: 50px; - border-radius: 50%; -} -.chat .thumb img { - width: 27px; - height: 27px; - border-radius: 50%; -} -.chat .status { - float: left; - margin: 16px 0 0 -16px; - font-size: 14px; - font-weight: bold; - width: 12px; - height: 12px; - display: block; - border: 2px solid #FFF; - z-index: 12312; - border-radius: 50%; -} -.chat .status.online { - background: #1ABB9C; -} -.chat .status.away { - background: #F39C12; -} -.chat .status.offline { - background: #ccc; -} -.chat .media-body { - padding-top: 5px; -} - -/* ********* /profile/social **************************** */ - - -/* ********* widgets **************************** */ - -.dashboard_graph .x_title { - padding: 5px 5px 7px; -} -.dashboard_graph .x_title h3 { - margin: 0; - font-weight: normal; -} -.chart { - position: relative; - display: inline-block; - width: 110px; - height: 110px; - margin-top: 5px; - margin-bottom: 5px; - text-align: center; -} -.chart canvas { - position: absolute; - top: 0; - left: 0; -} -.percent { - display: inline-block; - line-height: 110px; - z-index: 2; - font-size: 18px; -} -.percent:after { - content: '%'; - margin-left: 0.1em; - font-size: .8em; -} -.angular { - margin-top: 100px; -} -.angular .chart { - margin-top: 0; -} -.widget { - min-width: 250px; - max-width: 310px; -} -.widget_tally_box .btn-group button { - text-align: center -} -.widget_tally_box .btn-group button { - color: inherit; - font-weight: 500; - background-color: #f5f5f5; - border: 1px solid #e7e7e7; -} -ul.widget_tally, ul.widget_tally li { - width: 100%; -} -ul.widget_tally li { - padding: 2px 10px; - border-bottom: 1px solid #ECECEC; - padding-bottom: 4px; -} -ul.widget_tally .month { - width: 70%; - float: left; -} -ul.widget_tally .count { - width: 30%; - float: left; - text-align: right -} -.pie_bg { - border-bottom: 1px solid rgba(101, 204, 182, 0.16); - padding-bottom: 15px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - padding-bottom: 10px; - -webkit-box-shadow: 0 4px 6px -6px #222; - -moz-box-shadow: 0 4px 6px -6px #222; - box-shadow: 0 4px 6px -6px #222; -} -.widget_tally_box .flex { - display: flex; -} -ul.widget_profile_box { - width: 100%; - height: 42px; - padding: 3px; - background: #ececec; - margin-top: 40px; - margin-left: 1px; -} -ul.widget_profile_box li:first-child { - width: 25%; - float: left; -} -ul.widget_profile_box li:first-child a { - float: left; -} -ul.widget_profile_box li:last-child { - width: 25%; - float: right; -} -ul.widget_profile_box li:last-child a { - float: right; -} -ul.widget_profile_box li {} -ul.widget_profile_box li a { - font-size: 22px; - text-align: center; - width: 35px; - height: 35px; - border: 1px solid rgba(52, 73, 94, 0.44); - display: block; - border-radius: 50%; - padding: 0px; -} -ul.widget_profile_box li a:hover { - color: #1ABB9C !important; - border: 1px solid rgba(38, 185, 154, 1); -} -ul.widget_profile_box li .profile_img { - width: 85px; - height: 85px; - margin: 0; - margin-top: -28px; -} -.widget_tally_box p, .widget_tally_box span { - text-align: center; -} -.widget_tally_box .name { - text-align: center; - margin: 25px; -} -.widget_tally_box .name_title { - text-align: center; - margin: 5px; -} -.widget_tally_box ul.legend { - margin: 0; -} -.widget_tally_box ul.legend p, .widget_tally_box ul.legend span { - text-align: left; -} -.widget_tally_box ul.legend li .icon { - font-size: 20px; - float: left; - width: 14px; -} -.widget_tally_box ul.legend li .name { - font-size: 14px; - margin: 5px 0 0 14px; - text-overflow: ellipsis; - float: left; -} -.widget_tally_box ul.legend p { - display: inline-block; - margin: 0; -} -.widget_tally_box ul.verticle_bars li { - height: 140px; - width: 23%; -} -.widget .verticle_bars li .progress.vertical.progress_wide { - width: 65%; -} -ul.count2 { - width: 100%; - margin-left: 1px; - border: 1px solid #ddd; - border-left: 0; - border-right: 0; - padding: 10px 0; -} -ul.count2 li { - width: 30%; - text-align: center; -} -ul.count2 li h3 { - font-weight: 400; - margin: 0; -} -ul.count2 li span { - font-weight: 300; -} -/* ********* /widgets **************************** */ - -.divider { - border-bottom: 1px solid #ddd; - margin: 10px; -} -.divider-dashed { - border-top: 1px dashed #e7eaec; - background-color: #ffffff; - height: 1px; - margin: 10px 0; -} -ul.messages { - padding: 0; -} -ul.messages li, .tasks li { - border-bottom: 1px dotted #e6e6e6; - padding: 8px 0; -} -ul.messages li img.avatar, img.avatar { - height: 32px; - width: 32px; - float: left; - display: inline-block; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - padding: 2px; - background: #f7f7f7; - border: 1px solid #e6e6e6; -} -ul.messages li .message_date { - float: right; - text-align: right; -} -ul.messages li .message_wrapper { - margin-left: 50px; - margin-right: 40px; -} -ul.messages li .message_wrapper h4.heading { - font-weight: 600; - margin: 0; - cursor: pointer; - margin-bottom: 10px; - line-height: 100%; -} -ul.messages li .message_wrapper blockquote { - padding: 0px 10px; - margin: 0; - border-left: 5px solid #eee; -} -ul.user_data li { - margin-bottom: 6px; -} -ul.user_data li p { - margin-bottom: 0; -} -ul.user_data li .progress { - width: 90%; -} -.project_progress .progress { - margin-bottom: 3px !important; - margin-top: 5px; -} -.projects .list-inline { - margin: 0; -} -.profile_title { - background: #F5F7FA; - border: 0; - padding: 7px 0; - display: flex; -} -ul.stats-overview { - border-bottom: 1px solid #e8e8e8; - padding-bottom: 10px; - margin-bottom: 10px; -} -ul.stats-overview li { - display: inline-block; - text-align: center; - padding: 0 15px; - width: 30%; - font-size: 14px; - border-right: 1px solid #e8e8e8; -} -ul.stats-overview li:last-child { - border-right: 0; -} -ul.stats-overview li .name { - font-size: 12px; -} -ul.stats-overview li .value { - font-size: 14px; - font-weight: bold; - display: block; -} -ul.stats-overview li:first-child { - padding-left: 0; -} -ul.project_files li { - margin-bottom: 5px; -} -ul.project_files li a i { - width: 20px; -} -.project_detail p { - margin-bottom: 10px; -} -.project_detail p.title { - font-weight: bold; - margin-bottom: 0 -} -.avatar img { - border-radius: 50%; - max-width: 45px; -} - -/* ********* pricing **************************** */ - -.pricing { - background: #fff; -} -.pricing .title { - background: #1ABB9C; - height: 110px; - color: #fff; - padding: 15px 0 0; - text-align: center; -} -.pricing .title h2 { - text-transform: capitalize; - font-size: 18px; - border-radius: 5px 5px 0 0; - margin: 0; - font-weight: 400; -} -.pricing .title h1 { - font-size: 30px; - margin: 12px; -} -.pricing .title span { - background: rgba(51, 51, 51, 0.28); - padding: 2px 5px; -} -.pricing_features { - background: #FAFAFA; - padding: 20px 15px; - min-height: 230px; - font-size: 13.5px; -} -.pricing_features ul li { - margin-top: 10px; -} -.pricing_footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - text-align: center; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.pricing_footer p { - font-size: 13px; - padding: 10px 0 2px; - display: block; -} -.ui-ribbon-container { - position: relative; -} -.ui-ribbon-container .ui-ribbon-wrapper { - position: absolute; - overflow: hidden; - width: 85px; - height: 88px; - top: -3px; - right: -3px; -} -.ui-ribbon-container.ui-ribbon-primary .ui-ribbon { - background-color: #5b90bf; -} -.ui-ribbon-container .ui-ribbon { - position: relative; - display: block; - text-align: center; - font-size: 15px; - font-weight: 700; - color: #fff; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - padding: 7px 0; - left: -5px; - top: 15px; - width: 120px; - line-height: 20px; - background-color: #555; - box-shadow: 0 0 3px rgba(0, 0, 0, .3); -} -.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after, .ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before { - border-top: 2px solid #5b90bf; -} -.ui-ribbon-container .ui-ribbon:before { - left: 0; - bottom: -1px; -} -.ui-ribbon-container .ui-ribbon:before { - right: 0; -} -.ui-ribbon-container .ui-ribbon:after, .ui-ribbon-container .ui-ribbon:before { - position: absolute; - content: " "; - line-height: 0; - border-top: 2px solid #555; - border-left: 2px solid transparent; - border-right: 2px solid transparent; -} - -/* ********* /pricing **************************** */ - - -/* ********* media gallery **************************** */ - -.thumbnail .image { - height: 120px; - overflow: hidden; -} -.caption { - padding: 9px 5px; - background: #F7F7F7; -} -.caption p { - margin-bottom: 5px; -} -.thumbnail { - height: 190px; - overflow: hidden; -} -.view { - overflow: hidden; - position: relative; - text-align: center; - box-shadow: 1px 1px 2px #e6e6e6; - cursor: default; -} -.view .mask, .view .content { - position: absolute; - width: 100%; - overflow: hidden; - top: 0; - left: 0 -} -.view img { - display: block; - position: relative -} -.view .tools { - text-transform: uppercase; - color: #fff; - text-align: center; - position: relative; - font-size: 17px; - padding: 3px; - background: rgba(0, 0, 0, 0.35); - margin: 43px 0 0 0; -} -.mask.no-caption .tools { - margin: 90px 0 0 0; -} -.view .tools a { - display: inline-block; - color: #FFF; - font-size: 18px; - font-weight: 400; - padding: 0 4px; -} -.view p { - font-family: Georgia, serif; - font-style: italic; - font-size: 12px; - position: relative; - color: #fff; - padding: 10px 20px 20px; - text-align: center -} -.view a.info { - display: inline-block; - text-decoration: none; - padding: 7px 14px; - background: #000; - color: #fff; - text-transform: uppercase; - box-shadow: 0 0 1px #000 -} -.view-first img { - transition: all 0.2s linear; -} -.view-first .mask { - opacity: 0; - background-color: rgba(0, 0, 0, 0.5); - transition: all 0.4s ease-in-out; -} -.view-first .tools { - transform: translateY(-100px); - opacity: 0; - transition: all 0.2s ease-in-out; -} -.view-first p { - transform: translateY(100px); - opacity: 0; - transition: all 0.2s linear; -} -.view-first:hover img { - transform: scale(1.1); -} -.view-first:hover .mask { - opacity: 1; -} -.view-first:hover .tools, .view-first:hover p { - opacity: 1; - transform: translateY(0px); -} -.view-first:hover p { - transition-delay: 0.1s; -} - -/* ********* /media gallery **************************** */ - - -/* ********* verticle tabs **************************** */ - - -/*! - * bootstrap-vertical-tabs - v1.2.1 - * https://dbtek.github.io/bootstrap-vertical-tabs - * 2014-11-07 - * Copyright (c) 2014 İsmail Demirbilek - * License: MIT - */ - -.tabs-left, .tabs-right { - border-bottom: none; - padding-top: 2px; -} -.tabs-left { - border-right: 1px solid #F7F7F7; -} -.tabs-right { - border-left: 1px solid #F7F7F7; -} -.tabs-left>li, .tabs-right>li { - float: none; - margin-bottom: 2px; -} -.tabs-left>li { - margin-right: -1px; -} -.tabs-right>li { - margin-left: -1px; -} -.tabs-left>li.active>a, .tabs-left>li.active>a:hover, .tabs-left>li.active>a:focus { - border-bottom-color: #F7F7F7; - border-right-color: transparent; -} -.tabs-right>li.active>a, .tabs-right>li.active>a:hover, .tabs-right>li.active>a:focus { - border-bottom: 1px solid #F7F7F7; - border-left-color: transparent; -} -.tabs-left>li>a { - border-radius: 4px 0 0 4px; - margin-right: 0; - display: block; - background: #F7F7F7; - text-overflow: ellipsis; - overflow: hidden; -} -.tabs-right>li>a { - border-radius: 0 4px 4px 0; - margin-right: 0; - background: #F7F7F7; - text-overflow: ellipsis; - overflow: hidden; -} -.sideways { - margin-top: 50px; - border: none; - position: relative; -} -.sideways>li { - height: 20px; - width: 120px; - margin-bottom: 100px; -} -.sideways>li>a { - border-bottom: 1px solid #ddd; - border-right-color: transparent; - text-align: center; - border-radius: 4px 4px 0px 0px; -} -.sideways>li.active>a, .sideways>li.active>a:hover, .sideways>li.active>a:focus { - border-bottom-color: transparent; - border-right-color: #ddd; - border-left-color: #ddd; -} -.sideways.tabs-left { - left: -50px; -} -.sideways.tabs-right { - right: -50px; -} -.sideways.tabs-right>li { - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); -} -.sideways.tabs-left>li { - -webkit-transform: rotate(-90deg); - -moz-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - -o-transform: rotate(-90deg); - transform: rotate(-90deg); -} - -/* ********* /verticle tabs **************************** */ - -.avatar-view { - display: block; - border: 3px solid #fff; - border-radius: 5px; - box-shadow: 0 0 5px rgba(0, 0, 0, .15); - cursor: pointer; - overflow: hidden; -} -.avatar-body { - padding-right: 15px; - padding-left: 15px; -} -.avatar-upload { - overflow: hidden; -} -.avatar-upload label { - display: block; - float: left; - clear: left; - width: 100px; -} -.avatar-upload input { - display: block; - margin-left: 110px; -} -.avater-alert { - margin-top: 10px; - margin-bottom: 10px; -} -.avatar-wrapper { - height: 364px; - width: 100%; - margin-top: 15px; - box-shadow: inset 0 0 5px rgba(0, 0, 0, .25); - background-color: #fcfcfc; - overflow: hidden; -} -.avatar-wrapper img { - display: block; - height: auto; - max-width: 100%; -} -.avatar-preview { - float: left; - margin-top: 15px; - margin-right: 15px; - border: 1px solid #eee; - border-radius: 4px; - background-color: #fff; - overflow: hidden; -} -.avatar-preview:hover { - border-color: #ccf; - box-shadow: 0 0 5px rgba(0, 0, 0, .15); -} -.avatar-preview img { - width: 100%; -} -.preview-lg { - height: 184px; - width: 184px; - margin-top: 15px; -} -.preview-md { - height: 100px; - width: 100px; -} -.preview-sm { - height: 50px; - width: 50px; -} -@media (min-width: 992px) { - .avatar-preview { - float: none; - } -} -.avatar-btns { - margin-top: 30px; - margin-bottom: 15px; -} -.avatar-btns .btn-group { - margin-right: 5px; -} -.loading { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #fff url("../images/loading.gif") no-repeat center center; - opacity: .75; - filter: alpha(opacity=75); - z-index: 20140628; -} - -/* ********* /image cropping **************************** */ - - -/* ********* moris **************************** */ - -.morris-hover { - position: absolute; - z-index: 1000; -} -.morris-hover.morris-default-style { - padding: 6px; - color: #666; - background: rgba(243, 242, 243, 0.8); - border: solid 2px rgba(195, 194, 196, 0.8); - font-family: sans-serif; - font-size: 12px; - text-align: center; -} -.morris-hover.morris-default-style .morris-hover-row-label { - font-weight: bold; - margin: 0.25em 0; -} -.morris-hover.morris-default-style .morris-hover-point { - white-space: nowrap; - margin: 0.1em 0; -} - -/* ********* /moris **************************** */ - - -/* ********* ecommerce **************************** */ - -.price { - font-size: 40px; - font-weight: 400; - color: #26B99A; - margin: 0; -} -.prod_title { - border-bottom: 1px solid #DFDFDF; - padding-bottom: 5px; - margin: 30px 0; - font-size: 20px; - font-weight: 400; -} -.product-image img { - width: 90%; -} -.prod_color li { - margin: 0 10px; -} -.prod_color li p { - margin-bottom: 0; -} -.prod_size li { - padding: 0; -} -.prod_color .color { - width: 25px; - height: 25px; - border: 2px solid rgba(51, 51, 51, 0.28) !important; - padding: 2px; - border-radius: 50px; -} -.product_gallery a { - width: 100px; - height: 100px; - float: left; - margin: 10px; - border: 1px solid #e5e5e5; -} -.product_gallery a img { - width: 100%; - margin-top: 15px; -} -.product_price { - margin: 20px 0; - padding: 5px 10px; - background-color: #FFFFFF; - text-align: left; - border: 2px dashed #E0E0E0; -} -.price-tax { - font-size: 18px; -} -.product_social { - margin: 20px 0; -} -.product_social ul li a i { - font-size: 35px; -} - -/* ********* /ecommerce **************************** */ - -/********* login ****************/ - -a.hiddenanchor { - display: none; -} - -/** The wrapper that will contain our two forms **/ - -#wrapper { - right: 0px; - margin: 0px auto; - margin-top: 5%; - max-width: 350px; - position: relative; -} -#register, #login { - position: absolute; - top: 0px; - width: 100%; -} -#register { - z-index: 21; - opacity: 0; - width: 100%; -} -#login { - z-index: 22; -} -#toregister:target ~ #wrapper #register, #tologin:target ~ #wrapper #login { - z-index: 22; - -webkit-animation-name: fadeInLeft; - -moz-animation-name: fadeInLeft; - -ms-animation-name: fadeInLeft; - -o-animation-name: fadeInLeft; - animation-name: fadeInLeft; - -webkit-animation-delay: .1s; - -moz-animation-delay: .1s; - -o-animation-delay: .1s; - -ms-animation-delay: .1s; - animation-delay: .1s; -} -#toregister:target ~ #wrapper #login, #tologin:target ~ #wrapper #register { - -webkit-animation-name: fadeOutLeft; - -moz-animation-name: fadeOutLeft; - -ms-animation-name: fadeOutLeft; - -o-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} - -/** the actual animation, credit where due : http://daneden.me/animate/ ***/ - -.animate { - -webkit-animation-duration: 0.5s; - -webkit-animation-timing-function: ease; - -webkit-animation-fill-mode: both; - -moz-animation-duration: 0.5s; - -moz-animation-timing-function: ease; - -moz-animation-fill-mode: both; - -o-animation-duration: 0.5s; - -o-animation-timing-function: ease; - -o-animation-fill-mode: both; - -ms-animation-duration: 0.5s; - -ms-animation-timing-function: ease; - -ms-animation-fill-mode: both; - animation-duration: 0.5s; - animation-timing-function: ease; - animation-fill-mode: both; -} - -/********* /login ***************/ - - -/********** sign in ***************************/ - -.login_box { - padding: 20px; - margin: auto; -} -.left { - float: left; -} -.alignleft { - float: left; - margin-right: 15px; -} -.alignright { - float: right; - margin-left: 15px; -} -.clearfix:after, form:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; -} -.login_content { - margin: 0 auto; - padding: 25px 0 0; - position: relative; - text-align: center; - text-shadow: 0 1px 0 #fff; - min-width: 280px; -} -.login_content a, -.login_content .btn-default:hover { - text-decoration: none; -} -.login_content a:hover { - text-decoration: underline; -} -.login_content h1 { - font: normal 25px Helvetica, Arial, sans-serif; - letter-spacing: -0.05em; - line-height: 20px; - margin: 10px 0 30px; -} -.login_content h1:before, .login_content h1:after { - content: ""; - height: 1px; - position: absolute; - top: 10px; - width: 27%; -} -.login_content h1:after { - background: rgb(126, 126, 126); - background: -moz-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -webkit-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -o-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -ms-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - right: 0; -} -.login_content h1:before { - background: rgb(126, 126, 126); - background: -moz-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -webkit-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -o-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -ms-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - left: 0; -} -.login_content h1:before, .login_content h1:after { - content: ""; - height: 1px; - position: absolute; - top: 10px; - width: 20%; -} -.login_content h1:after { - background: rgb(126, 126, 126); - background: -moz-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -webkit-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -o-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -ms-linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: linear-gradient(left, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - right: 0; -} -.login_content h1:before { - background: rgb(126, 126, 126); - background: -moz-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -webkit-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -o-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: -ms-linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - background: linear-gradient(right, rgba(126, 126, 126, 1) 0%, rgba(255, 255, 255, 1) 100%); - left: 0; -} -.login_content form { - margin: 20px 0; - position: relative -} -.login_content form input[type="text"], .login_content form input[type="email"], .login_content form input[type="password"] { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -ms-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; - -moz-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; - -ms-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; - -o-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; - box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset; - border: 1px solid #c8c8c8; - color: #777; - margin: 0 0 20px; - width: 100%; -} -.login_content form input[type="text"]:focus, .login_content form input[type="email"]:focus, .login_content form input[type="password"]:focus { - -webkit-box-shadow: 0 0 2px #AA77B4 inset; - -moz-box-shadow: 0 0 2px #ed1c24 inset; - -ms-box-shadow: 0 0 2px #ed1c24 inset; - -o-box-shadow: 0 0 2px #ed1c24 inset; - box-shadow: 0 0 2px #A97AAD inset; - background-color: #fff; - border: 1px solid #A878AF; - outline: none; -} -#username { - background-position: 10px 10px !important -} -#password { - background-position: 10px -53px !important -} -.login_content form div a { - font-size: 12px; - margin: 10px 15px 0 0; -} -.reset_pass { - margin-top: 10px !important; -} -.login_content div .reset_pass { - margin-top: 13px !important; - margin-right: 39px; - float: right; -} -.separator { - border-top: 1px solid #D8D8D8; - margin-top: 10px; - padding-top: 10px; -} -.button { - background: rgb(247, 249, 250); - background: -moz-linear-gradient(top, rgba(247, 249, 250, 1) 0%, rgba(240, 240, 240, 1) 100%); - background: -webkit-linear-gradient(top, rgba(247, 249, 250, 1) 0%, rgba(240, 240, 240, 1) 100%); - background: -o-linear-gradient(top, rgba(247, 249, 250, 1) 0%, rgba(240, 240, 240, 1) 100%); - background: -ms-linear-gradient(top, rgba(247, 249, 250, 1) 0%, rgba(240, 240, 240, 1) 100%); - background: linear-gradient(top, rgba(247, 249, 250, 1) 0%, rgba(240, 240, 240, 1) 100%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f9fa', endColorstr='#f0f0f0', GradientType=0); - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; - -ms-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; - -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset; - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - -o-border-radius: 0 0 5px 5px; - -ms-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; - border-top: 1px solid #CFD5D9; - padding: 15px 0; -} -.login_content form input[type="submit"], #content form .submit { - float: left; - margin-left: 38px; -} -.button a { - background: url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat; - color: #7E7E7E; - font-size: 17px; - padding: 2px 0 2px 40px; - text-decoration: none; - -webkit-transition: all 0.3s ease; - -moz-transition: all 0.3s ease; - -ms-transition: all 0.3s ease; - -o-transition: all 0.3s ease; - transition: all 0.3s ease; -} -.button a:hover { - background-position: 0 -135px; - color: #00aeef; -} -header { - width: 100%; -} - -/********** end of sign in ********************/ - - -/* ********* start nprogress **************************** */ - - -/* Make clicks pass-through */ - -#nprogress { - pointer-events: none; -} -#nprogress .bar { - background: #29d; - position: fixed; - z-index: 1031; - top: 0; - left: 0; - width: 100%; - height: 2px; -} - -/* Fancy blur effect */ - -#nprogress .peg { - display: block; - position: absolute; - right: 0px; - width: 100px; - height: 100%; - box-shadow: 0 0 10px #29d, 0 0 5px #29d; - opacity: 1.0; - -webkit-transform: rotate(3deg) translate(0px, -4px); - -ms-transform: rotate(3deg) translate(0px, -4px); - transform: rotate(3deg) translate(0px, -4px); -} - -/* Remove these to get rid of the spinner */ - -#nprogress .spinner { - display: block; - position: fixed; - z-index: 1031; - top: 15px; - right: 15px; -} -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - border: solid 2px transparent; - border-top-color: #29d; - border-left-color: #29d; - border-radius: 50%; - -webkit-animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} -.nprogress-custom-parent { - overflow: hidden; - position: relative; -} -.nprogress-custom-parent #nprogress .spinner, .nprogress-custom-parent #nprogress .bar { - position: absolute; -} -@-webkit-keyframes nprogress-spinner { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} -@keyframes nprogress-spinner { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - -/* ********* end nprogress **************************** */ - - -/** bootstrap-wysiwyg **/ -.editor-wrapper { - min-height: 250px; - background-color: white; - border-collapse: separate; - border: 1px solid rgb(204, 204, 204); - padding: 4px; - box-sizing: content-box; - -webkit-box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px 0px inset; - box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px 0px inset; - border-top-right-radius: 3px; border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; border-top-left-radius: 3px; - overflow: scroll; - outline: none; -} - -.voiceBtn { - width: 20px; - color: transparent; - background-color: transparent; - transform: scale(2.0, 2.0); - -webkit-transform: scale(2.0, 2.0); - -moz-transform: scale(2.0, 2.0); - border: transparent; - cursor: pointer; - box-shadow: none; - -webkit-box-shadow: none; -} - -div[data-role="editor-toolbar"] { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.dropdown-menu a { - cursor: pointer; -} -/** /bootstrap-wysiwyg **/ - -/** Select2 **/ -.select2-container--default .select2-selection--single, -.select2-container--default .select2-selection--multiple { - background-color: #fff; - border: 1px solid #ccc; - border-radius: 0; - min-height: 38px; -} - -.select2-container--default .select2-selection--single .select2-selection__rendered { - color: #73879C; - padding-top: 5px; -} - -.select2-container--default .select2-selection--multiple .select2-selection__rendered { - padding-top: 3px; -} - -.select2-container--default .select2-selection--single .select2-selection__arrow { - height: 36px; -} - -.select2-container--default .select2-selection--multiple .select2-selection__choice, -.select2-container--default .select2-selection--multiple .select2-selection__clear { - margin-top: 2px; - border: none; - border-radius: 0; - padding: 3px 5px; -} - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: 1px solid #ccc; -} -/** /Select2 **/ - -/** Switchery **/ -.switchery { - width: 32px; - height: 20px; -} - -.switchery>small { - width: 20px; - height: 20px; -} -/** /Switchery **/ - -/** Normalize.css **/ -fieldset { - border: none; - margin: 0; - padding: 0; -} -/** /Normalize.css **/ - -/** Cropper **/ -.cropper .img-container, -.cropper .img-preview { - background-color: #f7f7f7; - width: 100%; - text-align: center; -} - -.cropper .img-container { - min-height: 200px; - max-height: 516px; - margin-bottom: 20px; -} - -@media (min-width: 768px) { - .cropper .img-container { - min-height: 516px; - } -} - -.cropper .img-container > img { - max-width: 100%; -} - -.cropper .docs-preview { - margin-right: -15px; -} - -.cropper .img-preview { - float: left; - margin-right: 10px; - margin-bottom: 10px; - overflow: hidden; -} - -.cropper .img-preview > img { - max-width: 100%; -} - -.cropper .preview-lg { - width: 263px; - height: 148px; -} - -.cropper .preview-md { - width: 139px; - height: 78px; -} - -.cropper .preview-sm { - width: 69px; - height: 39px; -} - -.cropper .preview-xs { - width: 35px; - height: 20px; - margin-right: 0; -} - -.cropper .docs-data > .input-group { - margin-bottom: 10px; -} - -.cropper .docs-data > .input-group > label { - min-width: 80px; -} - -.cropper .docs-data > .input-group > span { - min-width: 50px; -} - -.cropper .docs-buttons > .btn, -.cropper .docs-buttons > .btn-group, -.cropper .docs-buttons > .form-control { - margin-right: 5px; - margin-bottom: 10px; -} - -.cropper .docs-toggles > .btn, -.cropper .docs-toggles > .btn-group, -.cropper .docs-toggles > .dropdown { - margin-bottom: 10px; -} - -.cropper .docs-tooltip { - display: block; - margin: -6px -12px; - padding: 6px 12px; -} - -.cropper .docs-tooltip > .icon { - margin: 0 -3px; - vertical-align: top; -} - -.cropper .tooltip-inner { - white-space: normal; -} - -.cropper .btn-upload .tooltip-inner, -.cropper .btn-toggle .tooltip-inner { - white-space: nowrap; -} - -.cropper .btn-toggle { - padding: 6px; -} - -.cropper .btn-toggle > .docs-tooltip { - margin: -6px; - padding: 6px; -} - -@media (max-width: 400px) { - .cropper .btn-group-crop { - margin-right: -15px!important; - } - - .cropper .btn-group-crop > .btn { - padding-left: 5px; - padding-right: 5px; - } - - .cropper .btn-group-crop .docs-tooltip { - margin-left: -5px; - margin-right: -5px; - padding-left: 5px; - padding-right: 5px; - } -} - -.cropper .docs-options .dropdown-menu { - width: 100%; -} - -.cropper .docs-options .dropdown-menu > li { - padding: 3px 20px; -} - -.cropper .docs-options .dropdown-menu > li:hover { - background-color: #f7f7f7; -} - -.cropper .docs-options .dropdown-menu > li > label { - display: block; -} - -.cropper .docs-cropped .modal-body { - text-align: center; -} - -.cropper .docs-cropped .modal-body > img, -.cropper .docs-cropped .modal-body > canvas { - max-width: 100%; -} - -.cropper .docs-diagram .modal-dialog { - max-width: 352px; -} - -.cropper .docs-cropped canvas { - max-width: 100%; -} -/** /Cropper **/ - -/** jQuery Smart Wizard **/ -.form_wizard .stepContainer { - display: block; - position: relative; - margin: 0; - padding: 0; - border: 0 solid #CCC; - overflow-x: hidden; -} - -.wizard_horizontal ul.wizard_steps { - display: table; - list-style: none; - position: relative; - width: 100%; - margin: 0 0 20px; -} - -.wizard_horizontal ul.wizard_steps li { - display: table-cell; - text-align: center; -} - -.wizard_horizontal ul.wizard_steps li a, .wizard_horizontal ul.wizard_steps li:hover { - display: block; - position: relative; - -moz-opacity: 1; - filter: alpha(opacity= 100); - opacity: 1; - color: #666; -} - -.wizard_horizontal ul.wizard_steps li a:before { - content: ""; - position: absolute; - height: 4px; - background: #ccc; - top: 20px; - width: 100%; - z-index: 4; - left: 0; -} - -.wizard_horizontal ul.wizard_steps li a.disabled .step_no { - background: #ccc; -} - -.wizard_horizontal ul.wizard_steps li a .step_no { - width: 40px; - height: 40px; - line-height: 40px; - border-radius: 100px; - display: block; - margin: 0 auto 5px; - font-size: 16px; - text-align: center; - position: relative; - z-index: 5; -} - -.wizard_horizontal ul.wizard_steps li a.selected:before, .step_no { - background: #34495E; - color: #fff; -} - -.wizard_horizontal ul.wizard_steps li a.done:before, .wizard_horizontal ul.wizard_steps li a.done .step_no { - background: #1ABB9C; - color: #fff; -} - -.wizard_horizontal ul.wizard_steps li:first-child a:before { - left: 50%; -} - -.wizard_horizontal ul.wizard_steps li:last-child a:before { - right: 50%; - width: 50%; - left: auto; -} - -.wizard_verticle .stepContainer { - width: 80%; - float: left; - padding: 0 10px; -} - -.actionBar { - width: 100%; - border-top: 1px solid #ddd; - padding: 10px 5px; - text-align: right; - margin-top: 10px; -} - -.actionBar .buttonDisabled { - cursor: not-allowed; - pointer-events: none; - opacity: .65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -.actionBar a { - margin: 0 3px; -} - -.wizard_verticle .wizard_content { - width: 80%; - float: left; - padding-left: 20px; -} - -.wizard_verticle ul.wizard_steps { - display: table; - list-style: none; - position: relative; - width: 20%; - float: left; - margin: 0 0 20px; -} - -.wizard_verticle ul.wizard_steps li { - display: list-item; - text-align: center; -} - -.wizard_verticle ul.wizard_steps li a { - height: 80px; -} - -.wizard_verticle ul.wizard_steps li a:first-child { - margin-top: 20px; -} - -.wizard_verticle ul.wizard_steps li a, .wizard_verticle ul.wizard_steps li:hover { - display: block; - position: relative; - -moz-opacity: 1; - filter: alpha(opacity= 100); - opacity: 1; - color: #666; -} - -.wizard_verticle ul.wizard_steps li a:before { - content: ""; - position: absolute; - height: 100%; - background: #ccc; - top: 20px; - width: 4px; - z-index: 4; - left: 49%; -} - -.wizard_verticle ul.wizard_steps li a.disabled .step_no { - background: #ccc; -} - -.wizard_verticle ul.wizard_steps li a .step_no { - width: 40px; - height: 40px; - line-height: 40px; - border-radius: 100px; - display: block; - margin: 0 auto 5px; - font-size: 16px; - text-align: center; - position: relative; - z-index: 5; -} - -.wizard_verticle ul.wizard_steps li a.selected:before, .step_no { - background: #34495E; - color: #fff; -} - -.wizard_verticle ul.wizard_steps li a.done:before, .wizard_verticle ul.wizard_steps li a.done .step_no { - background: #1ABB9C; - color: #fff; -} - -.wizard_verticle ul.wizard_steps li:first-child a:before { - left: 49%; -} - -.wizard_verticle ul.wizard_steps li:last-child a:before { - left: 49%; - left: auto; - width: 0; -} - -.form_wizard .loader { - display: none; -} - -.form_wizard .msgBox { - display: none; -} -/** jQuery Smart Wizard **/ - -/** bootstrap-progressbar **/ -.progress { - border-radius: 0; -} - -.progress-bar-info { - background-color: #3498DB; -} - -.progress-bar-success { - background-color: #26B99A; -} - -.progress_summary .progress { - margin: 5px 0 12px !important; -} - -.progress_summary .row { - margin-bottom: 5px; -} - -.progress_summary .row .col-xs-2 { - padding: 0 -} - -.progress_summary .more_info span { - text-align: right; - float: right; -} - -.progress_summary .data span { - text-align: right; - float: right; -} - -.progress_summary p { - margin-bottom: 3px; - width: 100%; -} - -.progress_title .left { - float: left; - text-align: left; -} - -.progress_title .right { - float: right; - text-align: right; - font-weight: 300; -} - -.progress.progress_sm { - border-radius: 0; - margin-bottom: 18px; - height: 10px !important; -} - -.progress.progress_sm .progress-bar { - height: 10px !important; -} - -.dashboard_graph p { - margin: 0 0 4px; -} - -ul.verticle_bars { - width: 100%; -} - -ul.verticle_bars li { - width: 23%; - height: 200px; - margin: 0; -} - -.progress.vertical.progress_wide { - width: 35px; -} -/** bootstrap-progressbar **/ - -/** PNotify **/ -.alert-success { - color: #ffffff; - background-color: rgba(38, 185, 154, 0.88); - border-color: rgba(38, 185, 154, 0.88); -} - -.alert-info { - color: #E9EDEF; - background-color: rgba(52, 152, 219, 0.88); - border-color: rgba(52, 152, 219, 0.88); -} - -.alert-warning { - color: #E9EDEF; - background-color: rgba(243, 156, 18, 0.88); - border-color: rgba(243, 156, 18, 0.88); -} - -.alert-danger, -.alert-error { - color: #E9EDEF; - background-color: rgba(231, 76, 60, 0.88); - border-color: rgba(231, 76, 60, 0.88); -} - -.ui-pnotify.dark .ui-pnotify-container { - color: #E9EDEF; - background-color: rgba(52, 73, 94, 0.88); - border-color: rgba(52, 73, 94, 0.88); -} - -.custom-notifications { - position: fixed; - margin: 15px; - right: 0; - float: right; - width: 400px; - z-index: 4000; - bottom: 0; -} - -ul.notifications { - float: right; - display: block; - margin-bottom: 7px; - padding: 0; - width: 100%; -} - -.notifications li { - float: right; - margin: 3px; - width: 36px; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.3); -} - -.notifications li:last-child { - margin-left: 0; -} - -.notifications a { - display: block; - text-align: center; - text-decoration: none; - text-transform: uppercase; - padding: 9px 8px; -} - -.tabbed_notifications .text { - padding: 5px 15px; - height: 140px; - border-radius: 7px; - box-shadow: 6px 6px 6px rgba(0, 0, 0, 0.3); -} - -.tabbed_notifications div p { - display: inline-block; -} - -.tabbed_notifications h2 { - font-weight: bold; - text-transform: uppercase; - width: 80%; - float: left; - height: 20px; - text-overflow: ellipsis; - overflow: hidden; - display: block; -} - -.tabbed_notifications .close { - padding: 5px; - color: #E9EDEF; - float: right; - opacity: 1; -} -/** /PNotify **/ - -/** bootstrap-daterangepicker **/ -.daterangepicker.dropdown-menu { - font-size: 13px; - padding: 0; - overflow: hidden; -} - -.daterangepicker.picker_1 { - background: #34495E; - color: #ECF0F1; -} - -.daterangepicker.picker_1 table.table-condensed thead tr:first-child { - background: #1ABB9C; -} - -.daterangepicker table.table-condensed thead tr:first-child th { - line-height: 28px; - text-align: center; -} - -.daterangepicker.picker_1 table.table-condensed thead tr { - background: #213345; -} - -.daterangepicker table.table-condensed thead tr { - line-height: 14px; -} - -.daterangepicker table.table-condensed tbody tr:first-child td { - padding-top: 10px; -} - -.daterangepicker table.table-condensed th:first-child, .daterangepicker table.table-condensed td:first-child { - padding-left: 12px -} - -.daterangepicker table.table-condensed th:last-child, .daterangepicker table.table-condensed td:last-child { - padding-right: 12px -} - -.table-condensed>thead>tr>th, .table-condensed>tbody>tr>th, .table-condensed>tfoot>tr>th, .table-condensed>thead>tr>td, .table-condensed>tbody>tr>td, .table-condensed>tfoot>tr>td { - padding: 5px 7px; - text-align: center; -} - -.daterangepicker table.table-condensed tbody tr:last-child td { - padding-bottom: 10px; -} - -.daterangepicker.picker_2 table.table-condensed thead tr:first-child { - color: inherit; -} - -.daterangepicker.picker_2 table.table-condensed thead tr { - color: #1ABB9C; -} - -.daterangepicker.picker_3 table.table-condensed thead tr:first-child { - background: #1ABB9C; - color: #ECF0F1; -} - -.daterangepicker.picker_4 table.table-condensed tbody td { - background: #ECF0F1; - color: #34495E; - border: 1px solid #fff; - padding: 4px 7px; -} - -.daterangepicker.picker_4 table.table-condensed tbody td.active { - background: #536A7F; - color: #fff; -} - -.daterangepicker.picker_4 table.table-condensed thead tr:first-child { - background: #34495E; - color: #ECF0F1; -} - -.xdisplay_input { - width: 240px; - overflow: hidden; - padding: 0; -} - -.xdisplay { - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - margin-bottom: 20px; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - width: 230px; - overflow: hidden; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} - -.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, .daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { - float: right; -} - -.daterangepicker.dropdown-menu .calendar {} -.daterangepicker table { - width: 100%; - margin: 0; -} - -.daterangepicker td, .daterangepicker th { - text-align: center; - width: 20px; - height: 20px; - cursor: pointer; - white-space: nowrap; -} - -.daterangepicker td.off { - color: #999; -} - -.daterangepicker td.disabled { - color: #999; -} - -.daterangepicker td.available:hover, .daterangepicker th.available:hover { - background: #eee; - color: #34495E; -} - -.daterangepicker td.in-range { - background: #E4E7EA; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.daterangepicker td.available + td.start-date { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.daterangepicker td.in-range + td.end-date { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.daterangepicker td.start-date.end-date { - -webkit-border-radius: 4px !important; - -moz-border-radius: 4px !important; - border-radius: 4px !important; -} - -.daterangepicker td.active, .daterangepicker td.active:hover { - background-color: #536A7F; - color: #fff; -} - -.daterangepicker td.week, .daterangepicker th.week { - font-size: 80%; - color: #ccc; -} - -.daterangepicker select.monthselect, .daterangepicker select.yearselect { - font-size: 12px; - padding: 1px; - height: auto; - margin: 0; - cursor: default; - height: 30px; - border: 1px solid #ADB2B5; - line-height: 30px; - border-radius: 0px !important; -} - -.daterangepicker select.monthselect { - margin-right: 2%; - width: 56%; -} - -.daterangepicker select.yearselect { - width: 40%; -} - -.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect { - width: 50px; - margin-bottom: 0; -} - -.daterangepicker_start_input { - float: left; -} - -.daterangepicker_end_input { - float: left; - padding-left: 11px; -} - -.daterangepicker th.month { - width: auto; -} - -.daterangepicker .daterangepicker_start_input label, .daterangepicker .daterangepicker_end_input label { - color: #333; - display: block; - font-size: 11px; - font-weight: normal; - height: 20px; - line-height: 20px; - margin-bottom: 2px; - text-shadow: #fff 1px 1px 0px; - text-transform: uppercase; - width: 74px; -} - -.daterangepicker .ranges input { - font-size: 11px; -} - -.daterangepicker .ranges .input-mini { - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; - color: #555; - display: block; - font-size: 11px; - height: 30px; - line-height: 30px; - vertical-align: middle; - margin: 0 0 10px 0; - padding: 0 6px; - width: 74px; -} - -.daterangepicker .ranges .input-mini:hover { - cursor: pointer; -} - -.daterangepicker .ranges ul { - list-style: none; - margin: 0; - padding: 0; -} - -.daterangepicker .ranges li { - font-size: 13px; - background: #f5f5f5; - border: 1px solid #f5f5f5; - color: #536A7F; - padding: 3px 12px; - margin-bottom: 8px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - cursor: pointer; -} - -.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { - background: #536A7F; - border: 1px solid #536A7F; - color: #fff; -} - -.daterangepicker .calendar { - display: none; - max-width: 270px; -} - -.daterangepicker.show-calendar .calendar { - display: block; -} - -.daterangepicker .calendar.single .calendar-date { - border: none; -} - -.daterangepicker.single .ranges, .daterangepicker.single .calendar { - float: none; -} - -.daterangepicker .ranges { - width: 160px; - text-align: left; - margin: 4px; -} - -.daterangepicker .ranges .range_inputs>div { - float: left; -} - -.daterangepicker .ranges .range_inputs>div:nth-child(2) { - padding-left: 11px; -} - -.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { - float: left; - margin: 4px; -} - -.daterangepicker .icon { - width: 20px; - height: 20px; - display: inline-block; - vertical-align: middle; -} -/** bootstrap-daterangepicker **/ - -/** FullCalendar **/ -.fc-state-default { - background: #f5f5f5; - color: #73879C; -} - -.fc-state-down, -.fc-state-active { - color: #333; - background: #ccc; -} -/** /FullCalendar **/ - -/** Dropzone.js **/ -.dropzone { - min-height: 300px; - border: 1px solid #e5e5e5; -} -/** /Dropzone.js **/ diff --git a/production/media_gallery.html b/production/media_gallery.html index b9542ded..6fc8ef4b 100755 --- a/production/media_gallery.html +++ b/production/media_gallery.html @@ -317,7 +317,7 @@
    - image + image

    Your Text

    @@ -335,7 +335,7 @@
    - image + image

    Your Text

    @@ -353,7 +353,7 @@
    - image + image

    Your Text

    @@ -371,7 +371,7 @@
    - image + image

    Your Text

    @@ -389,7 +389,7 @@
    - image + image

    Your Text

    @@ -409,7 +409,7 @@
    - image + image
    @@ -428,7 +428,7 @@
    - image + image
    @@ -447,7 +447,7 @@
    - image + image
    @@ -466,7 +466,7 @@
    - image + image
    @@ -485,7 +485,7 @@
    - image + image
    diff --git a/production/profile.html b/production/profile.html index b7ae43b5..2703e338 100755 --- a/production/profile.html +++ b/production/profile.html @@ -308,83 +308,12 @@
    -
    -
    - -
    Avatar - - - - - - -
    - -

    Samuel Doe

    diff --git a/src/scss/custom.scss b/src/scss/custom.scss index 735d6b5a..8d439fe2 100644 --- a/src/scss/custom.scss +++ b/src/scss/custom.scss @@ -1088,56 +1088,68 @@ h3.degrees { .bulk-actions { display: none; } + table.countries_list { width: 100%; } + table.countries_list td { padding: 0 10px; line-height: 30px; border-top: 1px solid #eeeeee; } + .dataTables_paginate a { padding: 6px 9px !important; background: #ddd !important; border-color: #ddd !important; } + .paging_full_numbers a.paginate_active { background-color: rgba(38, 185, 154, 0.59) !important; border-color: rgba(38, 185, 154, 0.59) !important; } + button.DTTT_button, div.DTTT_button, a.DTTT_button { border: 1px solid #E7E7E7 !important; background: #E7E7E7 !important; box-shadow: none !important; } + table.jambo_table { border: 1px solid rgba(221, 221, 221, 0.78); } + table.jambo_table thead { background: rgba(52, 73, 94, 0.94); color: #ECF0F1; } + table.jambo_table tbody tr:hover td { background: rgba(38, 185, 154, 0.07); border-top: 1px solid rgba(38, 185, 154, 0.11); border-bottom: 1px solid rgba(38, 185, 154, 0.11); } + table.jambo_table tbody tr.selected { background: rgba(38, 185, 154, 0.16); } + table.jambo_table tbody tr.selected td { border-top: 1px solid rgba(38, 185, 154, 0.40); border-bottom: 1px solid rgba(38, 185, 154, 0.40); } + .dataTables_paginate a { background: #ff0000; } + .dataTables_wrapper { position: relative; clear: both; zoom: 1; - /* Feeling sorry for IE */ } + .dataTables_processing { position: absolute; top: 50%; @@ -1153,147 +1165,130 @@ table.jambo_table tbody tr.selected td { font-size: 14px; background-color: white; } + .dataTables_length { width: 40%; float: left; } + .dataTables_filter { width: 50%; float: right; text-align: right; } + .dataTables_info { width: 60%; float: left; } + .dataTables_paginate { float: right; text-align: right; } + table.dataTable th.focus, table.dataTable td.focus { outline: 2px solid #1ABB9C !important; outline-offset: -1px; } -/* Pagination nested */ - -.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { - height: 19px; - float: left; - cursor: pointer; - color: #111 !important; -} -.paginate_disabled_previous:hover, .paginate_enabled_previous:hover, .paginate_disabled_next:hover, .paginate_enabled_next:hover { - text-decoration: none !important; -} -.paginate_disabled_previous:active, .paginate_enabled_previous:active, .paginate_disabled_next:active, .paginate_enabled_next:active { - outline: none; -} -.paginate_disabled_previous, .paginate_disabled_next { - color: #666 !important; -} -.paginate_disabled_previous, .paginate_enabled_previous { - padding-left: 23px; -} -.paginate_disabled_next, .paginate_enabled_next { - padding-right: 23px; - margin-left: 10px; -} -.paginate_disabled_previous { - background: url('../images/back_disabled.png') no-repeat top left; -} -.paginate_enabled_previous { - background: url('../images/back_enabled.png') no-repeat top left; -} -.paginate_enabled_previous:hover { - background: url('../images/back_enabled_hover.png') no-repeat top left; -} -.paginate_disabled_next { - background: url('../images/forward_disabled.png') no-repeat top right; -} -.paginate_enabled_next { - background: url('../images/forward_enabled.png') no-repeat top right; -} -.paginate_enabled_next:hover { - background: url('../images/forward_enabled_hover.png') no-repeat top right; -} table.display { margin: 0 auto; clear: both; width: 100%; } + table.display thead th { padding: 8px 18px 8px 10px; border-bottom: 1px solid black; font-weight: bold; cursor: pointer; } + table.display tfoot th { padding: 3px 18px 3px 10px; border-top: 1px solid black; font-weight: bold; } + table.display tr.heading2 td { border-bottom: 1px solid #aaa; } + table.display td { padding: 3px 10px; } + table.display td.center { text-align: center; } + table.display thead th:active, table.display thead td:active { outline: none; } + .dataTables_scroll { clear: both; } + .dataTables_scrollBody { *margin-top: -1px; -webkit-overflow-scrolling: touch; } + .top, .bottom {} .top .dataTables_info { float: none; } + .clear { clear: both; } + .dataTables_empty { text-align: center; } + tfoot input { margin: 0.5em 0; width: 100%; color: #444; } + tfoot input.search_init { color: #999; } + td.group { background-color: #d1cfd0; border-bottom: 2px solid #A19B9E; border-top: 2px solid #A19B9E; } + td.details { background-color: #d1cfd0; border: 2px solid #A19B9E; } + .example_alt_pagination div.dataTables_info { width: 40%; } + .paging_full_numbers { width: 400px; height: 22px; line-height: 22px; } + .paging_full_numbers a:active { outline: none } + .paging_full_numbers a:hover { text-decoration: none; } + .paging_full_numbers a.paginate_button, .paging_full_numbers a.paginate_active { border: 1px solid #aaa; -webkit-border-radius: 5px; @@ -1302,22 +1297,28 @@ td.details { margin: 0 3px; cursor: pointer; } + .paging_full_numbers a.paginate_button { background-color: #ddd; } + .paging_full_numbers a.paginate_button:hover { background-color: #ccc; text-decoration: none !important; } + .paging_full_numbers a.paginate_active { background-color: #99B3FF; } + table.display tr.even.row_selected td { background-color: #B0BED9; } + table.display tr.odd.row_selected td { background-color: #9FAFD1; } + div.box { height: 100px; padding: 10px; @@ -1325,8 +1326,7 @@ div.box { border: 1px solid #8080FF; background-color: #E5E5FF; } - -/* ********* /tables styleing ****************************** */ +/* ********* /tables styling ****************************** */ /* ********* /dashboard widget **************************** */ @@ -3300,104 +3300,6 @@ ul.project_files li a i { /* ********* /verticle tabs **************************** */ -.avatar-view { - display: block; - border: 3px solid #fff; - border-radius: 5px; - box-shadow: 0 0 5px rgba(0, 0, 0, .15); - cursor: pointer; - overflow: hidden; -} -.avatar-body { - padding-right: 15px; - padding-left: 15px; -} -.avatar-upload { - overflow: hidden; -} -.avatar-upload label { - display: block; - float: left; - clear: left; - width: 100px; -} -.avatar-upload input { - display: block; - margin-left: 110px; -} -.avater-alert { - margin-top: 10px; - margin-bottom: 10px; -} -.avatar-wrapper { - height: 364px; - width: 100%; - margin-top: 15px; - box-shadow: inset 0 0 5px rgba(0, 0, 0, .25); - background-color: #fcfcfc; - overflow: hidden; -} -.avatar-wrapper img { - display: block; - height: auto; - max-width: 100%; -} -.avatar-preview { - float: left; - margin-top: 15px; - margin-right: 15px; - border: 1px solid #eee; - border-radius: 4px; - background-color: #fff; - overflow: hidden; -} -.avatar-preview:hover { - border-color: #ccf; - box-shadow: 0 0 5px rgba(0, 0, 0, .15); -} -.avatar-preview img { - width: 100%; -} -.preview-lg { - height: 184px; - width: 184px; - margin-top: 15px; -} -.preview-md { - height: 100px; - width: 100px; -} -.preview-sm { - height: 50px; - width: 50px; -} -@media (min-width: 992px) { - .avatar-preview { - float: none; - } -} -.avatar-btns { - margin-top: 30px; - margin-bottom: 15px; -} -.avatar-btns .btn-group { - margin-right: 5px; -} -.loading { - display: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #fff url("../images/loading.gif") no-repeat center center; - opacity: .75; - filter: alpha(opacity=75); - z-index: 20140628; -} - -/* ********* /image cropping **************************** */ - /* ********* moris **************************** */ diff --git a/vendors/Chart.js/.bower.json b/vendors/Chart.js/.bower.json index 24fe5947..f9608e97 100644 --- a/vendors/Chart.js/.bower.json +++ b/vendors/Chart.js/.bower.json @@ -1,8 +1,8 @@ { "name": "Chart.js", - "version": "2.1.0", + "version": "2.1.4", "description": "Simple HTML5 Charts using the canvas element", - "homepage": "https://github.com/nnnick/Chart.js", + "homepage": "https://github.com/chartjs/Chart.js", "author": "nnnick", "license": "MIT", "main": [ @@ -11,11 +11,11 @@ "devDependencies": { "jquery": "~2.1.4" }, - "_release": "2.1.0", + "_release": "2.1.4", "_resolution": { "type": "version", - "tag": "2.1.0", - "commit": "2ee37e12e379ca9b8ad3be7105715bf8c543ead0" + "tag": "v2.1.4", + "commit": "40d76b6a7ba14aeac69b05ad15d713c3402867b2" }, "_source": "https://github.com/nnnick/Chart.js.git", "_target": "^2.0.2", diff --git a/vendors/Chart.js/.editorconfig b/vendors/Chart.js/.editorconfig new file mode 100644 index 00000000..4e0d877e --- /dev/null +++ b/vendors/Chart.js/.editorconfig @@ -0,0 +1,10 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = false diff --git a/vendors/Chart.js/.github/ISSUE_TEMPLATE.md b/vendors/Chart.js/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..cb905e6c --- /dev/null +++ b/vendors/Chart.js/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,2 @@ +- [ ] I have read the [guidelines for contributing](https://github.com/chartjs/Chart.js/blob/master/CONTRIBUTING.md) +- [ ] I have included an example of my issue on a website such as [JS Bin](http://jsbin.com/), [JS Fiddle](http://jsfiddle.net/), or [Codepen](http://codepen.io/pen/). ([Template](http://codepen.io/pen?template=JXVYzq)) \ No newline at end of file diff --git a/vendors/Chart.js/.github/PULL_REQUEST_TEMPLATE.md b/vendors/Chart.js/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..b7cc39f1 --- /dev/null +++ b/vendors/Chart.js/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,2 @@ +- [ ] I have read the [guidelines for contributing](https://github.com/chartjs/Chart.js/blob/master/CONTRIBUTING.md) +- [ ] I have included an example of my changes on a website such as [JS Bin](http://jsbin.com/), [JS Fiddle](http://jsfiddle.net/), or [Codepen](http://codepen.io/pen/). ([Template](http://codepen.io/pen?template=JXVYzq)) \ No newline at end of file diff --git a/vendors/Chart.js/.gitignore b/vendors/Chart.js/.gitignore index a3589d29..a79806fd 100644 --- a/vendors/Chart.js/.gitignore +++ b/vendors/Chart.js/.gitignore @@ -9,5 +9,5 @@ docs/index.md bower_components/ coverage/* - +.idea nbproject/* diff --git a/vendors/Chart.js/README.md b/vendors/Chart.js/README.md index 547a92f8..c40df39d 100644 --- a/vendors/Chart.js/README.md +++ b/vendors/Chart.js/README.md @@ -16,7 +16,7 @@ To install via npm / bower: npm install chart.js --save bower install Chart.js --save ``` -CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.0.0/Chart.js +CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js ## Documentation @@ -31,6 +31,8 @@ For support using Chart.js, please post questions with the [`chartjs` tag on Sta ## Building and Testing `gulp build`, `gulp test` +Thanks to [BrowserStack](https://browserstack.com) for allowing our team to test on thousands of browsers. + ## License Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT). diff --git a/vendors/Chart.js/bower.json b/vendors/Chart.js/bower.json index e1bb8c25..1802ae6e 100644 --- a/vendors/Chart.js/bower.json +++ b/vendors/Chart.js/bower.json @@ -1,8 +1,8 @@ { "name": "Chart.js", - "version": "2.1.0", + "version": "2.1.4", "description": "Simple HTML5 Charts using the canvas element", - "homepage": "https://github.com/nnnick/Chart.js", + "homepage": "https://github.com/chartjs/Chart.js", "author": "nnnick", "license": "MIT", "main": [ @@ -11,4 +11,4 @@ "devDependencies": { "jquery": "~2.1.4" } -} +} \ No newline at end of file diff --git a/vendors/Chart.js/dist/Chart.bundle.js b/vendors/Chart.js/dist/Chart.bundle.js index 68d4b054..ec077f95 100644 --- a/vendors/Chart.js/dist/Chart.bundle.js +++ b/vendors/Chart.js/dist/Chart.bundle.js @@ -1,13 +1,721 @@ /*! * Chart.js * http://chartjs.org/ - * Version: 2.0.2 + * Version: 2.1.4 * * Copyright 2016 Nick Downie * Released under the MIT license * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md */ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } +}; + +Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] +}; + +Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] +}; + +Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +}; + +Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = convert[space][sname](values[space]); + } + } + + return true; +}; + +Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; +}; + +Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; +}; + +if (typeof window !== 'undefined') { + window.Color = Color; +} + +module.exports = Color; + +},{"chartjs-color-string":1,"color-convert":4}],3:[function(require,module,exports){ /* MIT license */ module.exports = { @@ -707,7 +1415,7 @@ for (var key in cssKeywords) { reverseKeywords[JSON.stringify(cssKeywords[key])] = key; } -},{}],2:[function(require,module,exports){ +},{}],4:[function(require,module,exports){ var conversions = require("./conversions"); var convert = function() { @@ -800,230 +1508,7 @@ Converter.prototype.getValues = function(space) { }); module.exports = convert; -},{"./conversions":1}],3:[function(require,module,exports){ -/* MIT license */ -var colorNames = require('color-name'); - -module.exports = { - getRgba: getRgba, - getHsla: getHsla, - getRgb: getRgb, - getHsl: getHsl, - getHwb: getHwb, - getAlpha: getAlpha, - - hexString: hexString, - rgbString: rgbString, - rgbaString: rgbaString, - percentString: percentString, - percentaString: percentaString, - hslString: hslString, - hslaString: hslaString, - hwbString: hwbString, - keyword: keyword -} - -function getRgba(string) { - if (!string) { - return; - } - var abbr = /^#([a-fA-F0-9]{3})$/, - hex = /^#([a-fA-F0-9]{6})$/, - rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, - per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, - keyword = /(\w+)/; - - var rgb = [0, 0, 0], - a = 1, - match = string.match(abbr); - if (match) { - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i] + match[i], 16); - } - } - else if (match = string.match(hex)) { - match = match[1]; - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); - } - } - else if (match = string.match(rgba)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = parseInt(match[i + 1]); - } - a = parseFloat(match[4]); - } - else if (match = string.match(per)) { - for (var i = 0; i < rgb.length; i++) { - rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); - } - a = parseFloat(match[4]); - } - else if (match = string.match(keyword)) { - if (match[1] == "transparent") { - return [0, 0, 0, 0]; - } - rgb = colorNames[match[1]]; - if (!rgb) { - return; - } - } - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = scale(rgb[i], 0, 255); - } - if (!a && a != 0) { - a = 1; - } - else { - a = scale(a, 0, 1); - } - rgb[3] = a; - return rgb; -} - -function getHsla(string) { - if (!string) { - return; - } - var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hsl); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - s = scale(parseFloat(match[2]), 0, 100), - l = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, s, l, a]; - } -} - -function getHwb(string) { - if (!string) { - return; - } - var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; - var match = string.match(hwb); - if (match) { - var alpha = parseFloat(match[4]); - var h = scale(parseInt(match[1]), 0, 360), - w = scale(parseFloat(match[2]), 0, 100), - b = scale(parseFloat(match[3]), 0, 100), - a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); - return [h, w, b, a]; - } -} - -function getRgb(string) { - var rgba = getRgba(string); - return rgba && rgba.slice(0, 3); -} - -function getHsl(string) { - var hsla = getHsla(string); - return hsla && hsla.slice(0, 3); -} - -function getAlpha(string) { - var vals = getRgba(string); - if (vals) { - return vals[3]; - } - else if (vals = getHsla(string)) { - return vals[3]; - } - else if (vals = getHwb(string)) { - return vals[3]; - } -} - -// generators -function hexString(rgb) { - return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1]) - + hexDouble(rgb[2]); -} - -function rgbString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return rgbaString(rgba, alpha); - } - return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; -} - -function rgbaString(rgba, alpha) { - if (alpha === undefined) { - alpha = (rgba[3] !== undefined ? rgba[3] : 1); - } - return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] - + ", " + alpha + ")"; -} - -function percentString(rgba, alpha) { - if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { - return percentaString(rgba, alpha); - } - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - - return "rgb(" + r + "%, " + g + "%, " + b + "%)"; -} - -function percentaString(rgba, alpha) { - var r = Math.round(rgba[0]/255 * 100), - g = Math.round(rgba[1]/255 * 100), - b = Math.round(rgba[2]/255 * 100); - return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; -} - -function hslString(hsla, alpha) { - if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { - return hslaString(hsla, alpha); - } - return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; -} - -function hslaString(hsla, alpha) { - if (alpha === undefined) { - alpha = (hsla[3] !== undefined ? hsla[3] : 1); - } - return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " - + alpha + ")"; -} - -// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax -// (hwb have alpha optional & 1 is default value) -function hwbString(hwb, alpha) { - if (alpha === undefined) { - alpha = (hwb[3] !== undefined ? hwb[3] : 1); - } - return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" - + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; -} - -function keyword(rgb) { - return reverseNames[rgb.slice(0, 3)]; -} - -// helpers -function scale(num, min, max) { - return Math.min(Math.max(min, num), max); -} - -function hexDouble(num) { - var str = num.toString(16).toUpperCase(); - return (str.length < 2) ? "0" + str : str; -} - - -//create a list of reverse color names -var reverseNames = {}; -for (var name in colorNames) { - reverseNames[colorNames[name]] = name; -} - -},{"color-name":4}],4:[function(require,module,exports){ +},{"./conversions":3}],5:[function(require,module,exports){ module.exports = { "aliceblue": [240, 248, 255], "antiquewhite": [250, 235, 215], @@ -1174,433 +1659,14 @@ module.exports = { "yellow": [255, 255, 0], "yellowgreen": [154, 205, 50] }; -},{}],5:[function(require,module,exports){ -/* MIT license */ - -var convert = require("color-convert"), - string = require("color-string"); - -var Color = function(obj) { - if (obj instanceof Color) return obj; - if (!(this instanceof Color)) return new Color(obj); - - this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - } - - // parse Color() argument - if (typeof obj == "string") { - var vals = string.getRgba(obj); - if (vals) { - this.setValues("rgb", vals); - } else if (vals = string.getHsla(obj)) { - this.setValues("hsl", vals); - } else if (vals = string.getHwb(obj)) { - this.setValues("hwb", vals); - } else { - throw new Error("Unable to parse color from string \"" + obj + "\""); - } - } else if (typeof obj == "object") { - var vals = obj; - if (vals["r"] !== undefined || vals["red"] !== undefined) { - this.setValues("rgb", vals) - } else if (vals["l"] !== undefined || vals["lightness"] !== undefined) { - this.setValues("hsl", vals) - } else if (vals["v"] !== undefined || vals["value"] !== undefined) { - this.setValues("hsv", vals) - } else if (vals["w"] !== undefined || vals["whiteness"] !== undefined) { - this.setValues("hwb", vals) - } else if (vals["c"] !== undefined || vals["cyan"] !== undefined) { - this.setValues("cmyk", vals) - } else { - throw new Error("Unable to parse color from object " + JSON.stringify(obj)); - } - } -} - -Color.prototype = { - rgb: function(vals) { - return this.setSpace("rgb", arguments); - }, - hsl: function(vals) { - return this.setSpace("hsl", arguments); - }, - hsv: function(vals) { - return this.setSpace("hsv", arguments); - }, - hwb: function(vals) { - return this.setSpace("hwb", arguments); - }, - cmyk: function(vals) { - return this.setSpace("cmyk", arguments); - }, - - rgbArray: function() { - return this.values.rgb; - }, - hslArray: function() { - return this.values.hsl; - }, - hsvArray: function() { - return this.values.hsv; - }, - hwbArray: function() { - if (this.values.alpha !== 1) { - return this.values.hwb.concat([this.values.alpha]) - } - return this.values.hwb; - }, - cmykArray: function() { - return this.values.cmyk; - }, - rgbaArray: function() { - var rgb = this.values.rgb; - return rgb.concat([this.values.alpha]); - }, - hslaArray: function() { - var hsl = this.values.hsl; - return hsl.concat([this.values.alpha]); - }, - alpha: function(val) { - if (val === undefined) { - return this.values.alpha; - } - this.setValues("alpha", val); - return this; - }, - - red: function(val) { - return this.setChannel("rgb", 0, val); - }, - green: function(val) { - return this.setChannel("rgb", 1, val); - }, - blue: function(val) { - return this.setChannel("rgb", 2, val); - }, - hue: function(val) { - return this.setChannel("hsl", 0, val); - }, - saturation: function(val) { - return this.setChannel("hsl", 1, val); - }, - lightness: function(val) { - return this.setChannel("hsl", 2, val); - }, - saturationv: function(val) { - return this.setChannel("hsv", 1, val); - }, - whiteness: function(val) { - return this.setChannel("hwb", 1, val); - }, - blackness: function(val) { - return this.setChannel("hwb", 2, val); - }, - value: function(val) { - return this.setChannel("hsv", 2, val); - }, - cyan: function(val) { - return this.setChannel("cmyk", 0, val); - }, - magenta: function(val) { - return this.setChannel("cmyk", 1, val); - }, - yellow: function(val) { - return this.setChannel("cmyk", 2, val); - }, - black: function(val) { - return this.setChannel("cmyk", 3, val); - }, - - hexString: function() { - return string.hexString(this.values.rgb); - }, - rgbString: function() { - return string.rgbString(this.values.rgb, this.values.alpha); - }, - rgbaString: function() { - return string.rgbaString(this.values.rgb, this.values.alpha); - }, - percentString: function() { - return string.percentString(this.values.rgb, this.values.alpha); - }, - hslString: function() { - return string.hslString(this.values.hsl, this.values.alpha); - }, - hslaString: function() { - return string.hslaString(this.values.hsl, this.values.alpha); - }, - hwbString: function() { - return string.hwbString(this.values.hwb, this.values.alpha); - }, - keyword: function() { - return string.keyword(this.values.rgb, this.values.alpha); - }, - - rgbNumber: function() { - return (this.values.rgb[0] << 16) | (this.values.rgb[1] << 8) | this.values.rgb[2]; - }, - - luminosity: function() { - // http://www.w3.org/TR/WCAG20/#relativeluminancedef - var rgb = this.values.rgb; - var lum = []; - for (var i = 0; i < rgb.length; i++) { - var chan = rgb[i] / 255; - lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4) - } - return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; - }, - - contrast: function(color2) { - // http://www.w3.org/TR/WCAG20/#contrast-ratiodef - var lum1 = this.luminosity(); - var lum2 = color2.luminosity(); - if (lum1 > lum2) { - return (lum1 + 0.05) / (lum2 + 0.05) - }; - return (lum2 + 0.05) / (lum1 + 0.05); - }, - - level: function(color2) { - var contrastRatio = this.contrast(color2); - return (contrastRatio >= 7.1) ? 'AAA' : (contrastRatio >= 4.5) ? 'AA' : ''; - }, - - dark: function() { - // YIQ equation from http://24ways.org/2010/calculating-color-contrast - var rgb = this.values.rgb, - yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; - return yiq < 128; - }, - - light: function() { - return !this.dark(); - }, - - negate: function() { - var rgb = [] - for (var i = 0; i < 3; i++) { - rgb[i] = 255 - this.values.rgb[i]; - } - this.setValues("rgb", rgb); - return this; - }, - - lighten: function(ratio) { - this.values.hsl[2] += this.values.hsl[2] * ratio; - this.setValues("hsl", this.values.hsl); - return this; - }, - - darken: function(ratio) { - this.values.hsl[2] -= this.values.hsl[2] * ratio; - this.setValues("hsl", this.values.hsl); - return this; - }, - - saturate: function(ratio) { - this.values.hsl[1] += this.values.hsl[1] * ratio; - this.setValues("hsl", this.values.hsl); - return this; - }, - - desaturate: function(ratio) { - this.values.hsl[1] -= this.values.hsl[1] * ratio; - this.setValues("hsl", this.values.hsl); - return this; - }, - - whiten: function(ratio) { - this.values.hwb[1] += this.values.hwb[1] * ratio; - this.setValues("hwb", this.values.hwb); - return this; - }, - - blacken: function(ratio) { - this.values.hwb[2] += this.values.hwb[2] * ratio; - this.setValues("hwb", this.values.hwb); - return this; - }, - - greyscale: function() { - var rgb = this.values.rgb; - // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; - this.setValues("rgb", [val, val, val]); - return this; - }, - - clearer: function(ratio) { - this.setValues("alpha", this.values.alpha - (this.values.alpha * ratio)); - return this; - }, - - opaquer: function(ratio) { - this.setValues("alpha", this.values.alpha + (this.values.alpha * ratio)); - return this; - }, - - rotate: function(degrees) { - var hue = this.values.hsl[0]; - hue = (hue + degrees) % 360; - hue = hue < 0 ? 360 + hue : hue; - this.values.hsl[0] = hue; - this.setValues("hsl", this.values.hsl); - return this; - }, - - mix: function(color2, weight) { - weight = 1 - (weight == null ? 0.5 : weight); - - // algorithm from Sass's mix(). Ratio of first color in mix is - // determined by the alphas of both colors and the weight - var t1 = weight * 2 - 1, - d = this.alpha() - color2.alpha(); - - var weight1 = (((t1 * d == -1) ? t1 : (t1 + d) / (1 + t1 * d)) + 1) / 2; - var weight2 = 1 - weight1; - - var rgb = this.rgbArray(); - var rgb2 = color2.rgbArray(); - - for (var i = 0; i < rgb.length; i++) { - rgb[i] = rgb[i] * weight1 + rgb2[i] * weight2; - } - this.setValues("rgb", rgb); - - var alpha = this.alpha() * weight + color2.alpha() * (1 - weight); - this.setValues("alpha", alpha); - - return this; - }, - - toJSON: function() { - return this.rgb(); - }, - - clone: function() { - return new Color(this.rgb()); - } -} - - -Color.prototype.getValues = function(space) { - var vals = {}; - for (var i = 0; i < space.length; i++) { - vals[space.charAt(i)] = this.values[space][i]; - } - if (this.values.alpha != 1) { - vals["a"] = this.values.alpha; - } - // {r: 255, g: 255, b: 255, a: 0.4} - return vals; -} - -Color.prototype.setValues = function(space, vals) { - var spaces = { - "rgb": ["red", "green", "blue"], - "hsl": ["hue", "saturation", "lightness"], - "hsv": ["hue", "saturation", "value"], - "hwb": ["hue", "whiteness", "blackness"], - "cmyk": ["cyan", "magenta", "yellow", "black"] - }; - - var maxes = { - "rgb": [255, 255, 255], - "hsl": [360, 100, 100], - "hsv": [360, 100, 100], - "hwb": [360, 100, 100], - "cmyk": [100, 100, 100, 100] - }; - - var alpha = 1; - if (space == "alpha") { - alpha = vals; - } else if (vals.length) { - // [10, 10, 10] - this.values[space] = vals.slice(0, space.length); - alpha = vals[space.length]; - } else if (vals[space.charAt(0)] !== undefined) { - // {r: 10, g: 10, b: 10} - for (var i = 0; i < space.length; i++) { - this.values[space][i] = vals[space.charAt(i)]; - } - alpha = vals.a; - } else if (vals[spaces[space][0]] !== undefined) { - // {red: 10, green: 10, blue: 10} - var chans = spaces[space]; - for (var i = 0; i < space.length; i++) { - this.values[space][i] = vals[chans[i]]; - } - alpha = vals.alpha; - } - this.values.alpha = Math.max(0, Math.min(1, (alpha !== undefined ? alpha : this.values.alpha))); - if (space == "alpha") { - return; - } - - // cap values of the space prior converting all values - for (var i = 0; i < space.length; i++) { - var capped = Math.max(0, Math.min(maxes[space][i], this.values[space][i])); - this.values[space][i] = Math.round(capped); - } - - // convert to all the other color spaces - for (var sname in spaces) { - if (sname != space) { - this.values[sname] = convert[space][sname](this.values[space]) - } - - // cap values - for (var i = 0; i < sname.length; i++) { - var capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i])); - this.values[sname][i] = Math.round(capped); - } - } - return true; -} - -Color.prototype.setSpace = function(space, args) { - var vals = args[0]; - if (vals === undefined) { - // color.rgb() - return this.getValues(space); - } - // color.rgb(10, 10, 10) - if (typeof vals == "number") { - vals = Array.prototype.slice.call(args); - } - this.setValues(space, vals); - return this; -} - -Color.prototype.setChannel = function(space, index, val) { - if (val === undefined) { - // color.red() - return this.values[space][index]; - } - // color.red(100) - this.values[space][index] = val; - this.setValues(space, this.values[space]); - return this; -} - -window.Color = module.exports = Color - -},{"color-convert":2,"color-string":3}],6:[function(require,module,exports){ +},{}],6:[function(require,module,exports){ //! moment.js -//! version : 2.10.6 +//! version : 2.13.0 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com -(function (global, factory) { +;(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory() @@ -1619,7 +1685,7 @@ window.Color = module.exports = Color } function isArray(input) { - return Object.prototype.toString.call(input) === '[object Array]'; + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; } function isDate(input) { @@ -1672,7 +1738,9 @@ window.Color = module.exports = Color invalidMonth : null, invalidFormat : false, userInvalidated : false, - iso : false + iso : false, + parsedDateParts : [], + meridiem : null }; } @@ -1683,9 +1751,30 @@ window.Color = module.exports = Color return m._pf; } + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + function valid__isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); m._isValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && @@ -1693,7 +1782,8 @@ window.Color = module.exports = Color !flags.invalidWeekday && !flags.nullInput && !flags.invalidFormat && - !flags.userInvalidated; + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { m._isValid = m._isValid && @@ -1717,39 +1807,45 @@ window.Color = module.exports = Color return m; } + function isUndefined(input) { + return input === void 0; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. var momentProperties = utils_hooks__hooks.momentProperties = []; function copyConfig(to, from) { var i, prop, val; - if (typeof from._isAMomentObject !== 'undefined') { + if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } - if (typeof from._i !== 'undefined') { + if (!isUndefined(from._i)) { to._i = from._i; } - if (typeof from._f !== 'undefined') { + if (!isUndefined(from._f)) { to._f = from._f; } - if (typeof from._l !== 'undefined') { + if (!isUndefined(from._l)) { to._l = from._l; } - if (typeof from._strict !== 'undefined') { + if (!isUndefined(from._strict)) { to._strict = from._strict; } - if (typeof from._tzm !== 'undefined') { + if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } - if (typeof from._isUTC !== 'undefined') { + if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } - if (typeof from._offset !== 'undefined') { + if (!isUndefined(from._offset)) { to._offset = from._offset; } - if (typeof from._pf !== 'undefined') { + if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } - if (typeof from._locale !== 'undefined') { + if (!isUndefined(from._locale)) { to._locale = from._locale; } @@ -1757,7 +1853,7 @@ window.Color = module.exports = Color for (i in momentProperties) { prop = momentProperties[i]; val = from[prop]; - if (typeof val !== 'undefined') { + if (!isUndefined(val)) { to[prop] = val; } } @@ -1804,6 +1900,7 @@ window.Color = module.exports = Color return value; } + // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), @@ -1818,9 +1915,108 @@ window.Color = module.exports = Color return diffs + lengthDiff; } - function Locale() { + function warn(msg) { + if (utils_hooks__hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } } + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (utils_hooks__hooks.deprecationHandler != null) { + utils_hooks__hooks.deprecationHandler(null, msg); + } + if (firstTime) { + warn(msg + '\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (utils_hooks__hooks.deprecationHandler != null) { + utils_hooks__hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + utils_hooks__hooks.suppressDeprecationWarnings = false; + utils_hooks__hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function isObject(input) { + return Object.prototype.toString.call(input) === '[object Object]'; + } + + function locale_set__set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + // internal storage for locale config files var locales = {}; var globalLocale; @@ -1858,7 +2054,7 @@ window.Color = module.exports = Color function loadLocale(name) { var oldLocale = null; // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && typeof module !== 'undefined' && + if (!locales[name] && (typeof module !== 'undefined') && module && module.exports) { try { oldLocale = globalLocale._abbr; @@ -1877,7 +2073,7 @@ window.Color = module.exports = Color function locale_locales__getSetGlobalLocale (key, values) { var data; if (key) { - if (typeof values === 'undefined') { + if (isUndefined(values)) { data = locale_locales__getLocale(key); } else { @@ -1893,11 +2089,25 @@ window.Color = module.exports = Color return globalLocale._abbr; } - function defineLocale (name, values) { - if (values !== null) { - values.abbr = name; - locales[name] = locales[name] || new Locale(); - locales[name].set(values); + function defineLocale (name, config) { + if (config !== null) { + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale'); + config = mergeConfigs(locales[name]._config, config); + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + config = mergeConfigs(locales[config.parentLocale]._config, config); + } else { + // treat as if there is no base config + deprecateSimple('parentLocaleUndefined', + 'specified parentLocale is not defined yet'); + } + } + locales[name] = new Locale(config); // backwards compat for now: also set the locale locale_locales__getSetGlobalLocale(name); @@ -1910,6 +2120,31 @@ window.Color = module.exports = Color } } + function updateLocale(name, config) { + if (config != null) { + var locale; + if (locales[name] != null) { + config = mergeConfigs(locales[name]._config, config); + } + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + locale_locales__getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + // returns locale data function locale_locales__getLocale (key) { var locale; @@ -1934,6 +2169,10 @@ window.Color = module.exports = Color return chooseLocale(key); } + function locale_locales__listLocales() { + return keys(locales); + } + var aliases = {}; function addUnitAlias (unit, shorthand) { @@ -1975,11 +2214,14 @@ window.Color = module.exports = Color } function get_set__get (mom, unit) { - return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function get_set__set (mom, unit, value) { - return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + if (mom.isValid()) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } } // MOMENTS @@ -1992,7 +2234,7 @@ window.Color = module.exports = Color } } else { units = normalizeUnits(units); - if (typeof this[units] === 'function') { + if (isFunction(this[units])) { return this[units](value); } } @@ -2007,7 +2249,7 @@ window.Color = module.exports = Color Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; } - var formattingTokens = /(\[[^\[]*\])|(\\)?(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,9}|x|X|zz?|ZZ?|.)/g; + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; @@ -2060,7 +2302,7 @@ window.Color = module.exports = Color } return function (mom) { - var output = ''; + var output = '', i; for (i = 0; i < length; i++) { output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; } @@ -2103,6 +2345,8 @@ window.Color = module.exports = Color var match4 = /\d{4}/; // 0000 - 9999 var match6 = /[+-]?\d{6}/; // -999999 - 999999 var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 var match1to3 = /\d{1,3}/; // 0 - 999 var match1to4 = /\d{1,4}/; // 0 - 9999 var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 @@ -2111,23 +2355,19 @@ window.Color = module.exports = Color var matchSigned = /[+-]?\d+/; // -inf - inf var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; + var regexes = {}; - function isFunction (sth) { - // https://github.com/moment/moment/issues/2325 - return typeof sth === 'function' && - Object.prototype.toString.call(sth) === '[object Function]'; - } - - function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return (isStrict && strictRegex) ? strictRegex : regex; }; } @@ -2142,9 +2382,13 @@ window.Color = module.exports = Color // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { - return s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; - }).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; @@ -2184,6 +2428,25 @@ window.Color = module.exports = Color var MINUTE = 4; var SECOND = 5; var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } function daysInMonth(year, month) { return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); @@ -2211,8 +2474,12 @@ window.Color = module.exports = Color addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', matchWord); - addRegexToken('MMMM', matchWord); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; @@ -2230,25 +2497,76 @@ window.Color = module.exports = Color // LOCALES + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/; var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m) { - return this._months[m.month()]; + function localeMonths (m, format) { + return isArray(this._months) ? this._months[m.month()] : + this._months[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m) { - return this._monthsShort[m.month()]; + function localeMonthsShort (m, format) { + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function units_month__handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = create_utc__createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } } function localeMonthsParse (monthName, format, strict) { var i, mom, regex; + if (this._monthsParseExact) { + return units_month__handleStrictParse.call(this, monthName, format, strict); + } + if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = create_utc__createUTC([2000, i]); @@ -2276,12 +2594,20 @@ window.Color = module.exports = Color function setMonth (mom, value) { var dayOfMonth; - // TODO: Move this out of here! + if (!mom.isValid()) { + // No op + return mom; + } + if (typeof value === 'string') { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (typeof value !== 'number') { - return mom; + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } } } @@ -2304,6 +2630,72 @@ window.Color = module.exports = Color return daysInMonth(this.year(), this.month()); } + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + function checkOverflow (m) { var overflow; var a = m._a; @@ -2321,6 +2713,12 @@ window.Color = module.exports = Color if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } getParsingFlags(m).overflow = overflow; } @@ -2328,51 +2726,39 @@ window.Color = module.exports = Color return m; } - function warn(msg) { - if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; - function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (firstTime) { - warn(msg + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - var deprecations = {}; - - function deprecateSimple(name, msg) { - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } - } - - utils_hooks__hooks.suppressDeprecationWarnings = false; - - var from_string__isoRegex = /^\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)?)?$/; + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; var isoDates = [ - ['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}/] + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] ]; // iso time formats and regexes var isoTimes = [ - ['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/] + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] ]; var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; @@ -2381,26 +2767,49 @@ window.Color = module.exports = Color function configFromISO(config) { var i, l, string = config._i, - match = from_string__isoRegex.exec(string); + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(string)) { - config._f = isoDates[i][0]; + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; break; } } - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(string)) { - // match[6] should be 'T' or space - config._f += (match[6] || ' ') + isoTimes[i][0]; - break; + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; } } - if (string.match(matchOffset)) { - config._f += 'Z'; + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; @@ -2438,8 +2847,8 @@ window.Color = module.exports = Color //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply var date = new Date(y, m, d, h, M, s, ms); - //the date constructor doesn't accept years < 1970 - if (y < 1970) { + //the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { date.setFullYear(y); } return date; @@ -2447,12 +2856,21 @@ window.Color = module.exports = Color function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, arguments)); - if (y < 1970) { + + //the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } return date; } + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); @@ -2480,6 +2898,9 @@ window.Color = module.exports = Color addParseToken('YY', function (input, array) { array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); // HELPERS @@ -2499,130 +2920,72 @@ window.Color = module.exports = Color // MOMENTS - var getSetYear = makeGetSet('FullYear', false); + var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear () { return isLeapYear(this.year()); } - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - // ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - - // PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - - // HELPERS - - // firstDayOfWeek 0 = sun, 6 = sat - // the day of the week that starts the week - // (usually sunday or monday) - // firstDayOfWeekOfYear 0 = sun, 6 = sat - // the first week is the week that contains the first - // of this day of the week - // (eg. ISO weeks use thursday (4)) - function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { - var end = firstDayOfWeekOfYear - firstDayOfWeek, - daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), - adjustedMoment; - - - if (daysToDayOfWeek > end) { - daysToDayOfWeek -= 7; - } - - if (daysToDayOfWeek < end - 7) { - daysToDayOfWeek += 7; - } - - adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd'); - return { - week: Math.ceil(adjustedMoment.dayOfYear() / 7), - year: adjustedMoment.year() - }; + return -fwdlw + fwd - 1; } - // LOCALES - - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }; - - function localeFirstDayOfWeek () { - return this._week.dow; - } - - function localeFirstDayOfYear () { - return this._week.doy; - } - - // MOMENTS - - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - - // ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - - // PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - - // HELPERS - //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var week1Jan = 6 + firstDayOfWeek - firstDayOfWeekOfYear, janX = createUTCDate(year, 0, 1 + week1Jan), d = janX.getUTCDay(), dayOfYear; - if (d < firstDayOfWeek) { - d += 7; + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; } - weekday = weekday != null ? 1 * weekday : firstDayOfWeek; - - dayOfYear = 1 + week1Jan + 7 * (week - 1) - d + weekday; - return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + year: resYear, + dayOfYear: resDayOfYear }; } - // MOMENTS + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // Pick the first defined of two or three arguments. @@ -2637,11 +3000,12 @@ window.Color = module.exports = Color } function currentDateArray(config) { - var now = new Date(); + // hooks is actually the exported moment object + var nowValue = new Date(utils_hooks__hooks.now()); if (config._useUTC) { - return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()]; + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; } - return [now.getFullYear(), now.getMonth(), now.getDate()]; + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. @@ -2711,7 +3075,7 @@ window.Color = module.exports = Color } function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp; + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; w = config._w; if (w.GG != null || w.W != null || w.E != null) { @@ -2725,6 +3089,9 @@ window.Color = module.exports = Color weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); week = defaults(w.W, 1); weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; @@ -2735,23 +3102,32 @@ window.Color = module.exports = Color if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; - if (weekday < dow) { - ++week; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from begining of week weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } } else { // default to begining of week weekday = dow; } } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } } + // constant that refers to the ISO standard utils_hooks__hooks.ISO_8601 = function () {}; // date from string and format string @@ -2776,6 +3152,8 @@ window.Color = module.exports = Color for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { @@ -2811,6 +3189,9 @@ window.Color = module.exports = Color config._a[HOUR] > 0) { getParsingFlags(config).bigHour = undefined; } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); @@ -2844,6 +3225,7 @@ window.Color = module.exports = Color } } + // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, @@ -2894,7 +3276,9 @@ window.Color = module.exports = Color } var i = normalizeObjectUnits(config._i); - config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond]; + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); configFromArray(config); } @@ -2936,15 +3320,19 @@ window.Color = module.exports = Color configFromInput(config); } + if (!valid__isValid(config)) { + config._d = null; + } + return config; } function configFromInput(config) { var input = config._i; if (input === undefined) { - config._d = new Date(); + config._d = new Date(utils_hooks__hooks.now()); } else if (isDate(input)) { - config._d = new Date(+input); + config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { @@ -2986,18 +3374,26 @@ window.Color = module.exports = Color } var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + 'moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', function () { var other = local__createLocal.apply(null, arguments); - return other < this ? this : other; + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return valid__createInvalid(); + } } ); var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + 'moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', function () { var other = local__createLocal.apply(null, arguments); - return other > this ? this : other; + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return valid__createInvalid(); + } } ); @@ -3036,6 +3432,10 @@ window.Color = module.exports = Color return pickBy('isAfter', args); } + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + function Duration (duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, @@ -3052,7 +3452,7 @@ window.Color = module.exports = Color this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 - hours * 36e5; // 1000 * 60 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + @@ -3075,6 +3475,8 @@ window.Color = module.exports = Color return obj instanceof Duration; } + // FORMATTING + function offset (token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(); @@ -3092,11 +3494,11 @@ window.Color = module.exports = Color // PARSING - addRegexToken('Z', matchOffset); - addRegexToken('ZZ', matchOffset); + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; - config._tzm = offsetFromString(input); + config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS @@ -3106,8 +3508,8 @@ window.Color = module.exports = Color // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; - function offsetFromString(string) { - var matches = ((string || '').match(matchOffset) || []); + function offsetFromString(matcher, string) { + var matches = ((string || '').match(matcher) || []); var chunk = matches[matches.length - 1] || []; var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; var minutes = +(parts[1] * 60) + toInt(parts[2]); @@ -3120,9 +3522,9 @@ window.Color = module.exports = Color var res, diff; if (model._isUTC) { res = model.clone(); - diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. - res._d.setTime(+res._d + diff); + res._d.setTime(res._d.valueOf() + diff); utils_hooks__hooks.updateOffset(res, false); return res; } else { @@ -3157,11 +3559,13 @@ window.Color = module.exports = Color function getSetOffset (input, keepLocalTime) { var offset = this._offset || 0, localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } if (input != null) { if (typeof input === 'string') { - input = offsetFromString(input); - } - if (Math.abs(input) < 16) { + input = offsetFromString(matchShortOffset, input); + } else if (Math.abs(input) < 16) { input = input * 60; } if (!this._isUTC && keepLocalTime) { @@ -3221,12 +3625,15 @@ window.Color = module.exports = Color if (this._tzm) { this.utcOffset(this._tzm); } else if (typeof this._i === 'string') { - this.utcOffset(offsetFromString(this._i)); + this.utcOffset(offsetFromString(matchOffset, this._i)); } return this; } function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } input = input ? local__createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; @@ -3240,7 +3647,7 @@ window.Color = module.exports = Color } function isDaylightSavingTimeShifted () { - if (typeof this._isDSTShifted !== 'undefined') { + if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } @@ -3261,22 +3668,24 @@ window.Color = module.exports = Color } function isLocal () { - return !this._isUTC; + return this.isValid() ? !this._isUTC : false; } function isUtcOffset () { - return this._isUTC; + return this.isValid() ? this._isUTC : false; } function isUtc () { - return this._isUTC && this._offset === 0; + return this.isValid() ? this._isUTC && this._offset === 0 : false; } - var aspNetRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/; + // ASP.NET json date format regex + var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/; + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/; function create__createDuration (input, key) { var duration = input, @@ -3309,16 +3718,16 @@ window.Color = module.exports = Color s : toInt(match[SECOND]) * sign, ms : toInt(match[MILLISECOND]) * sign }; - } else if (!!(match = create__isoRegex.exec(input))) { + } else if (!!(match = isoRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y : parseIso(match[2], sign), M : parseIso(match[3], sign), - d : parseIso(match[4], sign), - h : parseIso(match[5], sign), - m : parseIso(match[6], sign), - s : parseIso(match[7], sign), - w : parseIso(match[8], sign) + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) }; } else if (duration == null) {// checks for null or undefined duration = {}; @@ -3366,6 +3775,10 @@ window.Color = module.exports = Color function momentsDifference(base, other) { var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); @@ -3378,6 +3791,15 @@ window.Color = module.exports = Color return res; } + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; @@ -3396,12 +3818,18 @@ window.Color = module.exports = Color function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, - days = duration._days, - months = duration._months; + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + updateOffset = updateOffset == null ? true : updateOffset; if (milliseconds) { - mom._d.setTime(+mom._d + milliseconds * isAdding); + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (days) { get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding); @@ -3429,7 +3857,10 @@ window.Color = module.exports = Color diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; - return this.format(formats && formats[format] || this.localeData().calendar(format, this, local__createLocal(now))); + + var output = formats && (isFunction(formats[format]) ? formats[format]() : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, local__createLocal(now))); } function clone () { @@ -3437,50 +3868,77 @@ window.Color = module.exports = Color } function isAfter (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { - input = isMoment(input) ? input : local__createLocal(input); - return +this > +input; + return this.valueOf() > localInput.valueOf(); } else { - inputMs = isMoment(input) ? +input : +local__createLocal(input); - return inputMs < +this.clone().startOf(units); + return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore (input, units) { - var inputMs; - units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { - input = isMoment(input) ? input : local__createLocal(input); - return +this < +input; + return this.valueOf() < localInput.valueOf(); } else { - inputMs = isMoment(input) ? +input : +local__createLocal(input); - return +this.clone().endOf(units) < inputMs; + return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } - function isBetween (from, to, units) { - return this.isAfter(from, units) && this.isBefore(to, units); + function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); } function isSame (input, units) { - var inputMs; + var localInput = isMoment(input) ? input : local__createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } units = normalizeUnits(units || 'millisecond'); if (units === 'millisecond') { - input = isMoment(input) ? input : local__createLocal(input); - return +this === +input; + return this.valueOf() === localInput.valueOf(); } else { - inputMs = +local__createLocal(input); - return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); } } + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); + } + function diff (input, units, asFloat) { - var that = cloneWithOffset(input, this), - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4, + var that, + zoneDelta, delta, output; + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + units = normalizeUnits(units); if (units === 'year' || units === 'month' || units === 'quarter') { @@ -3519,10 +3977,12 @@ window.Color = module.exports = Color adjust = (b - anchor) / (anchor2 - anchor); } - return -(wholeMonthDiff + adjust); + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; } utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); @@ -3531,7 +3991,7 @@ window.Color = module.exports = Color function moment_format__toISOString () { var m = this.clone().utc(); if (0 < m.year() && m.year() <= 9999) { - if ('function' === typeof Date.prototype.toISOString) { + if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can return this.toDate().toISOString(); } else { @@ -3543,15 +4003,21 @@ window.Color = module.exports = Color } function format (inputString) { - var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat); + if (!inputString) { + inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat; + } + var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from (time, withoutSuffix) { - if (!this.isValid()) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { return this.localeData().invalidDate(); } - return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); } function fromNow (withoutSuffix) { @@ -3559,16 +4025,22 @@ window.Color = module.exports = Color } function to (time, withoutSuffix) { - if (!this.isValid()) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { return this.localeData().invalidDate(); } - return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); } function toNow (withoutSuffix) { return this.to(local__createLocal(), withoutSuffix); } + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. function locale (key) { var newLocaleData; @@ -3613,6 +4085,7 @@ window.Color = module.exports = Color case 'week': case 'isoWeek': case 'day': + case 'date': this.hours(0); /* falls through */ case 'hour': @@ -3646,19 +4119,25 @@ window.Color = module.exports = Color if (units === undefined || units === 'millisecond') { return this; } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); } function to_type__valueOf () { - return +this._d - ((this._offset || 0) * 60000); + return this._d.valueOf() - ((this._offset || 0) * 60000); } function unix () { - return Math.floor(+this / 1000); + return Math.floor(this.valueOf() / 1000); } function toDate () { - return this._offset ? new Date(+this) : this._d; + return this._offset ? new Date(this.valueOf()) : this._d; } function toArray () { @@ -3679,6 +4158,11 @@ window.Color = module.exports = Color }; } + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + function moment_valid__isValid () { return valid__isValid(this); } @@ -3691,6 +4175,18 @@ window.Color = module.exports = Color return getParsingFlags(this).overflow; } + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); @@ -3732,22 +4228,20 @@ window.Color = module.exports = Color week[token] = utils_hooks__hooks.parseTwoDigitYear(input); }); - // HELPERS - - function weeksInYear(year, dow, doy) { - return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week; - } - // MOMENTS function getSetWeekYear (input) { - var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; - return input == null ? year : this.add((input - year), 'y'); + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); } function getSetISOWeekYear (input) { - var year = weekOfYear(this, 1, 4).year; - return input == null ? year : this.add((input - year), 'y'); + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); } function getISOWeeksInYear () { @@ -3759,7 +4253,32 @@ window.Color = module.exports = Color return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } - addFormatToken('Q', 0, 0, 'quarter'); + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES @@ -3778,6 +4297,62 @@ window.Color = module.exports = Color return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); } + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES @@ -3801,6 +4376,8 @@ window.Color = module.exports = Color var getSetDayOfMonth = makeGetSet('Date', true); + // FORMATTING + addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { @@ -3829,12 +4406,18 @@ window.Color = module.exports = Color addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); - addRegexToken('dd', matchWord); - addRegexToken('ddd', matchWord); - addRegexToken('dddd', matchWord); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) { - var weekday = config._locale.weekdaysParse(input); + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; @@ -3869,8 +4452,9 @@ window.Color = module.exports = Color // LOCALES var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m) { - return this._weekdays[m.day()]; + function localeWeekdays (m, format) { + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; } var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); @@ -3883,20 +4467,105 @@ window.Color = module.exports = Color return this._weekdaysMin[m.day()]; } - function localeWeekdaysParse (weekdayName) { + function day_of_week__handleStrictParse(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = create_utc__createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse (weekdayName, format, strict) { var i, mom, regex; - this._weekdaysParse = this._weekdaysParse || []; + if (this._weekdaysParseExact) { + return day_of_week__handleStrictParse.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } for (i = 0; i < 7; i++) { // make the regex if we don't have it already + + mom = create_utc__createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } if (!this._weekdaysParse[i]) { - mom = local__createLocal([2000, 1]).day(i); regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex - if (this._weekdaysParse[i].test(weekdayName)) { + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } @@ -3905,6 +4574,9 @@ window.Color = module.exports = Color // MOMENTS function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); @@ -3915,20 +4587,171 @@ window.Color = module.exports = Color } function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); } - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, function () { + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + function hFormat() { return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { @@ -3957,6 +4780,11 @@ window.Color = module.exports = Color addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + addParseToken(['H', 'HH'], HOUR); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); @@ -3966,6 +4794,32 @@ window.Color = module.exports = Color array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); // LOCALES @@ -3993,6 +4847,8 @@ window.Color = module.exports = Color // this rule. var getSetHour = makeGetSet('Hours', true); + // FORMATTING + addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES @@ -4009,6 +4865,8 @@ window.Color = module.exports = Color var getSetMinute = makeGetSet('Minutes', false); + // FORMATTING + addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES @@ -4025,6 +4883,8 @@ window.Color = module.exports = Color var getSetSecond = makeGetSet('Seconds', false); + // FORMATTING + addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); @@ -4080,6 +4940,8 @@ window.Color = module.exports = Color var getSetMillisecond = makeGetSet('Milliseconds', false); + // FORMATTING + addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); @@ -4095,40 +4957,43 @@ window.Color = module.exports = Color var momentPrototype__proto = Moment.prototype; - momentPrototype__proto.add = add_subtract__add; - momentPrototype__proto.calendar = moment_calendar__calendar; - momentPrototype__proto.clone = clone; - momentPrototype__proto.diff = diff; - momentPrototype__proto.endOf = endOf; - momentPrototype__proto.format = format; - momentPrototype__proto.from = from; - momentPrototype__proto.fromNow = fromNow; - momentPrototype__proto.to = to; - momentPrototype__proto.toNow = toNow; - momentPrototype__proto.get = getSet; - momentPrototype__proto.invalidAt = invalidAt; - momentPrototype__proto.isAfter = isAfter; - momentPrototype__proto.isBefore = isBefore; - momentPrototype__proto.isBetween = isBetween; - momentPrototype__proto.isSame = isSame; - momentPrototype__proto.isValid = moment_valid__isValid; - momentPrototype__proto.lang = lang; - momentPrototype__proto.locale = locale; - momentPrototype__proto.localeData = localeData; - momentPrototype__proto.max = prototypeMax; - momentPrototype__proto.min = prototypeMin; - momentPrototype__proto.parsingFlags = parsingFlags; - momentPrototype__proto.set = getSet; - momentPrototype__proto.startOf = startOf; - momentPrototype__proto.subtract = add_subtract__subtract; - momentPrototype__proto.toArray = toArray; - momentPrototype__proto.toObject = toObject; - momentPrototype__proto.toDate = toDate; - momentPrototype__proto.toISOString = moment_format__toISOString; - momentPrototype__proto.toJSON = moment_format__toISOString; - momentPrototype__proto.toString = toString; - momentPrototype__proto.unix = unix; - momentPrototype__proto.valueOf = to_type__valueOf; + momentPrototype__proto.add = add_subtract__add; + momentPrototype__proto.calendar = moment_calendar__calendar; + momentPrototype__proto.clone = clone; + momentPrototype__proto.diff = diff; + momentPrototype__proto.endOf = endOf; + momentPrototype__proto.format = format; + momentPrototype__proto.from = from; + momentPrototype__proto.fromNow = fromNow; + momentPrototype__proto.to = to; + momentPrototype__proto.toNow = toNow; + momentPrototype__proto.get = getSet; + momentPrototype__proto.invalidAt = invalidAt; + momentPrototype__proto.isAfter = isAfter; + momentPrototype__proto.isBefore = isBefore; + momentPrototype__proto.isBetween = isBetween; + momentPrototype__proto.isSame = isSame; + momentPrototype__proto.isSameOrAfter = isSameOrAfter; + momentPrototype__proto.isSameOrBefore = isSameOrBefore; + momentPrototype__proto.isValid = moment_valid__isValid; + momentPrototype__proto.lang = lang; + momentPrototype__proto.locale = locale; + momentPrototype__proto.localeData = localeData; + momentPrototype__proto.max = prototypeMax; + momentPrototype__proto.min = prototypeMin; + momentPrototype__proto.parsingFlags = parsingFlags; + momentPrototype__proto.set = getSet; + momentPrototype__proto.startOf = startOf; + momentPrototype__proto.subtract = add_subtract__subtract; + momentPrototype__proto.toArray = toArray; + momentPrototype__proto.toObject = toObject; + momentPrototype__proto.toDate = toDate; + momentPrototype__proto.toISOString = moment_format__toISOString; + momentPrototype__proto.toJSON = toJSON; + momentPrototype__proto.toString = toString; + momentPrototype__proto.unix = unix; + momentPrototype__proto.valueOf = to_type__valueOf; + momentPrototype__proto.creationData = creationData; // Year momentPrototype__proto.year = getSetYear; @@ -4214,7 +5079,7 @@ window.Color = module.exports = Color function locale_calendar__calendar (key, mom, now) { var output = this._calendar[key]; - return typeof output === 'function' ? output.call(mom, now) : output; + return isFunction(output) ? output.call(mom, now) : output; } var defaultLongDateFormat = { @@ -4276,29 +5141,14 @@ window.Color = module.exports = Color function relative__relativeTime (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; - return (typeof output === 'function') ? + return (isFunction(output)) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); - } - - function locale_set__set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (typeof prop === 'function') { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _ordinalParseLenient. - this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); + return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var prototype__proto = Locale.prototype; @@ -4320,11 +5170,15 @@ window.Color = module.exports = Color prototype__proto.set = locale_set__set; // Month - prototype__proto.months = localeMonths; - prototype__proto._months = defaultLocaleMonths; - prototype__proto.monthsShort = localeMonthsShort; - prototype__proto._monthsShort = defaultLocaleMonthsShort; - prototype__proto.monthsParse = localeMonthsParse; + prototype__proto.months = localeMonths; + prototype__proto._months = defaultLocaleMonths; + prototype__proto.monthsShort = localeMonthsShort; + prototype__proto._monthsShort = defaultLocaleMonthsShort; + prototype__proto.monthsParse = localeMonthsParse; + prototype__proto._monthsRegex = defaultMonthsRegex; + prototype__proto.monthsRegex = monthsRegex; + prototype__proto._monthsShortRegex = defaultMonthsShortRegex; + prototype__proto.monthsShortRegex = monthsShortRegex; // Week prototype__proto.week = localeWeek; @@ -4341,6 +5195,13 @@ window.Color = module.exports = Color prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort; prototype__proto.weekdaysParse = localeWeekdaysParse; + prototype__proto._weekdaysRegex = defaultWeekdaysRegex; + prototype__proto.weekdaysRegex = weekdaysRegex; + prototype__proto._weekdaysShortRegex = defaultWeekdaysShortRegex; + prototype__proto.weekdaysShortRegex = weekdaysShortRegex; + prototype__proto._weekdaysMinRegex = defaultWeekdaysMinRegex; + prototype__proto.weekdaysMinRegex = weekdaysMinRegex; + // Hours prototype__proto.isPM = localeIsPM; prototype__proto._meridiemParse = defaultLocaleMeridiemParse; @@ -4352,7 +5213,7 @@ window.Color = module.exports = Color return locale[field](utc, format); } - function list (format, index, field, count, setter) { + function listMonthsImpl (format, index, field) { if (typeof format === 'number') { index = format; format = undefined; @@ -4361,35 +5222,79 @@ window.Color = module.exports = Color format = format || ''; if (index != null) { - return lists__get(format, index, field, setter); + return lists__get(format, index, field, 'month'); } var i; var out = []; - for (i = 0; i < count; i++) { - out[i] = lists__get(format, i, field, setter); + for (i = 0; i < 12; i++) { + out[i] = lists__get(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = locale_locales__getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return lists__get(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = lists__get(format, (i + shift) % 7, field, 'day'); } return out; } function lists__listMonths (format, index) { - return list(format, index, 'months', 12, 'month'); + return listMonthsImpl(format, index, 'months'); } function lists__listMonthsShort (format, index) { - return list(format, index, 'monthsShort', 12, 'month'); + return listMonthsImpl(format, index, 'monthsShort'); } - function lists__listWeekdays (format, index) { - return list(format, index, 'weekdays', 7, 'day'); + function lists__listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } - function lists__listWeekdaysShort (format, index) { - return list(format, index, 'weekdaysShort', 7, 'day'); + function lists__listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } - function lists__listWeekdaysMin (format, index) { - return list(format, index, 'weekdaysMin', 7, 'day'); + function lists__listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } locale_locales__getSetGlobalLocale('en', { @@ -4612,15 +5517,15 @@ window.Color = module.exports = Color var years = round(duration.as('y')); var a = seconds < thresholds.s && ['s', seconds] || - minutes === 1 && ['m'] || + minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || - hours === 1 && ['h'] || + hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || - days === 1 && ['d'] || + days <= 1 && ['d'] || days < thresholds.d && ['dd', days] || - months === 1 && ['M'] || + months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || - years === 1 && ['y'] || ['yy', years]; + years <= 1 && ['y'] || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; @@ -4741,6 +5646,8 @@ window.Color = module.exports = Color // Side effect imports + // FORMATTING + addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); @@ -4758,13 +5665,14 @@ window.Color = module.exports = Color // Side effect imports - utils_hooks__hooks.version = '2.10.6'; + utils_hooks__hooks.version = '2.13.0'; setHookCallback(local__createLocal); utils_hooks__hooks.fn = momentPrototype; utils_hooks__hooks.min = min; utils_hooks__hooks.max = max; + utils_hooks__hooks.now = now; utils_hooks__hooks.utc = create_utc__createUTC; utils_hooks__hooks.unix = moment__createUnix; utils_hooks__hooks.months = lists__listMonths; @@ -4780,9 +5688,12 @@ window.Color = module.exports = Color utils_hooks__hooks.monthsShort = lists__listMonthsShort; utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin; utils_hooks__hooks.defineLocale = defineLocale; + utils_hooks__hooks.updateLocale = updateLocale; + utils_hooks__hooks.locales = locale_locales__listLocales; utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; utils_hooks__hooks.normalizeUnits = normalizeUnits; utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; + utils_hooks__hooks.prototype = momentPrototype; var _moment = utils_hooks__hooks; @@ -4790,742 +5701,701 @@ window.Color = module.exports = Color })); },{}],7:[function(require,module,exports){ -var Chart = require('./core/core.js')(); - -require('./core/core.helpers')(Chart); -require('./core/core.element')(Chart); -require('./core/core.animation')(Chart); -require('./core/core.controller')(Chart); -require('./core/core.datasetController')(Chart); -require('./core/core.layoutService')(Chart); -require('./core/core.legend')(Chart); -require('./core/core.plugin.js')(Chart); -require('./core/core.scale')(Chart); -require('./core/core.scaleService')(Chart); -require('./core/core.title')(Chart); -require('./core/core.tooltip')(Chart); - -require('./controllers/controller.bar')(Chart); -require('./controllers/controller.bubble')(Chart); -require('./controllers/controller.doughnut')(Chart); -require('./controllers/controller.line')(Chart); -require('./controllers/controller.polarArea')(Chart); -require('./controllers/controller.radar')(Chart); - -require('./scales/scale.category')(Chart); -require('./scales/scale.linear')(Chart); -require('./scales/scale.logarithmic')(Chart); -require('./scales/scale.radialLinear')(Chart); -require('./scales/scale.time')(Chart); - -require('./elements/element.arc')(Chart); -require('./elements/element.line')(Chart); -require('./elements/element.point')(Chart); -require('./elements/element.rectangle')(Chart); - -require('./charts/Chart.Bar')(Chart); -require('./charts/Chart.Bubble')(Chart); -require('./charts/Chart.Doughnut')(Chart); -require('./charts/Chart.Line')(Chart); -require('./charts/Chart.PolarArea')(Chart); -require('./charts/Chart.Radar')(Chart); -require('./charts/Chart.Scatter')(Chart); - -window.Chart = module.exports = Chart; +var Chart = require('./core/core.js')(); + +require('./core/core.helpers')(Chart); +require('./core/core.element')(Chart); +require('./core/core.animation')(Chart); +require('./core/core.controller')(Chart); +require('./core/core.datasetController')(Chart); +require('./core/core.layoutService')(Chart); +require('./core/core.legend')(Chart); +require('./core/core.plugin.js')(Chart); +require('./core/core.scale')(Chart); +require('./core/core.scaleService')(Chart); +require('./core/core.title')(Chart); +require('./core/core.tooltip')(Chart); + +require('./elements/element.arc')(Chart); +require('./elements/element.line')(Chart); +require('./elements/element.point')(Chart); +require('./elements/element.rectangle')(Chart); + +require('./scales/scale.category')(Chart); +require('./scales/scale.linear')(Chart); +require('./scales/scale.logarithmic')(Chart); +require('./scales/scale.radialLinear')(Chart); +require('./scales/scale.time')(Chart); + +// Controllers must be loaded after elements +// See Chart.core.datasetController.dataElementType +require('./controllers/controller.bar')(Chart); +require('./controllers/controller.bubble')(Chart); +require('./controllers/controller.doughnut')(Chart); +require('./controllers/controller.line')(Chart); +require('./controllers/controller.polarArea')(Chart); +require('./controllers/controller.radar')(Chart); + +require('./charts/Chart.Bar')(Chart); +require('./charts/Chart.Bubble')(Chart); +require('./charts/Chart.Doughnut')(Chart); +require('./charts/Chart.Line')(Chart); +require('./charts/Chart.PolarArea')(Chart); +require('./charts/Chart.Radar')(Chart); +require('./charts/Chart.Scatter')(Chart); + +window.Chart = module.exports = Chart; },{"./charts/Chart.Bar":8,"./charts/Chart.Bubble":9,"./charts/Chart.Doughnut":10,"./charts/Chart.Line":11,"./charts/Chart.PolarArea":12,"./charts/Chart.Radar":13,"./charts/Chart.Scatter":14,"./controllers/controller.bar":15,"./controllers/controller.bubble":16,"./controllers/controller.doughnut":17,"./controllers/controller.line":18,"./controllers/controller.polarArea":19,"./controllers/controller.radar":20,"./core/core.animation":21,"./core/core.controller":22,"./core/core.datasetController":23,"./core/core.element":24,"./core/core.helpers":25,"./core/core.js":26,"./core/core.layoutService":27,"./core/core.legend":28,"./core/core.plugin.js":29,"./core/core.scale":30,"./core/core.scaleService":31,"./core/core.title":32,"./core/core.tooltip":33,"./elements/element.arc":34,"./elements/element.line":35,"./elements/element.point":36,"./elements/element.rectangle":37,"./scales/scale.category":38,"./scales/scale.linear":39,"./scales/scale.logarithmic":40,"./scales/scale.radialLinear":41,"./scales/scale.time":42}],8:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - Chart.Bar = function(context, config) { - config.type = 'bar'; - - return new Chart(context, config); - }; - +"use strict"; + +module.exports = function(Chart) { + + Chart.Bar = function(context, config) { + config.type = 'bar'; + + return new Chart(context, config); + }; + }; },{}],9:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - Chart.Bubble = function(context, config) { - config.type = 'bubble'; - return new Chart(context, config); - }; - +"use strict"; + +module.exports = function(Chart) { + + Chart.Bubble = function(context, config) { + config.type = 'bubble'; + return new Chart(context, config); + }; + }; },{}],10:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - Chart.Doughnut = function(context, config) { - config.type = 'doughnut'; - - return new Chart(context, config); - }; - +"use strict"; + +module.exports = function(Chart) { + + Chart.Doughnut = function(context, config) { + config.type = 'doughnut'; + + return new Chart(context, config); + }; + }; },{}],11:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - Chart.Line = function(context, config) { - config.type = 'line'; - - return new Chart(context, config); - }; - +"use strict"; + +module.exports = function(Chart) { + + Chart.Line = function(context, config) { + config.type = 'line'; + + return new Chart(context, config); + }; + }; },{}],12:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - Chart.PolarArea = function(context, config) { - config.type = 'polarArea'; - - return new Chart(context, config); - }; - +"use strict"; + +module.exports = function(Chart) { + + Chart.PolarArea = function(context, config) { + config.type = 'polarArea'; + + return new Chart(context, config); + }; + }; },{}],13:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - var defaultConfig = { - aspectRatio: 1 - }; - - Chart.Radar = function(context, config) { - config.options = helpers.configMerge(defaultConfig, config.options); - config.type = 'radar'; - - return new Chart(context, config); - }; - -}; +"use strict"; + +module.exports = function(Chart) { + + Chart.Radar = function(context, config) { + config.options = Chart.helpers.configMerge({ aspectRatio: 1 }, config.options); + config.type = 'radar'; + + return new Chart(context, config); + }; + +}; },{}],14:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - var defaultConfig = { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: "linear", // scatter should not use a category axis - position: "bottom", - id: "x-axis-1" // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: "linear", - position: "left", - id: "y-axis-1" - }] - }, - - tooltips: { - callbacks: { - title: function(tooltipItems, data) { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(tooltipItem, data) { - return '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')'; - } - } - } - }; - - // Register the default config for this type - Chart.defaults.scatter = defaultConfig; - - // Scatter charts use line controllers - Chart.controllers.scatter = Chart.controllers.line; - - Chart.Scatter = function(context, config) { - config.type = 'scatter'; - return new Chart(context, config); - }; - -}; -},{}],15:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.bar = { - hover: { - mode: "label" - }, - - scales: { - xAxes: [{ - type: "category", - - // Specific to Bar Controller - categoryPercentage: 0.8, - barPercentage: 0.9, - - // grid line settings - gridLines: { - offsetGridLines: true - } - }], - yAxes: [{ - type: "linear" - }] - } - }; - - Chart.controllers.bar = Chart.DatasetController.extend({ - initialize: function(chart, datasetIndex) { - Chart.DatasetController.prototype.initialize.call(this, chart, datasetIndex); - - // Use this to indicate that this is a bar dataset. - this.getMeta().bar = true; - }, - // Get the number of datasets that display bars. We use this to correctly calculate the bar width - getBarCount: function getBarCount() { - var barCount = 0; - helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) { - var meta = this.chart.getDatasetMeta(datasetIndex); - if (meta.bar && this.chart.isDatasetVisible(datasetIndex)) { - ++barCount; - } - }, this); - return barCount; - }, - - addElements: function() { - var meta = this.getMeta(); - helpers.each(this.getDataset().data, function(value, index) { - meta.data[index] = meta.data[index] || new Chart.elements.Rectangle({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - }, this); - }, - - addElementAndReset: function(index) { - var rectangle = new Chart.elements.Rectangle({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - - var numBars = this.getBarCount(); - - // Add to the points array and reset it - this.getMeta().data.splice(index, 0, rectangle); - this.updateElement(rectangle, index, true, numBars); - }, - - update: function update(reset) { - var numBars = this.getBarCount(); - - helpers.each(this.getMeta().data, function(rectangle, index) { - this.updateElement(rectangle, index, reset, numBars); - }, this); - }, - - updateElement: function updateElement(rectangle, index, reset, numBars) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - var yScalePoint; - - if (yScale.min < 0 && yScale.max < 0) { - // all less than 0. use the top - yScalePoint = yScale.getPixelForValue(yScale.max); - } else if (yScale.min > 0 && yScale.max > 0) { - yScalePoint = yScale.getPixelForValue(yScale.min); - } else { - yScalePoint = yScale.getPixelForValue(0); - } - - helpers.extend(rectangle, { - // Utility - _chart: this.chart.chart, - _xScale: xScale, - _yScale: yScale, - _datasetIndex: this.index, - _index: index, - - - // Desired view properties - _model: { - x: this.calculateBarX(index, this.index), - y: reset ? yScalePoint : this.calculateBarY(index, this.index), - - // Tooltip - label: this.chart.data.labels[index], - datasetLabel: this.getDataset().label, - - // Appearance - base: reset ? yScalePoint : this.calculateBarBase(this.index, index), - width: this.calculateBarWidth(numBars), - backgroundColor: rectangle.custom && rectangle.custom.backgroundColor ? rectangle.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.rectangle.backgroundColor), - borderSkipped: rectangle.custom && rectangle.custom.borderSkipped ? rectangle.custom.borderSkipped : this.chart.options.elements.rectangle.borderSkipped, - borderColor: rectangle.custom && rectangle.custom.borderColor ? rectangle.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.rectangle.borderColor), - borderWidth: rectangle.custom && rectangle.custom.borderWidth ? rectangle.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.rectangle.borderWidth) - } - }); - rectangle.pivot(); - }, - - calculateBarBase: function(datasetIndex, index) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - var base = 0; - - if (yScale.options.stacked) { - - var value = this.chart.data.datasets[datasetIndex].data[index]; - - if (value < 0) { - for (var i = 0; i < datasetIndex; i++) { - var negDS = this.chart.data.datasets[i]; - var negDSMeta = this.chart.getDatasetMeta(i); - if (negDSMeta.bar && negDSMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(i)) { - base += negDS.data[index] < 0 ? negDS.data[index] : 0; - } - } - } else { - for (var j = 0; j < datasetIndex; j++) { - var posDS = this.chart.data.datasets[j]; - var posDSMeta = this.chart.getDatasetMeta(j); - if (posDSMeta.bar && posDSMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(j)) { - base += posDS.data[index] > 0 ? posDS.data[index] : 0; - } - } - } - - return yScale.getPixelForValue(base); - } - - base = yScale.getPixelForValue(yScale.min); - - if (yScale.beginAtZero || ((yScale.min <= 0 && yScale.max >= 0) || (yScale.min >= 0 && yScale.max <= 0))) { - base = yScale.getPixelForValue(0, 0); - //base += yScale.options.gridLines.lineWidth; - } else if (yScale.min < 0 && yScale.max < 0) { - // All values are negative. Use the top as the base - base = yScale.getPixelForValue(yScale.max); - } - - return base; - - }, - - getRuler: function() { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - var datasetCount = this.getBarCount(); - - var tickWidth = (function() { - var min = xScale.getPixelForTick(1) - xScale.getPixelForTick(0); - for (var i = 2; i < this.getDataset().data.length; i++) { - min = Math.min(xScale.getPixelForTick(i) - xScale.getPixelForTick(i - 1), min); - } - return min; - }).call(this); - var categoryWidth = tickWidth * xScale.options.categoryPercentage; - var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2; - var fullBarWidth = categoryWidth / datasetCount; - - if (xScale.ticks.length !== this.chart.data.labels.length) { - var perc = xScale.ticks.length / this.chart.data.labels.length; - fullBarWidth = fullBarWidth * perc; - } - - var barWidth = fullBarWidth * xScale.options.barPercentage; - var barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage); - - return { - datasetCount: datasetCount, - tickWidth: tickWidth, - categoryWidth: categoryWidth, - categorySpacing: categorySpacing, - fullBarWidth: fullBarWidth, - barWidth: barWidth, - barSpacing: barSpacing - }; - }, - - calculateBarWidth: function() { - var xScale = this.getScaleForId(this.getMeta().xAxisID); - var ruler = this.getRuler(); - return xScale.options.stacked ? ruler.categoryWidth : ruler.barWidth; - }, - - // Get bar index from the given dataset index accounting for the fact that not all bars are visible - getBarIndex: function(datasetIndex) { - var barIndex = 0; - var meta, j; - - for (j = 0; j < datasetIndex; ++j) { - meta = this.chart.getDatasetMeta(j); - if (meta.bar && this.chart.isDatasetVisible(j)) { - ++barIndex; - } - } - - return barIndex; - }, - - calculateBarX: function(index, datasetIndex) { - var meta = this.getMeta(); - var yScale = this.getScaleForId(meta.yAxisID); - var xScale = this.getScaleForId(meta.xAxisID); - var barIndex = this.getBarIndex(datasetIndex); - - var ruler = this.getRuler(); - var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo); - leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0; - - if (xScale.options.stacked) { - return leftTick + (ruler.categoryWidth / 2) + ruler.categorySpacing; - } - - return leftTick + - (ruler.barWidth / 2) + - ruler.categorySpacing + - (ruler.barWidth * barIndex) + - (ruler.barSpacing / 2) + - (ruler.barSpacing * barIndex); - }, - - calculateBarY: function(index, datasetIndex) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - var value = this.getDataset().data[index]; - - if (yScale.options.stacked) { - - var sumPos = 0, - sumNeg = 0; - - for (var i = 0; i < datasetIndex; i++) { - var ds = this.chart.data.datasets[i]; - var dsMeta = this.chart.getDatasetMeta(i); - if (dsMeta.bar && dsMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(i)) { - if (ds.data[index] < 0) { - sumNeg += ds.data[index] || 0; - } else { - sumPos += ds.data[index] || 0; - } - } - } - - if (value < 0) { - return yScale.getPixelForValue(sumNeg + value); - } else { - return yScale.getPixelForValue(sumPos + value); - } - } - - return yScale.getPixelForValue(value); - }, - - draw: function(ease) { - var easingDecimal = ease || 1; - helpers.each(this.getMeta().data, function(rectangle, index) { - var d = this.getDataset().data[index]; - if (d !== null && d !== undefined && !isNaN(d)) { - rectangle.transition(easingDecimal).draw(); - } - }, this); - }, - - setHoverStyle: function(rectangle) { - var dataset = this.chart.data.datasets[rectangle._datasetIndex]; - var index = rectangle._index; - - rectangle._model.backgroundColor = rectangle.custom && rectangle.custom.hoverBackgroundColor ? rectangle.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(rectangle._model.backgroundColor).saturate(0.5).darken(0.1).rgbString()); - rectangle._model.borderColor = rectangle.custom && rectangle.custom.hoverBorderColor ? rectangle.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(rectangle._model.borderColor).saturate(0.5).darken(0.1).rgbString()); - rectangle._model.borderWidth = rectangle.custom && rectangle.custom.hoverBorderWidth ? rectangle.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, rectangle._model.borderWidth); - }, - - removeHoverStyle: function(rectangle) { - var dataset = this.chart.data.datasets[rectangle._datasetIndex]; - var index = rectangle._index; - - rectangle._model.backgroundColor = rectangle.custom && rectangle.custom.backgroundColor ? rectangle.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.rectangle.backgroundColor); - rectangle._model.borderColor = rectangle.custom && rectangle.custom.borderColor ? rectangle.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.rectangle.borderColor); - rectangle._model.borderWidth = rectangle.custom && rectangle.custom.borderWidth ? rectangle.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.rectangle.borderWidth); - } - - }); - - - // including horizontalBar in the bar file, instead of a file of its own - // it extends bar (like pie extends doughnut) - Chart.defaults.horizontalBar = { +"use strict"; + +module.exports = function(Chart) { + + var defaultConfig = { hover: { - mode: "label" - }, - + mode: 'single' + }, + scales: { xAxes: [{ - type: "linear", - position: "bottom" + type: "linear", // scatter should not use a category axis + position: "bottom", + id: "x-axis-1" // need an ID so datasets can reference the scale }], yAxes: [{ - position: "left", - type: "category", - - // Specific to Horizontal Bar Controller - categoryPercentage: 0.8, - barPercentage: 0.9, - - // grid line settings + type: "linear", + position: "left", + id: "y-axis-1" + }] + }, + + tooltips: { + callbacks: { + title: function(tooltipItems, data) { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(tooltipItem, data) { + return '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')'; + } + } + } + }; + + // Register the default config for this type + Chart.defaults.scatter = defaultConfig; + + // Scatter charts use line controllers + Chart.controllers.scatter = Chart.controllers.line; + + Chart.Scatter = function(context, config) { + config.type = 'scatter'; + return new Chart(context, config); + }; + +}; +},{}],15:[function(require,module,exports){ +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers; + + Chart.defaults.bar = { + hover: { + mode: "label" + }, + + scales: { + xAxes: [{ + type: "category", + + // Specific to Bar Controller + categoryPercentage: 0.8, + barPercentage: 0.9, + + // grid line settings gridLines: { offsetGridLines: true } - }] + }], + yAxes: [{ + type: "linear" + }] + } + }; + + Chart.controllers.bar = Chart.DatasetController.extend({ + + dataElementType: Chart.elements.Rectangle, + + initialize: function(chart, datasetIndex) { + Chart.DatasetController.prototype.initialize.call(this, chart, datasetIndex); + + // Use this to indicate that this is a bar dataset. + this.getMeta().bar = true; }, - }; - + + // Get the number of datasets that display bars. We use this to correctly calculate the bar width + getBarCount: function getBarCount() { + var barCount = 0; + helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) { + var meta = this.chart.getDatasetMeta(datasetIndex); + if (meta.bar && this.chart.isDatasetVisible(datasetIndex)) { + ++barCount; + } + }, this); + return barCount; + }, + + update: function update(reset) { + helpers.each(this.getMeta().data, function(rectangle, index) { + this.updateElement(rectangle, index, reset); + }, this); + }, + + updateElement: function updateElement(rectangle, index, reset) { + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var yScale = this.getScaleForId(meta.yAxisID); + var scaleBase = yScale.getBasePixel(); + var rectangleElementOptions = this.chart.options.elements.rectangle; + var custom = rectangle.custom || {}; + var dataset = this.getDataset(); + + helpers.extend(rectangle, { + // Utility + _xScale: xScale, + _yScale: yScale, + _datasetIndex: this.index, + _index: index, + + // Desired view properties + _model: { + x: this.calculateBarX(index, this.index), + y: reset ? scaleBase : this.calculateBarY(index, this.index), + + // Tooltip + label: this.chart.data.labels[index], + datasetLabel: dataset.label, + + // Appearance + base: reset ? scaleBase : this.calculateBarBase(this.index, index), + width: this.calculateBarWidth(index), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor), + borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped, + borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth) + } + }); + rectangle.pivot(); + }, + + calculateBarBase: function(datasetIndex, index) { + var meta = this.getMeta(); + var yScale = this.getScaleForId(meta.yAxisID); + var base = 0; + + if (yScale.options.stacked) { + var chart = this.chart; + var datasets = chart.data.datasets; + var value = datasets[datasetIndex].data[index]; + + if (value < 0) { + for (var i = 0; i < datasetIndex; i++) { + var negDS = datasets[i]; + var negDSMeta = chart.getDatasetMeta(i); + if (negDSMeta.bar && negDSMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + base += negDS.data[index] < 0 ? negDS.data[index] : 0; + } + } + } else { + for (var j = 0; j < datasetIndex; j++) { + var posDS = datasets[j]; + var posDSMeta = chart.getDatasetMeta(j); + if (posDSMeta.bar && posDSMeta.yAxisID === yScale.id && chart.isDatasetVisible(j)) { + base += posDS.data[index] > 0 ? posDS.data[index] : 0; + } + } + } + + return yScale.getPixelForValue(base); + } + + return yScale.getBasePixel(); + }, + + getRuler: function(index) { + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var datasetCount = this.getBarCount(); + + var tickWidth; + + if (xScale.options.type === 'category') { + tickWidth = xScale.getPixelForTick(index + 1) - xScale.getPixelForTick(index); + } else { + // Average width + tickWidth = xScale.width / xScale.ticks.length; + } + var categoryWidth = tickWidth * xScale.options.categoryPercentage; + var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2; + var fullBarWidth = categoryWidth / datasetCount; + + if (xScale.ticks.length !== this.chart.data.labels.length) { + var perc = xScale.ticks.length / this.chart.data.labels.length; + fullBarWidth = fullBarWidth * perc; + } + + var barWidth = fullBarWidth * xScale.options.barPercentage; + var barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage); + + return { + datasetCount: datasetCount, + tickWidth: tickWidth, + categoryWidth: categoryWidth, + categorySpacing: categorySpacing, + fullBarWidth: fullBarWidth, + barWidth: barWidth, + barSpacing: barSpacing + }; + }, + + calculateBarWidth: function(index) { + var xScale = this.getScaleForId(this.getMeta().xAxisID); + var ruler = this.getRuler(index); + return xScale.options.stacked ? ruler.categoryWidth : ruler.barWidth; + }, + + // Get bar index from the given dataset index accounting for the fact that not all bars are visible + getBarIndex: function(datasetIndex) { + var barIndex = 0; + var meta, j; + + for (j = 0; j < datasetIndex; ++j) { + meta = this.chart.getDatasetMeta(j); + if (meta.bar && this.chart.isDatasetVisible(j)) { + ++barIndex; + } + } + + return barIndex; + }, + + calculateBarX: function(index, datasetIndex) { + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var barIndex = this.getBarIndex(datasetIndex); + + var ruler = this.getRuler(index); + var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo); + leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0; + + if (xScale.options.stacked) { + return leftTick + (ruler.categoryWidth / 2) + ruler.categorySpacing; + } + + return leftTick + + (ruler.barWidth / 2) + + ruler.categorySpacing + + (ruler.barWidth * barIndex) + + (ruler.barSpacing / 2) + + (ruler.barSpacing * barIndex); + }, + + calculateBarY: function(index, datasetIndex) { + var meta = this.getMeta(); + var yScale = this.getScaleForId(meta.yAxisID); + var value = this.getDataset().data[index]; + + if (yScale.options.stacked) { + + var sumPos = 0, + sumNeg = 0; + + for (var i = 0; i < datasetIndex; i++) { + var ds = this.chart.data.datasets[i]; + var dsMeta = this.chart.getDatasetMeta(i); + if (dsMeta.bar && dsMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(i)) { + if (ds.data[index] < 0) { + sumNeg += ds.data[index] || 0; + } else { + sumPos += ds.data[index] || 0; + } + } + } + + if (value < 0) { + return yScale.getPixelForValue(sumNeg + value); + } else { + return yScale.getPixelForValue(sumPos + value); + } + } + + return yScale.getPixelForValue(value); + }, + + draw: function(ease) { + var easingDecimal = ease || 1; + helpers.each(this.getMeta().data, function(rectangle, index) { + var d = this.getDataset().data[index]; + if (d !== null && d !== undefined && !isNaN(d)) { + rectangle.transition(easingDecimal).draw(); + } + }, this); + }, + + setHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + + var custom = rectangle.custom || {}; + var model = rectangle._model; + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(rectangle) { + var dataset = this.chart.data.datasets[rectangle._datasetIndex]; + var index = rectangle._index; + var custom = rectangle.custom || {}; + var model = rectangle._model; + var rectangleElementOptions = this.chart.options.elements.rectangle; + + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); + } + + }); + + + // including horizontalBar in the bar file, instead of a file of its own + // it extends bar (like pie extends doughnut) + Chart.defaults.horizontalBar = { + hover: { + mode: "label" + }, + + scales: { + xAxes: [{ + type: "linear", + position: "bottom" + }], + yAxes: [{ + position: "left", + type: "category", + + // Specific to Horizontal Bar Controller + categoryPercentage: 0.8, + barPercentage: 0.9, + + // grid line settings + gridLines: { + offsetGridLines: true + } + }] + }, + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + tooltips: { + callbacks: { + title: function(tooltipItems, data) { + // Pick first xLabel for now + var title = ''; + + if (tooltipItems.length > 0) { + if (tooltipItems[0].yLabel) { + title = tooltipItems[0].yLabel; + } else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) { + title = data.labels[tooltipItems[0].index]; + } + } + + return title; + }, + label: function(tooltipItem, data) { + var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || ''; + return datasetLabel + ': ' + tooltipItem.xLabel; + } + } + } + }; + Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ updateElement: function updateElement(rectangle, index, reset, numBars) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - var xScalePoint; - - if (xScale.min < 0 && xScale.max < 0) { - // all less than 0. use the right - xScalePoint = xScale.getPixelForValue(xScale.max); - } else if (xScale.min > 0 && xScale.max > 0) { - xScalePoint = xScale.getPixelForValue(xScale.min); - } else { - xScalePoint = xScale.getPixelForValue(0); - } - - helpers.extend(rectangle, { - // Utility - _chart: this.chart.chart, - _xScale: xScale, - _yScale: yScale, - _datasetIndex: this.index, - _index: index, - - // Desired view properties + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var yScale = this.getScaleForId(meta.yAxisID); + var scaleBase = xScale.getBasePixel(); + var custom = rectangle.custom || {}; + var dataset = this.getDataset(); + var rectangleElementOptions = this.chart.options.elements.rectangle; + + helpers.extend(rectangle, { + // Utility + _xScale: xScale, + _yScale: yScale, + _datasetIndex: this.index, + _index: index, + + // Desired view properties _model: { - x: reset ? xScalePoint : this.calculateBarX(index, this.index), - y: this.calculateBarY(index, this.index), - - // Tooltip - label: this.chart.data.labels[index], - datasetLabel: this.getDataset().label, - - // Appearance - base: reset ? xScalePoint : this.calculateBarBase(this.index, index), - height: this.calculateBarHeight(numBars), - backgroundColor: rectangle.custom && rectangle.custom.backgroundColor ? rectangle.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.rectangle.backgroundColor), - borderSkipped: rectangle.custom && rectangle.custom.borderSkipped ? rectangle.custom.borderSkipped : this.chart.options.elements.rectangle.borderSkipped, - borderColor: rectangle.custom && rectangle.custom.borderColor ? rectangle.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.rectangle.borderColor), - borderWidth: rectangle.custom && rectangle.custom.borderWidth ? rectangle.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.rectangle.borderWidth) - }, - + x: reset ? scaleBase : this.calculateBarX(index, this.index), + y: this.calculateBarY(index, this.index), + + // Tooltip + label: this.chart.data.labels[index], + datasetLabel: dataset.label, + + // Appearance + base: reset ? scaleBase : this.calculateBarBase(this.index, index), + height: this.calculateBarHeight(index), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor), + borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped, + borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth) + }, + draw: function () { - - var ctx = this._chart.ctx; - var vm = this._view; - - var halfHeight = vm.height / 2, - topY = vm.y - halfHeight, - bottomY = vm.y + halfHeight, - right = vm.base - (vm.base - vm.x), - halfStroke = vm.borderWidth / 2; - - // Canvas doesn't allow us to stroke inside the width so we can - // adjust the sizes to fit if we're setting a stroke on the line + + var ctx = this._chart.ctx; + var vm = this._view; + + var halfHeight = vm.height / 2, + topY = vm.y - halfHeight, + bottomY = vm.y + halfHeight, + right = vm.base - (vm.base - vm.x), + halfStroke = vm.borderWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line if (vm.borderWidth) { - topY += halfStroke; - bottomY -= halfStroke; + topY += halfStroke; + bottomY -= halfStroke; right += halfStroke; - } - - ctx.beginPath(); - - ctx.fillStyle = vm.backgroundColor; - ctx.strokeStyle = vm.borderColor; - ctx.lineWidth = vm.borderWidth; - - // Corner points, from bottom-left to bottom-right clockwise - // | 1 2 | - // | 0 3 | - var corners = [ - [vm.base, bottomY], - [vm.base, topY], - [right, topY], - [right, bottomY] - ]; - - // Find first (starting) corner with fallback to 'bottom' - var borders = ['bottom', 'left', 'top', 'right']; - var startCorner = borders.indexOf(vm.borderSkipped, 0); - if (startCorner === -1) - startCorner = 0; - + } + + ctx.beginPath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + + // Corner points, from bottom-left to bottom-right clockwise + // | 1 2 | + // | 0 3 | + var corners = [ + [vm.base, bottomY], + [vm.base, topY], + [right, topY], + [right, bottomY] + ]; + + // Find first (starting) corner with fallback to 'bottom' + var borders = ['bottom', 'left', 'top', 'right']; + var startCorner = borders.indexOf(vm.borderSkipped, 0); + if (startCorner === -1) + startCorner = 0; + function cornerAt(index) { return corners[(startCorner + index) % 4]; - } - - // Draw rectangle from 'startCorner' - ctx.moveTo.apply(ctx, cornerAt(0)); - for (var i = 1; i < 4; i++) - ctx.lineTo.apply(ctx, cornerAt(i)); - - ctx.fill(); + } + + // Draw rectangle from 'startCorner' + ctx.moveTo.apply(ctx, cornerAt(0)); + for (var i = 1; i < 4; i++) + ctx.lineTo.apply(ctx, cornerAt(i)); + + ctx.fill(); if (vm.borderWidth) { ctx.stroke(); } - }, - + }, + inRange: function (mouseX, mouseY) { - var vm = this._view; - var inRange = false; - + var vm = this._view; + var inRange = false; + if (vm) { if (vm.x < vm.base) { inRange = (mouseY >= vm.y - vm.height / 2 && mouseY <= vm.y + vm.height / 2) && (mouseX >= vm.x && mouseX <= vm.base); } else { inRange = (mouseY >= vm.y - vm.height / 2 && mouseY <= vm.y + vm.height / 2) && (mouseX >= vm.base && mouseX <= vm.x); } - } - + } + return inRange; } - }); - + }); + rectangle.pivot(); - }, - + }, + calculateBarBase: function (datasetIndex, index) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - var base = 0; - + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var base = 0; + if (xScale.options.stacked) { - - var value = this.chart.data.datasets[datasetIndex].data[index]; - + + var value = this.chart.data.datasets[datasetIndex].data[index]; + if (value < 0) { for (var i = 0; i < datasetIndex; i++) { - var negDS = this.chart.data.datasets[i]; - var negDSMeta = this.chart.getDatasetMeta(i); + var negDS = this.chart.data.datasets[i]; + var negDSMeta = this.chart.getDatasetMeta(i); if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) { base += negDS.data[index] < 0 ? negDS.data[index] : 0; } } } else { for (var j = 0; j < datasetIndex; j++) { - var posDS = this.chart.data.datasets[j]; - var posDSMeta = this.chart.getDatasetMeta(j); + var posDS = this.chart.data.datasets[j]; + var posDSMeta = this.chart.getDatasetMeta(j); if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(j)) { base += posDS.data[index] > 0 ? posDS.data[index] : 0; } } - } - + } + return xScale.getPixelForValue(base); - } - - base = xScale.getPixelForValue(xScale.min); - - if (xScale.beginAtZero || ((xScale.min <= 0 && xScale.max >= 0) || (xScale.min >= 0 && xScale.max <= 0))) { - base = xScale.getPixelForValue(0, 0); - } else if (xScale.min < 0 && xScale.max < 0) { - // All values are negative. Use the right as the base - base = xScale.getPixelForValue(xScale.max); - } - - return base; - }, - - getRuler: function () { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - var datasetCount = this.getBarCount(); - - var tickHeight = (function () { - var min = yScale.getPixelForTick(1) - yScale.getPixelForTick(0); - for (var i = 2; i < this.getDataset().data.length; i++) { - min = Math.min(yScale.getPixelForTick(i) - yScale.getPixelForTick(i - 1), min); - } - return min; - }).call(this); - var categoryHeight = tickHeight * yScale.options.categoryPercentage; - var categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2; - var fullBarHeight = categoryHeight / datasetCount; - + } + + return xScale.getBasePixel(); + }, + + getRuler: function (index) { + var meta = this.getMeta(); + var yScale = this.getScaleForId(meta.yAxisID); + var datasetCount = this.getBarCount(); + + var tickHeight; + if (yScale.options.type === 'category') { + tickHeight = yScale.getPixelForTick(index + 1) - yScale.getPixelForTick(index); + } else { + // Average width + tickHeight = yScale.width / yScale.ticks.length; + } + var categoryHeight = tickHeight * yScale.options.categoryPercentage; + var categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2; + var fullBarHeight = categoryHeight / datasetCount; + if (yScale.ticks.length !== this.chart.data.labels.length) { - var perc = yScale.ticks.length / this.chart.data.labels.length; + var perc = yScale.ticks.length / this.chart.data.labels.length; fullBarHeight = fullBarHeight * perc; - } - - var barHeight = fullBarHeight * yScale.options.barPercentage; - var barSpacing = fullBarHeight - (fullBarHeight * yScale.options.barPercentage); - + } + + var barHeight = fullBarHeight * yScale.options.barPercentage; + var barSpacing = fullBarHeight - (fullBarHeight * yScale.options.barPercentage); + return { - datasetCount: datasetCount, - tickHeight: tickHeight, - categoryHeight: categoryHeight, - categorySpacing: categorySpacing, - fullBarHeight: fullBarHeight, - barHeight: barHeight, + datasetCount: datasetCount, + tickHeight: tickHeight, + categoryHeight: categoryHeight, + categorySpacing: categorySpacing, + fullBarHeight: fullBarHeight, + barHeight: barHeight, barSpacing: barSpacing, }; - }, - - calculateBarHeight: function () { - var yScale = this.getScaleForId(this.getMeta().yAxisID); - var ruler = this.getRuler(); + }, + + calculateBarHeight: function (index) { + var yScale = this.getScaleForId(this.getMeta().yAxisID); + var ruler = this.getRuler(index); return yScale.options.stacked ? ruler.categoryHeight : ruler.barHeight; - }, - + }, + calculateBarX: function (index, datasetIndex) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - var value = this.getDataset().data[index]; - + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var value = this.getDataset().data[index]; + if (xScale.options.stacked) { - var sumPos = 0, - sumNeg = 0; - + var sumPos = 0, + sumNeg = 0; + for (var i = 0; i < datasetIndex; i++) { - var ds = this.chart.data.datasets[i]; - var dsMeta = this.chart.getDatasetMeta(i); + var ds = this.chart.data.datasets[i]; + var dsMeta = this.chart.getDatasetMeta(i); if (dsMeta.bar && dsMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) { if (ds.data[index] < 0) { sumNeg += ds.data[index] || 0; @@ -5533,7435 +6403,7544 @@ module.exports = function(Chart) { sumPos += ds.data[index] || 0; } } - } - + } + if (value < 0) { return xScale.getPixelForValue(sumNeg + value); } else { return xScale.getPixelForValue(sumPos + value); - } - } - + } + } + return xScale.getPixelForValue(value); - }, - + }, + calculateBarY: function (index, datasetIndex) { - var meta = this.getMeta(); - var yScale = this.getScaleForId(meta.yAxisID); - var xScale = this.getScaleForId(meta.xAxisID); - var barIndex = this.getBarIndex(datasetIndex); - - var ruler = this.getRuler(); - var topTick = yScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo); - topTick -= this.chart.isCombo ? (ruler.tickHeight / 2) : 0; - + var meta = this.getMeta(); + var yScale = this.getScaleForId(meta.yAxisID); + var barIndex = this.getBarIndex(datasetIndex); + + var ruler = this.getRuler(index); + var topTick = yScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo); + topTick -= this.chart.isCombo ? (ruler.tickHeight / 2) : 0; + if (yScale.options.stacked) { return topTick + (ruler.categoryHeight / 2) + ruler.categorySpacing; - } - - return topTick + - (ruler.barHeight / 2) + - ruler.categorySpacing + - (ruler.barHeight * barIndex) + - (ruler.barSpacing / 2) + + } + + return topTick + + (ruler.barHeight / 2) + + ruler.categorySpacing + + (ruler.barHeight * barIndex) + + (ruler.barSpacing / 2) + (ruler.barSpacing * barIndex); } - }); -}; + }); +}; },{}],16:[function(require,module,exports){ -"use strict"; +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers; + + Chart.defaults.bubble = { + hover: { + mode: "single" + }, + + scales: { + xAxes: [{ + type: "linear", // bubble should probably use a linear scale by default + position: "bottom", + id: "x-axis-0" // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: "linear", + position: "left", + id: "y-axis-0" + }] + }, + + tooltips: { + callbacks: { + title: function(tooltipItems, data) { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function(tooltipItem, data) { + var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || ''; + var dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + return datasetLabel + ': (' + dataPoint.x + ', ' + dataPoint.y + ', ' + dataPoint.r + ')'; + } + } + } + }; + + Chart.controllers.bubble = Chart.DatasetController.extend({ + + dataElementType: Chart.elements.Point, + + update: function update(reset) { + var meta = this.getMeta(); + var points = meta.data; + + // Update Points + helpers.each(points, function(point, index) { + this.updateElement(point, index, reset); + }, this); + }, + + updateElement: function(point, index, reset) { + var meta = this.getMeta(); + var xScale = this.getScaleForId(meta.xAxisID); + var yScale = this.getScaleForId(meta.yAxisID); + + var custom = point.custom || {}; + var dataset = this.getDataset(); + var data = dataset.data[index]; + var pointElementOptions = this.chart.options.elements.point; + + helpers.extend(point, { + // Utility + _xScale: xScale, + _yScale: yScale, + _datasetIndex: this.index, + _index: index, + + // Desired view properties + _model: { + x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, this.index, this.chart.isCombo), + y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, this.index), + // Appearance + radius: reset ? 0 : custom.radius ? custom.radius : this.getRadius(data), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth), + + // Tooltip + hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius) + } + }); + + var model = point._model; + model.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y)); + + point.pivot(); + }, + + getRadius: function(value) { + return value.r || this.chart.options.elements.point.radius; + }, + + setHoverStyle: function(point) { + // Point + var dataset = this.chart.data.datasets[point._datasetIndex]; + var index = point._index; + var custom = point.custom || {}; + var model = point._model; + + model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, this.chart.options.elements.point.hoverRadius)) + this.getRadius(this.getDataset().data[point._index]); + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(point) { + var dataset = this.chart.data.datasets[point._datasetIndex]; + var index = point._index; + var custom = point.custom || {}; + var model = point._model; + var pointElementOptions = this.chart.options.elements.point; + + model.radius = custom.radius ? custom.radius : this.getRadius(dataset.data[point._index]); + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth); + } + }); +}; -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.bubble = { - hover: { - mode: "single" - }, - - scales: { - xAxes: [{ - type: "linear", // bubble should probably use a linear scale by default - position: "bottom", - id: "x-axis-0" // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: "linear", - position: "left", - id: "y-axis-0" - }] - }, - - tooltips: { - callbacks: { - title: function(tooltipItems, data) { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(tooltipItem, data) { - var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || ''; - var dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - return datasetLabel + ': (' + dataPoint.x + ', ' + dataPoint.y + ', ' + dataPoint.r + ')'; - } - } - } - }; - - - Chart.controllers.bubble = Chart.DatasetController.extend({ - addElements: function() { - var meta = this.getMeta(); - helpers.each(this.getDataset().data, function(value, index) { - meta.data[index] = meta.data[index] || new Chart.elements.Point({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - }, this); - }, - addElementAndReset: function(index) { - var point = new Chart.elements.Point({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - - // Add to the points array and reset it - this.getMeta().data.splice(index, 0, point); - this.updateElement(point, index, true); - }, - - update: function update(reset) { - var meta = this.getMeta(); - var points = meta.data; - var yScale = this.getScaleForId(meta.yAxisID); - var xScale = this.getScaleForId(meta.xAxisID); - var scaleBase; - - if (yScale.min < 0 && yScale.max < 0) { - scaleBase = yScale.getPixelForValue(yScale.max); - } else if (yScale.min > 0 && yScale.max > 0) { - scaleBase = yScale.getPixelForValue(yScale.min); - } else { - scaleBase = yScale.getPixelForValue(0); - } - - // Update Points - helpers.each(points, function(point, index) { - this.updateElement(point, index, reset); - }, this); - - }, - - updateElement: function(point, index, reset) { - var meta = this.getMeta(); - var yScale = this.getScaleForId(meta.yAxisID); - var xScale = this.getScaleForId(meta.xAxisID); - var scaleBase; - - if (yScale.min < 0 && yScale.max < 0) { - scaleBase = yScale.getPixelForValue(yScale.max); - } else if (yScale.min > 0 && yScale.max > 0) { - scaleBase = yScale.getPixelForValue(yScale.min); - } else { - scaleBase = yScale.getPixelForValue(0); - } - - helpers.extend(point, { - // Utility - _chart: this.chart.chart, - _xScale: xScale, - _yScale: yScale, - _datasetIndex: this.index, - _index: index, - - // Desired view properties - _model: { - x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(this.getDataset().data[index], index, this.index, this.chart.isCombo), - y: reset ? scaleBase : yScale.getPixelForValue(this.getDataset().data[index], index, this.index), - // Appearance - radius: reset ? 0 : point.custom && point.custom.radius ? point.custom.radius : this.getRadius(this.getDataset().data[index]), - backgroundColor: point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.point.backgroundColor), - borderColor: point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.point.borderColor), - borderWidth: point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.point.borderWidth), - - // Tooltip - hitRadius: point.custom && point.custom.hitRadius ? point.custom.hitRadius : helpers.getValueAtIndexOrDefault(this.getDataset().hitRadius, index, this.chart.options.elements.point.hitRadius) - } - }); - - point._model.skip = point.custom && point.custom.skip ? point.custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); - - point.pivot(); - }, - - getRadius: function(value) { - return value.r || this.chart.options.elements.point.radius; - }, - - draw: function(ease) { - var easingDecimal = ease || 1; - - // Transition and Draw the Points - helpers.each(this.getMeta().data, function(point, index) { - point.transition(easingDecimal); - point.draw(); - }); - - }, - - setHoverStyle: function(point) { - // Point - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - - point._model.radius = point.custom && point.custom.hoverRadius ? point.custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, this.chart.options.elements.point.hoverRadius)) + this.getRadius(this.getDataset().data[point._index]); - point._model.backgroundColor = point.custom && point.custom.hoverBackgroundColor ? point.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(point._model.backgroundColor).saturate(0.5).darken(0.1).rgbString()); - point._model.borderColor = point.custom && point.custom.hoverBorderColor ? point.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(point._model.borderColor).saturate(0.5).darken(0.1).rgbString()); - point._model.borderWidth = point.custom && point.custom.hoverBorderWidth ? point.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, point._model.borderWidth); - }, - - removeHoverStyle: function(point) { - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - - point._model.radius = point.custom && point.custom.radius ? point.custom.radius : this.getRadius(this.getDataset().data[point._index]); - point._model.backgroundColor = point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.point.backgroundColor); - point._model.borderColor = point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.point.borderColor); - point._model.borderWidth = point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.point.borderWidth); - } - }); -}; },{}],17:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.doughnut = { - animation: { - //Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - //Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - aspectRatio: 1, - hover: { - mode: 'single' - }, - legendCallback: function(chart) { - var text = []; - text.push('
      '); - - if (chart.data.datasets.length) { - for (var i = 0; i < chart.data.datasets[0].data.length; ++i) { - text.push('
    • '); - if (chart.data.labels[i]) { - text.push(chart.data.labels[i]); - } - text.push('
    • '); - } - } - - text.push('
    '); - return text.join(""); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var fill = arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(ds.backgroundColor, i, this.chart.options.elements.arc.backgroundColor); - var stroke = arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(ds.borderColor, i, this.chart.options.elements.arc.borderColor); - var bw = arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(ds.borderWidth, i, this.chart.options.elements.arc.borderWidth); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }, this); - } else { - return []; - } - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - //The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - //The rotation of the chart, where the first data arc begins. - rotation: Math.PI * -0.5, - - //The total circumference of the chart. - circumference: Math.PI * 2.0, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - return data.labels[tooltipItem.index] + ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - } - } - } - }; - - Chart.defaults.pie = helpers.clone(Chart.defaults.doughnut); - helpers.extend(Chart.defaults.pie, { - cutoutPercentage: 0 - }); - - - Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ - linkScales: function() { - // no scales for doughnut - }, - - addElements: function() { - var meta = this.getMeta(); - helpers.each(this.getDataset().data, function(value, index) { - meta.data[index] = meta.data[index] || new Chart.elements.Arc({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - }, this); - }, - - addElementAndReset: function(index, colorForNewElement) { - var arc = new Chart.elements.Arc({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - - if (colorForNewElement && helpers.isArray(this.getDataset().backgroundColor)) { - this.getDataset().backgroundColor.splice(index, 0, colorForNewElement); - } - - // Add to the points array and reset it - this.getMeta().data.splice(index, 0, arc); - this.updateElement(arc, index, true); - }, - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function getRingIndex(datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function update(reset) { - var availableWidth = this.chart.chartArea.right - this.chart.chartArea.left - this.chart.options.elements.arc.borderWidth; - var availableHeight = this.chart.chartArea.bottom - this.chart.chartArea.top - this.chart.options.elements.arc.borderWidth; - var minSize = Math.min(availableWidth, availableHeight); - var offset = {x: 0, y: 0}; - - // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc - if (this.chart.options.circumference < Math.PI * 2.0) { - var startAngle = this.chart.options.rotation % (Math.PI * 2.0); - startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); - var endAngle = startAngle + this.chart.options.circumference; - var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; - var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; - var contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); - var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); - var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); - var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); - var cutout = this.chart.options.cutoutPercentage / 100.0; - var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; - var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; - var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; - minSize = Math.min(availableWidth / size.width, availableHeight / size.height); - offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; - } - - this.chart.outerRadius = Math.max(minSize / 2, 0); - this.chart.innerRadius = Math.max(this.chart.options.cutoutPercentage ? (this.chart.outerRadius / 100) * (this.chart.options.cutoutPercentage) : 1, 0); - this.chart.radiusLength = (this.chart.outerRadius - this.chart.innerRadius) / this.chart.getVisibleDatasetCount(); - this.chart.offsetX = offset.x * this.chart.outerRadius; - this.chart.offsetY = offset.y * this.chart.outerRadius; - - this.getMeta().total = this.calculateTotal(); - - this.outerRadius = this.chart.outerRadius - (this.chart.radiusLength * this.getRingIndex(this.index)); - this.innerRadius = this.outerRadius - this.chart.radiusLength; - - helpers.each(this.getMeta().data, function(arc, index) { - this.updateElement(arc, index, reset); - }, this); - }, - - updateElement: function(arc, index, reset) { - var centerX = (this.chart.chartArea.left + this.chart.chartArea.right) / 2; - var centerY = (this.chart.chartArea.top + this.chart.chartArea.bottom) / 2; - var startAngle = this.chart.options.rotation; // non reset case handled later - var endAngle = this.chart.options.rotation; // non reset case handled later - var circumference = reset && this.chart.options.animation.animateRotate ? 0 : arc.hidden? 0 : this.calculateCircumference(this.getDataset().data[index]) * (this.chart.options.circumference / (2.0 * Math.PI)); - var innerRadius = reset && this.chart.options.animation.animateScale ? 0 : this.innerRadius; - var outerRadius = reset && this.chart.options.animation.animateScale ? 0 : this.outerRadius; - - helpers.extend(arc, { - // Utility - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index, - - // Desired view properties - _model: { - x: centerX + this.chart.offsetX, - y: centerY + this.chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - - backgroundColor: arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor), - hoverBackgroundColor: arc.custom && arc.custom.hoverBackgroundColor ? arc.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().hoverBackgroundColor, index, this.chart.options.elements.arc.hoverBackgroundColor), - borderWidth: arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth), - borderColor: arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor), - - label: helpers.getValueAtIndexOrDefault(this.getDataset().label, index, this.chart.data.labels[index]) - } - }); - - // Set correct angles if not resetting - if (!reset || !this.chart.options.animation.animateRotate) { - - if (index === 0) { - arc._model.startAngle = this.chart.options.rotation; - } else { - arc._model.startAngle = this.getMeta().data[index - 1]._model.endAngle; - } - - arc._model.endAngle = arc._model.startAngle + arc._model.circumference; - } - - arc.pivot(); - }, - - draw: function(ease) { - var easingDecimal = ease || 1; - helpers.each(this.getMeta().data, function(arc, index) { - arc.transition(easingDecimal).draw(); - }); - }, - - setHoverStyle: function(arc) { - var dataset = this.chart.data.datasets[arc._datasetIndex]; - var index = arc._index; - - arc._model.backgroundColor = arc.custom && arc.custom.hoverBackgroundColor ? arc.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(arc._model.backgroundColor).saturate(0.5).darken(0.1).rgbString()); - arc._model.borderColor = arc.custom && arc.custom.hoverBorderColor ? arc.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(arc._model.borderColor).saturate(0.5).darken(0.1).rgbString()); - arc._model.borderWidth = arc.custom && arc.custom.hoverBorderWidth ? arc.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, arc._model.borderWidth); - }, - - removeHoverStyle: function(arc) { - var dataset = this.chart.data.datasets[arc._datasetIndex]; - var index = arc._index; - - arc._model.backgroundColor = arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor); - arc._model.borderColor = arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor); - arc._model.borderWidth = arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth); - }, - - calculateTotal: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers.each(meta.data, function(element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - return total; - }, - - calculateCircumference: function(value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return (Math.PI * 2.0) * (value / total); - } else { - return 0; - } - } - }); -}; +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers, + defaults = Chart.defaults; + + defaults.doughnut = { + animation: { + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + aspectRatio: 1, + hover: { + mode: 'single' + }, + legendCallback: function(chart) { + var text = []; + text.push('
      '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
    • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
    • '); + } + } + + text.push('
    '); + return text.join(""); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; + var arcOpts = chart.options.elements.arc; + var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); + var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); + var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } else { + return []; + } + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + //The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + //The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + //The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + return data.labels[tooltipItem.index] + ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + } + } + } + }; + + defaults.pie = helpers.clone(defaults.doughnut); + helpers.extend(defaults.pie, { + cutoutPercentage: 0 + }); + + + Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ + + dataElementType: Chart.elements.Arc, + + linkScales: helpers.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function getRingIndex(datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function update(reset) { + var _this = this; + var chart = _this.chart, + chartArea = chart.chartArea, + opts = chart.options, + arcOpts = opts.elements.arc, + availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth, + availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth, + minSize = Math.min(availableWidth, availableHeight), + offset = { + x: 0, + y: 0 + }, + meta = _this.getMeta(), + cutoutPercentage = opts.cutoutPercentage, + circumference = opts.circumference; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; + var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = _this.calculateTotal(); + + _this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.getRingIndex(_this.index)); + _this.innerRadius = _this.outerRadius - chart.radiusLength; + + helpers.each(meta.data, function(arc, index) { + _this.updateElement(arc, index, reset); + }); + }, + + updateElement: function(arc, index, reset) { + var _this = this; + var chart = _this.chart, + chartArea = chart.chartArea, + opts = chart.options, + animationOpts = opts.animation, + arcOpts = opts.elements.arc, + centerX = (chartArea.left + chartArea.right) / 2, + centerY = (chartArea.top + chartArea.bottom) / 2, + startAngle = opts.rotation, // non reset case handled later + endAngle = opts.rotation, // non reset case handled later + dataset = _this.getDataset(), + circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : _this.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)), + innerRadius = reset && animationOpts.animateScale ? 0 : _this.innerRadius, + outerRadius = reset && animationOpts.animateScale ? 0 : _this.outerRadius, + custom = arc.custom || {}, + valueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; + + helpers.extend(arc, { + // Utility + _datasetIndex: _this.index, + _index: index, + + // Desired view properties + _model: { + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor); + model.hoverBackgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, arcOpts.hoverBackgroundColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth); + model.borderColor = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor); + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = _this.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + removeHoverStyle: function(arc) { + Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); + }, + + calculateTotal: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers.each(meta.data, function(element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + return total; + }, + + calculateCircumference: function(value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (value / total); + } else { + return 0; + } + } + }); +}; },{}],18:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.line = { - showLines: true, - - hover: { - mode: "label" - }, - - scales: { - xAxes: [{ - type: "category", - id: 'x-axis-0' - }], - yAxes: [{ - type: "linear", - id: 'y-axis-0' - }] - } - }; - - - Chart.controllers.line = Chart.DatasetController.extend({ - addElements: function() { - var meta = this.getMeta(); - meta.dataset = meta.dataset || new Chart.elements.Line({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _points: meta.data - }); - - helpers.each(this.getDataset().data, function(value, index) { - meta.data[index] = meta.data[index] || new Chart.elements.Point({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - }, this); - }, - - addElementAndReset: function(index) { - var point = new Chart.elements.Point({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - - // Add to the points array and reset it - this.getMeta().data.splice(index, 0, point); - this.updateElement(point, index, true); - - // Make sure bezier control points are updated - if (this.chart.options.showLines && this.chart.options.elements.line.tension !== 0) - this.updateBezierControlPoints(); - }, - - update: function update(reset) { - var meta = this.getMeta(); - var line = meta.dataset; - var points = meta.data; - - var yScale = this.getScaleForId(meta.yAxisID); - var xScale = this.getScaleForId(meta.xAxisID); - var scaleBase; - - if (yScale.min < 0 && yScale.max < 0) { - scaleBase = yScale.getPixelForValue(yScale.max); - } else if (yScale.min > 0 && yScale.max > 0) { - scaleBase = yScale.getPixelForValue(yScale.min); - } else { - scaleBase = yScale.getPixelForValue(0); - } - - // Update Line - if (this.chart.options.showLines) { - // Utility - line._scale = yScale; - line._datasetIndex = this.index; - // Data - line._children = points; - // Model - - // Compatibility: If the properties are defined with only the old name, use those values - if ((this.getDataset().tension !== undefined) && (this.getDataset().lineTension === undefined)) - { - this.getDataset().lineTension = this.getDataset().tension; - } - - line._model = { - // Appearance - tension: line.custom && line.custom.tension ? line.custom.tension : helpers.getValueOrDefault(this.getDataset().lineTension, this.chart.options.elements.line.tension), - backgroundColor: line.custom && line.custom.backgroundColor ? line.custom.backgroundColor : (this.getDataset().backgroundColor || this.chart.options.elements.line.backgroundColor), - borderWidth: line.custom && line.custom.borderWidth ? line.custom.borderWidth : (this.getDataset().borderWidth || this.chart.options.elements.line.borderWidth), - borderColor: line.custom && line.custom.borderColor ? line.custom.borderColor : (this.getDataset().borderColor || this.chart.options.elements.line.borderColor), - borderCapStyle: line.custom && line.custom.borderCapStyle ? line.custom.borderCapStyle : (this.getDataset().borderCapStyle || this.chart.options.elements.line.borderCapStyle), - borderDash: line.custom && line.custom.borderDash ? line.custom.borderDash : (this.getDataset().borderDash || this.chart.options.elements.line.borderDash), - borderDashOffset: line.custom && line.custom.borderDashOffset ? line.custom.borderDashOffset : (this.getDataset().borderDashOffset || this.chart.options.elements.line.borderDashOffset), - borderJoinStyle: line.custom && line.custom.borderJoinStyle ? line.custom.borderJoinStyle : (this.getDataset().borderJoinStyle || this.chart.options.elements.line.borderJoinStyle), - fill: line.custom && line.custom.fill ? line.custom.fill : (this.getDataset().fill !== undefined ? this.getDataset().fill : this.chart.options.elements.line.fill), - // Scale - scaleTop: yScale.top, - scaleBottom: yScale.bottom, - scaleZero: scaleBase - }; - line.pivot(); - } - - // Update Points - helpers.each(points, function(point, index) { - this.updateElement(point, index, reset); - }, this); - - if (this.chart.options.showLines && this.chart.options.elements.line.tension !== 0) - this.updateBezierControlPoints(); - }, - - getPointBackgroundColor: function(point, index) { - var backgroundColor = this.chart.options.elements.point.backgroundColor; - var dataset = this.getDataset(); - - if (point.custom && point.custom.backgroundColor) { - backgroundColor = point.custom.backgroundColor; - } else if (dataset.pointBackgroundColor) { - backgroundColor = helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor); - } else if (dataset.backgroundColor) { - backgroundColor = dataset.backgroundColor; - } - - return backgroundColor; - }, - getPointBorderColor: function(point, index) { - var borderColor = this.chart.options.elements.point.borderColor; - var dataset = this.getDataset(); - - if (point.custom && point.custom.borderColor) { - borderColor = point.custom.borderColor; - } else if (dataset.pointBorderColor) { - borderColor = helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderColor, index, borderColor); - } else if (dataset.borderColor) { - borderColor = dataset.borderColor; - } - - return borderColor; - }, - getPointBorderWidth: function(point, index) { - var borderWidth = this.chart.options.elements.point.borderWidth; - var dataset = this.getDataset(); - - if (point.custom && point.custom.borderWidth !== undefined) { - borderWidth = point.custom.borderWidth; - } else if (dataset.pointBorderWidth !== undefined) { - borderWidth = helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth); - } else if (dataset.borderWidth !== undefined) { - borderWidth = dataset.borderWidth; - } - - return borderWidth; - }, - - updateElement: function(point, index, reset) { - var meta = this.getMeta(); - var yScale = this.getScaleForId(meta.yAxisID); - var xScale = this.getScaleForId(meta.xAxisID); - var scaleBase; - - if (yScale.min < 0 && yScale.max < 0) { - scaleBase = yScale.getPixelForValue(yScale.max); - } else if (yScale.min > 0 && yScale.max > 0) { - scaleBase = yScale.getPixelForValue(yScale.min); - } else { - scaleBase = yScale.getPixelForValue(0); - } - - // Utility - point._chart = this.chart.chart; - point._xScale = xScale; - point._yScale = yScale; - point._datasetIndex = this.index; - point._index = index; - - // Desired view properties - - // Compatibility: If the properties are defined with only the old name, use those values - if ((this.getDataset().radius !== undefined) && (this.getDataset().pointRadius === undefined)) - { - this.getDataset().pointRadius = this.getDataset().radius; - } - if ((this.getDataset().hitRadius !== undefined) && (this.getDataset().pointHitRadius === undefined)) - { - this.getDataset().pointHitRadius = this.getDataset().hitRadius; - } - - point._model = { - x: xScale.getPixelForValue(this.getDataset().data[index], index, this.index, this.chart.isCombo), - y: reset ? scaleBase : this.calculatePointY(this.getDataset().data[index], index, this.index, this.chart.isCombo), - // Appearance - radius: point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().pointRadius, index, this.chart.options.elements.point.radius), - pointStyle: point.custom && point.custom.pointStyle ? point.custom.pointStyle : helpers.getValueAtIndexOrDefault(this.getDataset().pointStyle, index, this.chart.options.elements.point.pointStyle), - backgroundColor: this.getPointBackgroundColor(point, index), - borderColor: this.getPointBorderColor(point, index), - borderWidth: this.getPointBorderWidth(point, index), - // Tooltip - hitRadius: point.custom && point.custom.hitRadius ? point.custom.hitRadius : helpers.getValueAtIndexOrDefault(this.getDataset().pointHitRadius, index, this.chart.options.elements.point.hitRadius) - }; - - point._model.skip = point.custom && point.custom.skip ? point.custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); - }, - - calculatePointY: function(value, index, datasetIndex, isCombo) { - var meta = this.getMeta(); - var xScale = this.getScaleForId(meta.xAxisID); - var yScale = this.getScaleForId(meta.yAxisID); - - if (yScale.options.stacked) { - - var sumPos = 0, - sumNeg = 0; - - for (var i = 0; i < datasetIndex; i++) { - var ds = this.chart.data.datasets[i]; - var dsMeta = this.chart.getDatasetMeta(i); - if (dsMeta.type === 'line' && this.chart.isDatasetVisible(i)) { - if (ds.data[index] < 0) { - sumNeg += ds.data[index] || 0; - } else { - sumPos += ds.data[index] || 0; - } - } - } - - if (value < 0) { - return yScale.getPixelForValue(sumNeg + value); - } else { - return yScale.getPixelForValue(sumPos + value); - } - } - - return yScale.getPixelForValue(value); - }, - - updateBezierControlPoints: function() { - // Update bezier control points - var meta = this.getMeta(); - helpers.each(meta.data, function(point, index) { - var controlPoints = helpers.splineCurve( - helpers.previousItem(meta.data, index)._model, - point._model, - helpers.nextItem(meta.data, index)._model, - meta.dataset._model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - point._model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, this.chart.chartArea.right), this.chart.chartArea.left); - point._model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, this.chart.chartArea.bottom), this.chart.chartArea.top); - - point._model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, this.chart.chartArea.right), this.chart.chartArea.left); - point._model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, this.chart.chartArea.bottom), this.chart.chartArea.top); - - // Now pivot the point for animation - point.pivot(); - }, this); - }, - - draw: function(ease) { - var meta = this.getMeta(); - var easingDecimal = ease || 1; - - // Transition Point Locations - helpers.each(meta.data, function(point) { - point.transition(easingDecimal); - }); - - // Transition and Draw the line - if (this.chart.options.showLines) - meta.dataset.transition(easingDecimal).draw(); - - // Draw the points - helpers.each(meta.data, function(point) { - point.draw(); - }); - }, - - setHoverStyle: function(point) { - // Point - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - - point._model.radius = point.custom && point.custom.hoverRadius ? point.custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); - point._model.backgroundColor = point.custom && point.custom.hoverBackgroundColor ? point.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.color(point._model.backgroundColor).saturate(0.5).darken(0.1).rgbString()); - point._model.borderColor = point.custom && point.custom.hoverBorderColor ? point.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.color(point._model.borderColor).saturate(0.5).darken(0.1).rgbString()); - point._model.borderWidth = point.custom && point.custom.hoverBorderWidth ? point.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, point._model.borderWidth); - }, - - removeHoverStyle: function(point) { - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((this.getDataset().radius !== undefined) && (this.getDataset().pointRadius === undefined)) - { - this.getDataset().pointRadius = this.getDataset().radius; - } - - point._model.radius = point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().pointRadius, index, this.chart.options.elements.point.radius); - point._model.backgroundColor = this.getPointBackgroundColor(point, index); - point._model.borderColor = this.getPointBorderColor(point, index); - point._model.borderWidth = this.getPointBorderWidth(point, index); - } - }); -}; +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers; + + Chart.defaults.line = { + showLines: true, + + hover: { + mode: "label" + }, + + scales: { + xAxes: [{ + type: "category", + id: 'x-axis-0' + }], + yAxes: [{ + type: "linear", + id: 'y-axis-0' + }] + } + }; + + Chart.controllers.line = Chart.DatasetController.extend({ + + datasetElementType: Chart.elements.Line, + + dataElementType: Chart.elements.Point, + + addElementAndReset: function(index) { + var me = this; + var options = me.chart.options; + + Chart.DatasetController.prototype.addElementAndReset.call(me, index); + + // Make sure bezier control points are updated + if (options.showLines && options.elements.line.tension !== 0) { + me.updateBezierControlPoints(); + } + }, + + update: function update(reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var options = me.chart.options; + var lineElementOptions = options.elements.line; + var scale = me.getScaleForId(meta.yAxisID); + var i, ilen, dataset, custom; + + // Update Line + if (options.showLines) { + dataset = me.getDataset(); + custom = line.custom || {}; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = { + // Appearance + tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), + borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), + borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), + borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), + borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), + fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), + // Scale + scaleTop: scale.top, + scaleBottom: scale.bottom, + scaleZero: scale.getBasePixel() + }; + + line.pivot(); + } + + // Update Points + for (i=0, ilen=points.length; i'); - - if (chart.data.datasets.length) { - for (var i = 0; i < chart.data.datasets[0].data.length; ++i) { - text.push('
  • '); - if (chart.data.labels[i]) { - text.push(chart.data.labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(""); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var fill = arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(ds.backgroundColor, i, this.chart.options.elements.arc.backgroundColor); - var stroke = arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(ds.borderColor, i, this.chart.options.elements.arc.borderColor); - var bw = arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(ds.borderWidth, i, this.chart.options.elements.arc.borderWidth); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }, this); - } else { - return []; - } - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - return data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel; - } - } - } - }; - - Chart.controllers.polarArea = Chart.DatasetController.extend({ - linkScales: function() { - // no scales for doughnut - }, - - addElements: function() { - var meta = this.getMeta(); - helpers.each(this.getDataset().data, function(value, index) { - meta.data[index] = meta.data[index] || new Chart.elements.Arc({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - }, this); - }, - - addElementAndReset: function(index) { - var arc = new Chart.elements.Arc({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - - // Add to the points array and reset it - this.getMeta().data.splice(index, 0, arc); - this.updateElement(arc, index, true); - }, - - update: function update(reset) { - var meta = this.getMeta(); - var minSize = Math.min(this.chart.chartArea.right - this.chart.chartArea.left, this.chart.chartArea.bottom - this.chart.chartArea.top); - this.chart.outerRadius = Math.max((minSize - this.chart.options.elements.arc.borderWidth / 2) / 2, 0); - this.chart.innerRadius = Math.max(this.chart.options.cutoutPercentage ? (this.chart.outerRadius / 100) * (this.chart.options.cutoutPercentage) : 1, 0); - this.chart.radiusLength = (this.chart.outerRadius - this.chart.innerRadius) / this.chart.getVisibleDatasetCount(); - - this.outerRadius = this.chart.outerRadius - (this.chart.radiusLength * this.index); - this.innerRadius = this.outerRadius - this.chart.radiusLength; - - meta.count = this.countVisibleElements(); - - helpers.each(meta.data, function(arc, index) { - this.updateElement(arc, index, reset); - }, this); - }, - - updateElement: function(arc, index, reset) { - var circumference = this.calculateCircumference(this.getDataset().data[index]); - var centerX = (this.chart.chartArea.left + this.chart.chartArea.right) / 2; - var centerY = (this.chart.chartArea.top + this.chart.chartArea.bottom) / 2; - - // If there is NaN data before us, we need to calculate the starting angle correctly. - // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data - var visibleCount = 0; - var meta = this.getMeta(); - for (var i = 0; i < index; ++i) { - if (!isNaN(this.getDataset().data[i]) && !meta.data[i].hidden) { - ++visibleCount; - } - } - - var distance = arc.hidden? 0 : this.chart.scale.getDistanceFromCenterForValue(this.getDataset().data[index]); - var startAngle = (-0.5 * Math.PI) + (circumference * visibleCount); - var endAngle = startAngle + (arc.hidden? 0 : circumference); - - var resetModel = { - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: this.chart.options.animation.animateScale ? 0 : this.chart.scale.getDistanceFromCenterForValue(this.getDataset().data[index]), - startAngle: this.chart.options.animation.animateRotate ? Math.PI * -0.5 : startAngle, - endAngle: this.chart.options.animation.animateRotate ? Math.PI * -0.5 : endAngle, - - backgroundColor: arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor), - borderWidth: arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth), - borderColor: arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor), - - label: helpers.getValueAtIndexOrDefault(this.chart.data.labels, index, this.chart.data.labels[index]) - }; - - helpers.extend(arc, { - // Utility - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index, - _scale: this.chart.scale, - - // Desired view properties - _model: reset ? resetModel : { - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: distance, - startAngle: startAngle, - endAngle: endAngle, - - backgroundColor: arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor), - borderWidth: arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth), - borderColor: arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor), - - label: helpers.getValueAtIndexOrDefault(this.chart.data.labels, index, this.chart.data.labels[index]) - } - }); - - arc.pivot(); - }, - - draw: function(ease) { - var easingDecimal = ease || 1; - helpers.each(this.getMeta().data, function(arc, index) { - arc.transition(easingDecimal).draw(); - }); - }, - - setHoverStyle: function(arc) { - var dataset = this.chart.data.datasets[arc._datasetIndex]; - var index = arc._index; - - arc._model.backgroundColor = arc.custom && arc.custom.hoverBackgroundColor ? arc.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(arc._model.backgroundColor).saturate(0.5).darken(0.1).rgbString()); - arc._model.borderColor = arc.custom && arc.custom.hoverBorderColor ? arc.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(arc._model.borderColor).saturate(0.5).darken(0.1).rgbString()); - arc._model.borderWidth = arc.custom && arc.custom.hoverBorderWidth ? arc.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, arc._model.borderWidth); - }, - - removeHoverStyle: function(arc) { - var dataset = this.chart.data.datasets[arc._datasetIndex]; - var index = arc._index; - - arc._model.backgroundColor = arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor); - arc._model.borderColor = arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor); - arc._model.borderWidth = arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth); - }, - - countVisibleElements: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers.each(meta.data, function(element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - calculateCircumference: function(value) { - var count = this.getMeta().count; - if (count > 0 && !isNaN(value)) { - return (2 * Math.PI) / count; - } else { - return 0; - } - } - }); -}; +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers; + + Chart.defaults.polarArea = { + + scale: { + type: "radialLinear", + lineArc: true // so that lines are circular + }, + + //Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + aspectRatio: 1, + legendCallback: function(chart) { + var text = []; + text.push('
    '); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('
  • '); + if (labels[i]) { + text.push(labels[i]); + } + text.push('
  • '); + } + } + + text.push('
'); + return text.join(""); + }, + legend: { + labels: { + generateLabels: function(chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function(label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; + var arcOpts = chart.options.elements.arc; + var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); + var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); + var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } else { + return []; + } + } + }, + + onClick: function(e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function() { + return ''; + }, + label: function(tooltipItem, data) { + return data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel; + } + } + } + }; + + Chart.controllers.polarArea = Chart.DatasetController.extend({ + + dataElementType: Chart.elements.Arc, + + linkScales: helpers.noop, + + update: function update(reset) { + var _this = this; + var chart = _this.chart; + var chartArea = chart.chartArea; + var meta = this.getMeta(); + var opts = chart.options; + var arcOpts = opts.elements.arc; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + _this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.index); + _this.innerRadius = _this.outerRadius - chart.radiusLength; + + meta.count = _this.countVisibleElements(); + + helpers.each(meta.data, function(arc, index) { + _this.updateElement(arc, index, reset); + }); + }, + + updateElement: function(arc, index, reset) { + var _this = this; + var chart = _this.chart; + var chartArea = chart.chartArea; + var dataset = _this.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var arcOpts = opts.elements.arc; + var custom = arc.custom || {}; + var scale = chart.scale; + var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; + var labels = chart.data.labels; + + var circumference = _this.calculateCircumference(dataset.data[index]); + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + + // If there is NaN data before us, we need to calculate the starting angle correctly. + // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data + var visibleCount = 0; + var meta = _this.getMeta(); + for (var i = 0; i < index; ++i) { + if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { + ++visibleCount; + } + } + + var distance = arc.hidden? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = (-0.5 * Math.PI) + (circumference * visibleCount); + var endAngle = startAngle + (arc.hidden? 0 : circumference); + + var resetModel = { + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]), + startAngle: animationOpts.animateRotate ? Math.PI * -0.5 : startAngle, + endAngle: animationOpts.animateRotate ? Math.PI * -0.5 : endAngle, + + backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor), + + label: getValueAtIndexOrDefault(labels, index, labels[index]) + }; + + helpers.extend(arc, { + // Utility + _datasetIndex: _this.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: reset ? resetModel : { + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: distance, + startAngle: startAngle, + endAngle: endAngle, + + backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor), + + label: getValueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + removeHoverStyle: function(arc) { + Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); + }, + + countVisibleElements: function() { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers.each(meta.data, function(element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + calculateCircumference: function(value) { + var count = this.getMeta().count; + if (count > 0 && !isNaN(value)) { + return (2 * Math.PI) / count; + } else { + return 0; + } + } + }); +}; },{}],20:[function(require,module,exports){ -"use strict"; +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers; + + Chart.defaults.radar = { + scale: { + type: "radialLinear" + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } + }; + + Chart.controllers.radar = Chart.DatasetController.extend({ + + datasetElementType: Chart.elements.Line, + + dataElementType: Chart.elements.Point, + + linkScales: helpers.noop, + + addElementAndReset: function(index) { + Chart.DatasetController.prototype.addElementAndReset.call(this, index); + + // Make sure bezier control points are updated + this.updateBezierControlPoints(); + }, + + update: function update(reset) { + var meta = this.getMeta(); + var line = meta.dataset; + var points = meta.data; + var custom = line.custom || {}; + var dataset = this.getDataset(); + var lineElementOptions = this.chart.options.elements.line; + var scale = this.chart.scale; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + helpers.extend(meta.dataset, { + // Utility + _datasetIndex: this.index, + // Data + _children: points, + _loop: true, + // Model + _model: { + // Appearance + tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), + borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), + borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), + fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), + borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), + borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), + borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), + borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), + + // Scale + scaleTop: scale.top, + scaleBottom: scale.bottom, + scaleZero: scale.getBasePosition() + } + }); + + meta.dataset.pivot(); + + // Update Points + helpers.each(points, function(point, index) { + this.updateElement(point, index, reset); + }, this); + + + // Update bezier control points + this.updateBezierControlPoints(); + }, + updateElement: function(point, index, reset) { + var custom = point.custom || {}; + var dataset = this.getDataset(); + var scale = this.chart.scale; + var pointElementOptions = this.chart.options.elements.point; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + + helpers.extend(point, { + // Utility + _datasetIndex: this.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales + y: reset ? scale.yCenter : pointPosition.y, + + // Appearance + tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.tension, this.chart.options.elements.line.tension), + radius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), + backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), + borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), + borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), + pointStyle: custom.pointStyle ? custom.pointStyle : helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), + + // Tooltip + hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius) + } + }); + + point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); + }, + updateBezierControlPoints: function() { + var chartArea = this.chart.chartArea; + var meta = this.getMeta(); + + helpers.each(meta.data, function(point, index) { + var model = point._model; + var controlPoints = helpers.splineCurve( + helpers.previousItem(meta.data, index, true)._model, + model, + helpers.nextItem(meta.data, index, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); + model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); + + model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); + model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); + + // Now pivot the point for animation + point.pivot(); + }, this); + }, + + draw: function(ease) { + var meta = this.getMeta(); + var easingDecimal = ease || 1; + + // Transition Point Locations + helpers.each(meta.data, function(point, index) { + point.transition(easingDecimal); + }); + + // Transition and Draw the line + meta.dataset.transition(easingDecimal).draw(); + + // Draw the points + helpers.each(meta.data, function(point) { + point.draw(); + }); + }, + + setHoverStyle: function(point) { + // Point + var dataset = this.chart.data.datasets[point._datasetIndex]; + var custom = point.custom || {}; + var index = point._index; + var model = point._model; + + model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); + model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); + model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); + model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); + }, + + removeHoverStyle: function(point) { + var dataset = this.chart.data.datasets[point._datasetIndex]; + var custom = point.custom || {}; + var index = point._index; + var model = point._model; + var pointElementOptions = this.chart.options.elements.point; + + model.radius = custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.radius, index, pointElementOptions.radius); + model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); + model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); + model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); + } + }); +}; -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - - Chart.defaults.radar = { - scale: { - type: "radialLinear" - }, - elements: { - line: { - tension: 0 // no bezier in radar - } - } - }; - - Chart.controllers.radar = Chart.DatasetController.extend({ - linkScales: function() { - // No need. Single scale only - }, - - addElements: function() { - var meta = this.getMeta(); - - meta.dataset = meta.dataset || new Chart.elements.Line({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _points: meta.data, - _loop: true - }); - - helpers.each(this.getDataset().data, function(value, index) { - meta.data[index] = meta.data[index] || new Chart.elements.Point({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index, - _model: { - x: 0, //xScale.getPixelForValue(null, index, true), - y: 0 //this.chartArea.bottom, - } - }); - }, this); - }, - addElementAndReset: function(index) { - var point = new Chart.elements.Point({ - _chart: this.chart.chart, - _datasetIndex: this.index, - _index: index - }); - - // Add to the points array and reset it - this.getMeta().data.splice(index, 0, point); - this.updateElement(point, index, true); - - // Make sure bezier control points are updated - this.updateBezierControlPoints(); - }, - - update: function update(reset) { - var meta = this.getMeta(); - var line = meta.dataset; - var points = meta.data; - - var scale = this.chart.scale; - var scaleBase; - - if (scale.min < 0 && scale.max < 0) { - scaleBase = scale.getPointPositionForValue(0, scale.max); - } else if (scale.min > 0 && scale.max > 0) { - scaleBase = scale.getPointPositionForValue(0, scale.min); - } else { - scaleBase = scale.getPointPositionForValue(0, 0); - } - - // Compatibility: If the properties are defined with only the old name, use those values - if ((this.getDataset().tension !== undefined) && (this.getDataset().lineTension === undefined)) - { - this.getDataset().lineTension = this.getDataset().tension; - } - - helpers.extend(meta.dataset, { - // Utility - _datasetIndex: this.index, - // Data - _children: points, - // Model - _model: { - // Appearance - tension: line.custom && line.custom.tension ? line.custom.tension : helpers.getValueOrDefault(this.getDataset().lineTension, this.chart.options.elements.line.tension), - backgroundColor: line.custom && line.custom.backgroundColor ? line.custom.backgroundColor : (this.getDataset().backgroundColor || this.chart.options.elements.line.backgroundColor), - borderWidth: line.custom && line.custom.borderWidth ? line.custom.borderWidth : (this.getDataset().borderWidth || this.chart.options.elements.line.borderWidth), - borderColor: line.custom && line.custom.borderColor ? line.custom.borderColor : (this.getDataset().borderColor || this.chart.options.elements.line.borderColor), - fill: line.custom && line.custom.fill ? line.custom.fill : (this.getDataset().fill !== undefined ? this.getDataset().fill : this.chart.options.elements.line.fill), - borderCapStyle: line.custom && line.custom.borderCapStyle ? line.custom.borderCapStyle : (this.getDataset().borderCapStyle || this.chart.options.elements.line.borderCapStyle), - borderDash: line.custom && line.custom.borderDash ? line.custom.borderDash : (this.getDataset().borderDash || this.chart.options.elements.line.borderDash), - borderDashOffset: line.custom && line.custom.borderDashOffset ? line.custom.borderDashOffset : (this.getDataset().borderDashOffset || this.chart.options.elements.line.borderDashOffset), - borderJoinStyle: line.custom && line.custom.borderJoinStyle ? line.custom.borderJoinStyle : (this.getDataset().borderJoinStyle || this.chart.options.elements.line.borderJoinStyle), - - // Scale - scaleTop: scale.top, - scaleBottom: scale.bottom, - scaleZero: scaleBase - } - }); - - meta.dataset.pivot(); - - // Update Points - helpers.each(points, function(point, index) { - this.updateElement(point, index, reset); - }, this); - - - // Update bezier control points - this.updateBezierControlPoints(); - }, - updateElement: function(point, index, reset) { - var pointPosition = this.chart.scale.getPointPositionForValue(index, this.getDataset().data[index]); - - helpers.extend(point, { - // Utility - _datasetIndex: this.index, - _index: index, - _scale: this.chart.scale, - - // Desired view properties - _model: { - x: reset ? this.chart.scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales - y: reset ? this.chart.scale.yCenter : pointPosition.y, - - // Appearance - tension: point.custom && point.custom.tension ? point.custom.tension : helpers.getValueOrDefault(this.getDataset().tension, this.chart.options.elements.line.tension), - radius: point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().pointRadius, index, this.chart.options.elements.point.radius), - backgroundColor: point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBackgroundColor, index, this.chart.options.elements.point.backgroundColor), - borderColor: point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderColor, index, this.chart.options.elements.point.borderColor), - borderWidth: point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderWidth, index, this.chart.options.elements.point.borderWidth), - pointStyle: point.custom && point.custom.pointStyle ? point.custom.pointStyle : helpers.getValueAtIndexOrDefault(this.getDataset().pointStyle, index, this.chart.options.elements.point.pointStyle), - - // Tooltip - hitRadius: point.custom && point.custom.hitRadius ? point.custom.hitRadius : helpers.getValueAtIndexOrDefault(this.getDataset().hitRadius, index, this.chart.options.elements.point.hitRadius) - } - }); - - point._model.skip = point.custom && point.custom.skip ? point.custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); - }, - updateBezierControlPoints: function() { - var meta = this.getMeta(); - helpers.each(meta.data, function(point, index) { - var controlPoints = helpers.splineCurve( - helpers.previousItem(meta.data, index, true)._model, - point._model, - helpers.nextItem(meta.data, index, true)._model, - point._model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - point._model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, this.chart.chartArea.right), this.chart.chartArea.left); - point._model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, this.chart.chartArea.bottom), this.chart.chartArea.top); - - point._model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, this.chart.chartArea.right), this.chart.chartArea.left); - point._model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, this.chart.chartArea.bottom), this.chart.chartArea.top); - - // Now pivot the point for animation - point.pivot(); - }, this); - }, - - draw: function(ease) { - var meta = this.getMeta(); - var easingDecimal = ease || 1; - - // Transition Point Locations - helpers.each(meta.data, function(point, index) { - point.transition(easingDecimal); - }); - - // Transition and Draw the line - meta.dataset.transition(easingDecimal).draw(); - - // Draw the points - helpers.each(meta.data, function(point) { - point.draw(); - }); - }, - - setHoverStyle: function(point) { - // Point - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - - point._model.radius = point.custom && point.custom.hoverRadius ? point.custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); - point._model.backgroundColor = point.custom && point.custom.hoverBackgroundColor ? point.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.color(point._model.backgroundColor).saturate(0.5).darken(0.1).rgbString()); - point._model.borderColor = point.custom && point.custom.hoverBorderColor ? point.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.color(point._model.borderColor).saturate(0.5).darken(0.1).rgbString()); - point._model.borderWidth = point.custom && point.custom.hoverBorderWidth ? point.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, point._model.borderWidth); - }, - - removeHoverStyle: function(point) { - var dataset = this.chart.data.datasets[point._datasetIndex]; - var index = point._index; - - point._model.radius = point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().radius, index, this.chart.options.elements.point.radius); - point._model.backgroundColor = point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBackgroundColor, index, this.chart.options.elements.point.backgroundColor); - point._model.borderColor = point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderColor, index, this.chart.options.elements.point.borderColor); - point._model.borderWidth = point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderWidth, index, this.chart.options.elements.point.borderWidth); - } - }); -}; },{}],21:[function(require,module,exports){ -/*global window: false */ -"use strict"; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.global.animation = { - duration: 1000, - easing: "easeOutQuart", - onProgress: helpers.noop, - onComplete: helpers.noop - }; - - Chart.Animation = Chart.Element.extend({ - currentStep: null, // the current animation step - numSteps: 60, // default number of steps - easing: "", // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null // user specified callback to fire when the animation finishes - }); - - Chart.animationService = { - frameDuration: 17, - animations: [], - dropFrames: 0, - request: null, - addAnimation: function(chartInstance, animationObject, duration, lazy) { - - if (!lazy) { - chartInstance.animating = true; - } - - for (var index = 0; index < this.animations.length; ++index) { - if (this.animations[index].chartInstance === chartInstance) { - // replacing an in progress animation - this.animations[index].animationObject = animationObject; - return; - } - } - - this.animations.push({ - chartInstance: chartInstance, - animationObject: animationObject - }); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (this.animations.length === 1) { - this.requestAnimationFrame(); - } - }, - // Cancel the animation for a given chart instance - cancelAnimation: function(chartInstance) { - var index = helpers.findIndex(this.animations, function(animationWrapper) { - return animationWrapper.chartInstance === chartInstance; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chartInstance.animating = false; - } - }, - requestAnimationFrame: function() { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers.requestAnimFrame.call(window, function() { - me.request = null; - me.startDigest(); - }); - } - }, - startDigest: function() { - - var startTime = Date.now(); - var framesToDrop = 0; - - if (this.dropFrames > 1) { - framesToDrop = Math.floor(this.dropFrames); - this.dropFrames = this.dropFrames % 1; - } - - var i = 0; - while (i < this.animations.length) { - if (this.animations[i].animationObject.currentStep === null) { - this.animations[i].animationObject.currentStep = 0; - } - - this.animations[i].animationObject.currentStep += 1 + framesToDrop; - - if (this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps) { - this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps; - } - - this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject); - if (this.animations[i].animationObject.onAnimationProgress && this.animations[i].animationObject.onAnimationProgress.call) { - this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance, this.animations[i]); - } - - if (this.animations[i].animationObject.currentStep === this.animations[i].animationObject.numSteps) { - if (this.animations[i].animationObject.onAnimationComplete && this.animations[i].animationObject.onAnimationComplete.call) { - this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance, this.animations[i]); - } - - // executed the last frame. Remove the animation. - this.animations[i].chartInstance.animating = false; - - this.animations.splice(i, 1); - } else { - ++i; - } - } - - var endTime = Date.now(); - var dropFrames = (endTime - startTime) / this.frameDuration; - - this.dropFrames += dropFrames; - - // Do we have more stuff to animate? - if (this.animations.length > 0) { - this.requestAnimationFrame(); - } - } - }; +/*global window: false */ +"use strict"; + +module.exports = function(Chart) { + + var helpers = Chart.helpers; + + Chart.defaults.global.animation = { + duration: 1000, + easing: "easeOutQuart", + onProgress: helpers.noop, + onComplete: helpers.noop + }; + + Chart.Animation = Chart.Element.extend({ + currentStep: null, // the current animation step + numSteps: 60, // default number of steps + easing: "", // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null // user specified callback to fire when the animation finishes + }); + + Chart.animationService = { + frameDuration: 17, + animations: [], + dropFrames: 0, + request: null, + addAnimation: function(chartInstance, animationObject, duration, lazy) { + + if (!lazy) { + chartInstance.animating = true; + } + + for (var index = 0; index < this.animations.length; ++index) { + if (this.animations[index].chartInstance === chartInstance) { + // replacing an in progress animation + this.animations[index].animationObject = animationObject; + return; + } + } + + this.animations.push({ + chartInstance: chartInstance, + animationObject: animationObject + }); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (this.animations.length === 1) { + this.requestAnimationFrame(); + } + }, + // Cancel the animation for a given chart instance + cancelAnimation: function(chartInstance) { + var index = helpers.findIndex(this.animations, function(animationWrapper) { + return animationWrapper.chartInstance === chartInstance; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chartInstance.animating = false; + } + }, + requestAnimationFrame: function() { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers.requestAnimFrame.call(window, function() { + me.request = null; + me.startDigest(); + }); + } + }, + startDigest: function() { + + var startTime = Date.now(); + var framesToDrop = 0; + + if (this.dropFrames > 1) { + framesToDrop = Math.floor(this.dropFrames); + this.dropFrames = this.dropFrames % 1; + } + + var i = 0; + while (i < this.animations.length) { + if (this.animations[i].animationObject.currentStep === null) { + this.animations[i].animationObject.currentStep = 0; + } + + this.animations[i].animationObject.currentStep += 1 + framesToDrop; + + if (this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps) { + this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps; + } + + this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject); + if (this.animations[i].animationObject.onAnimationProgress && this.animations[i].animationObject.onAnimationProgress.call) { + this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance, this.animations[i]); + } + + if (this.animations[i].animationObject.currentStep === this.animations[i].animationObject.numSteps) { + if (this.animations[i].animationObject.onAnimationComplete && this.animations[i].animationObject.onAnimationComplete.call) { + this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance, this.animations[i]); + } + + // executed the last frame. Remove the animation. + this.animations[i].chartInstance.animating = false; + + this.animations.splice(i, 1); + } else { + ++i; + } + } + + var endTime = Date.now(); + var dropFrames = (endTime - startTime) / this.frameDuration; + + this.dropFrames += dropFrames; + + // Do we have more stuff to animate? + if (this.animations.length > 0) { + this.requestAnimationFrame(); + } + } + }; }; },{}],22:[function(require,module,exports){ -"use strict"; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - //Create a dictionary of chart types, to allow for extension of existing types - Chart.types = {}; - - //Store a reference to each instance - allowing us to globally resize chart instances on window resize. - //Destroy method on the chart will remove the instance of the chart from this reference. - Chart.instances = {}; - - // Controllers available for dataset visualization eg. bar, line, slice, etc. - Chart.controllers = {}; - - // The main controller of a chart - Chart.Controller = function(instance) { - - this.chart = instance; - this.config = instance.config; - this.options = this.config.options = helpers.configMerge(Chart.defaults.global, Chart.defaults[this.config.type], this.config.options || {}); - this.id = helpers.uid(); - - Object.defineProperty(this, 'data', { - get: function() { - return this.config.data; - } - }); - - //Add the chart instance to the global namespace - Chart.instances[this.id] = this; - - if (this.options.responsive) { - // Silent resize before chart draws - this.resize(true); - } - - this.initialize(); - - return this; - }; - - helpers.extend(Chart.Controller.prototype, { - - initialize: function initialize() { - // Before init plugin notification - Chart.pluginService.notifyPlugins('beforeInit', [this]); - - this.bindEvents(); - - // Make sure controllers are built first so that each dataset is bound to an axis before the scales - // are built - this.ensureScalesHaveIDs(); - this.buildOrUpdateControllers(); - this.buildScales(); - this.buildSurroundingItems(); - this.updateLayout(); - this.resetElements(); - this.initToolTip(); - this.update(); - - // After init plugin notification - Chart.pluginService.notifyPlugins('afterInit', [this]); - - return this; - }, - - clear: function clear() { - helpers.clear(this.chart); - return this; - }, - - stop: function stop() { - // Stops any current animation loop occuring - Chart.animationService.cancelAnimation(this); - return this; - }, - - resize: function resize(silent) { - var canvas = this.chart.canvas; - var newWidth = helpers.getMaximumWidth(this.chart.canvas); - var newHeight = (this.options.maintainAspectRatio && isNaN(this.chart.aspectRatio) === false && isFinite(this.chart.aspectRatio) && this.chart.aspectRatio !== 0) ? newWidth / this.chart.aspectRatio : helpers.getMaximumHeight(this.chart.canvas); - - var sizeChanged = this.chart.width !== newWidth || this.chart.height !== newHeight; - - if (!sizeChanged) - return this; - - canvas.width = this.chart.width = newWidth; - canvas.height = this.chart.height = newHeight; - - helpers.retinaScale(this.chart); - - if (!silent) { - this.stop(); - this.update(this.options.responsiveAnimationDuration); - } - - return this; - }, - ensureScalesHaveIDs: function ensureScalesHaveIDs() { - var defaultXAxisID = 'x-axis-'; - var defaultYAxisID = 'y-axis-'; - - if (this.options.scales) { - if (this.options.scales.xAxes && this.options.scales.xAxes.length) { - helpers.each(this.options.scales.xAxes, function(xAxisOptions, index) { - xAxisOptions.id = xAxisOptions.id || (defaultXAxisID + index); - }); - } - - if (this.options.scales.yAxes && this.options.scales.yAxes.length) { - // Build the y axes - helpers.each(this.options.scales.yAxes, function(yAxisOptions, index) { - yAxisOptions.id = yAxisOptions.id || (defaultYAxisID + index); - }); - } - } - }, - buildScales: function buildScales() { - // Map of scale ID to scale object so we can lookup later - this.scales = {}; - - // Build the x axes - if (this.options.scales) { - if (this.options.scales.xAxes && this.options.scales.xAxes.length) { - helpers.each(this.options.scales.xAxes, function(xAxisOptions, index) { - var xType = helpers.getValueOrDefault(xAxisOptions.type, 'category'); - var ScaleClass = Chart.scaleService.getScaleConstructor(xType); - if (ScaleClass) { - var scale = new ScaleClass({ - ctx: this.chart.ctx, - options: xAxisOptions, - chart: this, - id: xAxisOptions.id - }); - - this.scales[scale.id] = scale; - } - }, this); - } - - if (this.options.scales.yAxes && this.options.scales.yAxes.length) { - // Build the y axes - helpers.each(this.options.scales.yAxes, function(yAxisOptions, index) { - var yType = helpers.getValueOrDefault(yAxisOptions.type, 'linear'); - var ScaleClass = Chart.scaleService.getScaleConstructor(yType); - if (ScaleClass) { - var scale = new ScaleClass({ - ctx: this.chart.ctx, - options: yAxisOptions, - chart: this, - id: yAxisOptions.id - }); - - this.scales[scale.id] = scale; - } - }, this); - } - } - if (this.options.scale) { - // Build radial axes - var ScaleClass = Chart.scaleService.getScaleConstructor(this.options.scale.type); - if (ScaleClass) { - var scale = new ScaleClass({ - ctx: this.chart.ctx, - options: this.options.scale, - chart: this - }); - - this.scale = scale; - - this.scales.radialScale = scale; - } - } - - Chart.scaleService.addScalesToLayout(this); - }, - - buildSurroundingItems: function() { - if (this.options.title) { - this.titleBlock = new Chart.Title({ - ctx: this.chart.ctx, - options: this.options.title, - chart: this - }); - - Chart.layoutService.addBox(this, this.titleBlock); - } - - if (this.options.legend) { - this.legend = new Chart.Legend({ - ctx: this.chart.ctx, - options: this.options.legend, - chart: this - }); - - Chart.layoutService.addBox(this, this.legend); - } - }, - - updateLayout: function() { - Chart.layoutService.update(this, this.chart.width, this.chart.height); - }, - - buildOrUpdateControllers: function buildOrUpdateControllers() { - var types = []; - var newControllers = []; - - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - var meta = this.getDatasetMeta(datasetIndex); - if (!meta.type) { - meta.type = dataset.type || this.config.type; - } - - types.push(meta.type); - - if (meta.controller) { - meta.controller.updateIndex(datasetIndex); - } else { - meta.controller = new Chart.controllers[meta.type](this, datasetIndex); - newControllers.push(meta.controller); - } - }, this); - - if (types.length > 1) { - for (var i = 1; i < types.length; i++) { - if (types[i] !== types[i - 1]) { - this.isCombo = true; - break; - } - } - } - - return newControllers; - }, - - resetElements: function resetElements() { - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - this.getDatasetMeta(datasetIndex).controller.reset(); - }, this); - }, - - update: function update(animationDuration, lazy) { - Chart.pluginService.notifyPlugins('beforeUpdate', [this]); - - // In case the entire data object changed - this.tooltip._data = this.data; - - // Make sure dataset controllers are updated and new controllers are reset - var newControllers = this.buildOrUpdateControllers(); - - // Make sure all dataset controllers have correct meta data counts - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - this.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); - }, this); - - Chart.layoutService.update(this, this.chart.width, this.chart.height); - - // Can only reset the new controllers after the scales have been updated - helpers.each(newControllers, function(controller) { - controller.reset(); - }); - - // This will loop through any data and do the appropriate element update for the type - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - this.getDatasetMeta(datasetIndex).controller.update(); - }, this); - - this.render(animationDuration, lazy); - - Chart.pluginService.notifyPlugins('afterUpdate', [this]); - }, - - render: function render(duration, lazy) { - Chart.pluginService.notifyPlugins('beforeRender', [this]); - - if (this.options.animation && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && this.options.animation.duration !== 0))) { - var animation = new Chart.Animation(); - animation.numSteps = (duration || this.options.animation.duration) / 16.66; //60 fps - animation.easing = this.options.animation.easing; - - // render function - animation.render = function(chartInstance, animationObject) { - var easingFunction = helpers.easingEffects[animationObject.easing]; - var stepDecimal = animationObject.currentStep / animationObject.numSteps; - var easeDecimal = easingFunction(stepDecimal); - - chartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep); - }; - - // user events - animation.onAnimationProgress = this.options.animation.onProgress; - animation.onAnimationComplete = this.options.animation.onComplete; - - Chart.animationService.addAnimation(this, animation, duration, lazy); - } else { - this.draw(); - if (this.options.animation && this.options.animation.onComplete && this.options.animation.onComplete.call) { - this.options.animation.onComplete.call(this); - } - } - return this; - }, - - draw: function(ease) { - var easingDecimal = ease || 1; - this.clear(); - - Chart.pluginService.notifyPlugins('beforeDraw', [this, easingDecimal]); - - // Draw all the scales - helpers.each(this.boxes, function(box) { - box.draw(this.chartArea); - }, this); - if (this.scale) { - this.scale.draw(); - } - - // Clip out the chart area so that anything outside does not draw. This is necessary for zoom and pan to function - this.chart.ctx.save(); - this.chart.ctx.beginPath(); - this.chart.ctx.rect(this.chartArea.left, this.chartArea.top, this.chartArea.right - this.chartArea.left, this.chartArea.bottom - this.chartArea.top); - this.chart.ctx.clip(); - - // Draw each dataset via its respective controller (reversed to support proper line stacking) - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - if (this.isDatasetVisible(datasetIndex)) { - this.getDatasetMeta(datasetIndex).controller.draw(ease); - } - }, this, true); - - // Restore from the clipping operation - this.chart.ctx.restore(); - - // Finally draw the tooltip - this.tooltip.transition(easingDecimal).draw(); - - Chart.pluginService.notifyPlugins('afterDraw', [this, easingDecimal]); - }, - - // Get the single element that was clicked on - // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw - getElementAtEvent: function(e) { - var eventPosition = helpers.getRelativePosition(e, this.chart); - var elementsArray = []; - - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - if (this.isDatasetVisible(datasetIndex)) { - var meta = this.getDatasetMeta(datasetIndex); - helpers.each(meta.data, function(element, index) { - if (element.inRange(eventPosition.x, eventPosition.y)) { - elementsArray.push(element); - return elementsArray; - } - }); - } - }, this); - - return elementsArray; - }, - - getElementsAtEvent: function(e) { - var eventPosition = helpers.getRelativePosition(e, this.chart); - var elementsArray = []; - - var found = (function() { - if (this.data.datasets) { - for (var i = 0; i < this.data.datasets.length; i++) { - var meta = this.getDatasetMeta(i); - if (this.isDatasetVisible(i)) { - for (var j = 0; j < meta.data.length; j++) { - if (meta.data[j].inRange(eventPosition.x, eventPosition.y)) { - return meta.data[j]; - } - } - } - } - } - }).call(this); - - if (!found) { - return elementsArray; - } - - helpers.each(this.data.datasets, function(dataset, datasetIndex) { - if (this.isDatasetVisible(datasetIndex)) { - var meta = this.getDatasetMeta(datasetIndex); - elementsArray.push(meta.data[found._index]); - } - }, this); - - return elementsArray; - }, - - getDatasetAtEvent: function(e) { - var elementsArray = this.getElementAtEvent(e); - - if (elementsArray.length > 0) { - elementsArray = this.getDatasetMeta(elementsArray[0]._datasetIndex).data; - } - - return elementsArray; - }, - - getDatasetMeta: function(datasetIndex) { - var dataset = this.data.datasets[datasetIndex]; - if (!dataset._meta) { - dataset._meta = {}; - } - - var meta = dataset._meta[this.id]; - if (!meta) { - meta = dataset._meta[this.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, // See isDatasetVisible() comment - xAxisID: null, - yAxisID: null - }; - } - - return meta; - }, - - getVisibleDatasetCount: function() { - var count = 0; - for (var i = 0, ilen = this.data.datasets.length; i
-### Example usage +### Example Usage ```javascript var myBarChart = new Chart(ctx, { type: 'bar', @@ -31,7 +31,7 @@ var myBarChart = new Chart(ctx, { }); ``` -### Data structure +### Data Structure The following options can be included in a bar chart dataset to configure options for that specific dataset. Some properties can be specified as an array. If these are set to an array value, the first value applies to the first bar, the second value to the second bar, and so on. @@ -73,20 +73,20 @@ We have an array of labels too for display. In the example, we are showing the s ### Chart Options -These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. +These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. The default options for bar chart are defined in `Chart.defaults.bar`. Name | Type | Default | Description --- |:---:| --- | --- -stacked | Boolean | false | *hover*.mode | String | "label" | Label's hover mode. "label" is used since the x axis displays data by the index in the dataset. scales | Object | - | - *scales*.xAxes | Array | | The bar chart officially supports only 1 x-axis but uses an array to keep the API consistent. Use a scatter chart if you need multiple x axes. *Options for xAxes* | | | type | String | "Category" | As defined in [Scales](#scales-category-scale). display | Boolean | true | If true, show the scale. -id | String | "x-axis-1" | Id of the axis so that data can bind to it +id | String | "x-axis-0" | Id of the axis so that data can bind to it +stacked | Boolean | false | If true, bars are stacked on the x-axis categoryPercentage | Number | 0.8 | Percent (0-1) of the available width (the space between the gridlines for small datasets) for each data-point to use for the bars. [Read More](#bar-chart-barpercentage-vs-categorypercentage) barPercentage | Number | 0.9 | Percent (0-1) of the available width each bar should be within the category percentage. 1.0 will take the whole category width and put the bars right next to each other. [Read More](#bar-chart-barpercentage-vs-categorypercentage) gridLines | Object | [See Scales](#scales) | @@ -96,7 +96,8 @@ gridLines | Object | [See Scales](#scales) | *Options for xAxes* | | | type | String | "linear" | As defined in [Scales](#scales-linear-scale). display | Boolean | true | If true, show the scale. -id | String | "y-axis-1" | Id of the axis so that data can bind to it. +id | String | "y-axis-0" | Id of the axis so that data can bind to it. +stacked | Boolean | false | If true, bars are stacked on the y-axis You can override these for your `Chart` instance by passing a second argument into the `Bar` method as an object with the keys you want to override. @@ -156,4 +157,4 @@ Sample: |==============| Bar: |1.||1.| Category: | .5 | Sample: |==============| -``` \ No newline at end of file +``` diff --git a/vendors/Chart.js/docs/04-Radar-Chart.md b/vendors/Chart.js/docs/05-Radar-Chart.md similarity index 97% rename from vendors/Chart.js/docs/04-Radar-Chart.md rename to vendors/Chart.js/docs/05-Radar-Chart.md index 8eb40547..ce98dc4e 100644 --- a/vendors/Chart.js/docs/04-Radar-Chart.md +++ b/vendors/Chart.js/docs/05-Radar-Chart.md @@ -12,7 +12,7 @@ They are often useful for comparing the points of two or more different data set
-### Example usage +### Example Usage ```javascript var myRadarChart = new Chart(ctx, { @@ -22,7 +22,7 @@ var myRadarChart = new Chart(ctx, { }); ``` -### Data structure +### Data Structure The following options can be included in a radar chart dataset to configure options for that specific dataset. @@ -88,7 +88,7 @@ The label key on each dataset is optional, and can be used when generating a sca ### Chart Options -These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. +These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. The default options for radar chart are defined in `Chart.defaults.radar`. diff --git a/vendors/Chart.js/docs/05-Polar-Area-Chart.md b/vendors/Chart.js/docs/06-Polar-Area-Chart.md similarity index 96% rename from vendors/Chart.js/docs/05-Polar-Area-Chart.md rename to vendors/Chart.js/docs/06-Polar-Area-Chart.md index d0d4d304..3b94b731 100644 --- a/vendors/Chart.js/docs/05-Polar-Area-Chart.md +++ b/vendors/Chart.js/docs/06-Polar-Area-Chart.md @@ -11,7 +11,7 @@ This type of chart is often useful when we want to show a comparison data simila
-### Example usage +### Example Usage ```javascript new Chart(ctx, { @@ -21,7 +21,7 @@ new Chart(ctx, { }); ``` -### Data structure +### Data Structure The following options can be included in a polar area chart dataset to configure options for that specific dataset. @@ -70,9 +70,9 @@ var data = { ``` As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. -### Chart options +### Chart Options -These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. +These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. Name | Type | Default | Description --- | --- | --- | --- diff --git a/vendors/Chart.js/docs/06-Pie-Doughnut-Chart.md b/vendors/Chart.js/docs/07-Pie-Doughnut-Chart.md similarity index 93% rename from vendors/Chart.js/docs/06-Pie-Doughnut-Chart.md rename to vendors/Chart.js/docs/07-Pie-Doughnut-Chart.md index b96816cc..3347d730 100644 --- a/vendors/Chart.js/docs/06-Pie-Doughnut-Chart.md +++ b/vendors/Chart.js/docs/07-Pie-Doughnut-Chart.md @@ -20,7 +20,7 @@ They are also registered under two aliases in the `Chart` core. Other than their

-### Example usage +### Example Usage ```javascript // For a pie chart @@ -40,7 +40,7 @@ var myDoughnutChart = new Chart(ctx, { }); ``` -### Data structure +### Data Structure Property | Type | Usage --- | --- | --- @@ -59,7 +59,7 @@ An example data object using these attributes is shown below. var data = { labels: [ "Red", - "Green", + "Blue", "Yellow" ], datasets: [ @@ -81,9 +81,9 @@ var data = { For a pie chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. You can also add an array of background colors. The color attributes should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. -### Chart options +### Chart Options -These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart. +These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. Name | Type | Default | Description --- | --- | --- | --- @@ -92,7 +92,7 @@ rotation | Number | -0.5 * Math.PI | Starting angle to draw arcs from circumference | Number | 2 * Math.PI | Sweep to allow arcs to cover *animation*.animateRotate | Boolean |true | If true, will animate the rotation of the chart. *animation*.animateScale | Boolean | false | If true, will animate scaling the Doughnut from the centre. -*legend*.*labels*.generateLabels | Function | `function(data) {} ` | Returns labels for each the legend +*legend*.*labels*.generateLabels | Function | `function(chart) {} ` | Returns a label for each item to be displayed on the legend. *legend*.onClick | Function | function(event, legendItem) {} ` | Handles clicking an individual legend item You can override these for your `Chart` instance by passing a second argument into the `Doughnut` method as an object with the keys you want to override. diff --git a/vendors/Chart.js/docs/08-Bubble-Chart.md b/vendors/Chart.js/docs/08-Bubble-Chart.md new file mode 100644 index 00000000..cca36640 --- /dev/null +++ b/vendors/Chart.js/docs/08-Bubble-Chart.md @@ -0,0 +1,100 @@ +--- +title: Bubble Chart +anchor: bubble-chart +--- +### Introduction +A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles. + +
+ +
+
+ +### Example Usage + +```javascript +// For a bubble chart +var myBubbleChart = new Chart(ctx,{ + type: 'bubble', + data: data, + options: options +}); +``` + +### Data Structure + +Property | Type | Usage +--- | --- | --- +data | `Array` | The data to plot as bubbles. See [Data format](#bubble-chart-data-format) +label | `String` | The label for the dataset which appears in the legend and tooltips +backgroundColor | `Color Array` | The fill color of the bubbles. +borderColor | `Color or Array` | The stroke color of the bubbles. +borderWidth | `Number or Array` | The stroke width of bubble in pixels. +hoverBackgroundColor | `Color or Array` | The fill color of the bubbles when hovered. +hoverBorderColor | `Color or Array` | The stroke color of the bubbles when hovered. +hoverBorderWidth | `Number or Array` | The stroke width of the bubbles when hovered. +hoverRadius | `Number or Array` | Additional radius to add to data radius on hover. + +An example data object using these attributes is shown below. This example creates a single dataset with 2 different bubbles. + +```javascript +var data = { + datasets: [ + { + label: 'First Dataset', + data: [ + { + x: 20, + y: 30, + r: 15 + }, + { + x: 40, + y: 10, + r: 10 + } + ], + backgroundColor:"#FF6384", + hoverBackgroundColor: "#FF6384", + }] +}; +``` + +### Data Object + +Data for the bubble chart is passed in the form of an object. The object must implement the following interface. It is important to note that the radius property, `r` is **not** scaled by the chart. It is the raw radius in pixels of the bubble that is drawn on the canvas. + +```javascript +{ + // X Value + x: , + + // Y Value + y: , + + // Radius of bubble. This is not scaled. + r: +} +``` + +### Chart Options + +The bubble chart has no unique configuration options. To configure options common to all of the bubbles, the point element options are used. + +For example, to give all bubbles a 1px wide black border, the following options would be used. + +```javascript +new Chart(ctx,{ + type:"bubble", + options: { + elements: { + points: { + borderWidth: 1, + borderColor: 'rgb(0, 0, 0)' + } + } + } +}); +``` + +We can also change the default values for the Bubble chart type. Doing so will give all bubble charts created after this point the new defaults. The default configuration for the bubble chart can be accessed at `Chart.defaults.bubble`. diff --git a/vendors/Chart.js/docs/07-Advanced.md b/vendors/Chart.js/docs/09-Advanced.md similarity index 98% rename from vendors/Chart.js/docs/07-Advanced.md rename to vendors/Chart.js/docs/09-Advanced.md index 4bedca3e..ff2810f8 100644 --- a/vendors/Chart.js/docs/07-Advanced.md +++ b/vendors/Chart.js/docs/09-Advanced.md @@ -4,7 +4,7 @@ anchor: advanced-usage --- -### Prototype methods +### Prototype Methods For each chart, there are a set of global prototype methods on the shared `ChartType` which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made. @@ -161,7 +161,7 @@ var myPieChart = new Chart(ctx, { See `sample/line-customTooltips.html` for examples on how to get started. -### Writing new scale types +### Writing New Scale Types Starting with Chart.js 2.0 scales can be individually extended. Scales should always derive from Chart.Scale. @@ -293,7 +293,7 @@ The Core.Scale base class also has some utility functions that you may find usef } ``` -### Writing new chart types +### Writing New Chart Types Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed. @@ -355,7 +355,7 @@ The following methods may optionally be overridden by derived dataset controller } ``` -### Extending existing chart types +### Extending Existing Chart Types Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own. @@ -377,9 +377,11 @@ Plugins will be called at the following times * Start of initialization * End of initialization * Start of update -* End of update +* After the chart scales have calculated +* End of update (before render occurs) * Start of draw * End of draw +* Before an animation is started Plugins should derive from Chart.PluginBase and implement the following interface ```javascript @@ -388,6 +390,7 @@ Plugins should derive from Chart.PluginBase and implement the following interfac afterInit: function(chartInstance) { }, beforeUpdate: function(chartInstance) { }, + afterScaleUpdate: function(chartInstance) { } afterUpdate: function(chartInstance) { }, // This is called at the start of a render. It is only called once, even if the animation will run for a number of frames. Use beforeDraw or afterDraw diff --git a/vendors/Chart.js/docs/08-Notes.md b/vendors/Chart.js/docs/10-Notes.md similarity index 86% rename from vendors/Chart.js/docs/08-Notes.md rename to vendors/Chart.js/docs/10-Notes.md index 61c9e7d0..b3183cae 100644 --- a/vendors/Chart.js/docs/08-Notes.md +++ b/vendors/Chart.js/docs/10-Notes.md @@ -4,7 +4,7 @@ anchor: notes --- ### Previous versions -Please note - documentation for previous versions are available on the GitHub repo. +Please note - documentation for previous versions are available on the GitHub repo. Version 1.x may continue to receive updates for bug fixes or high priority items. - [1.x Documentation](https://github.com/chartjs/Chart.js/tree/v1.1.1/docs) @@ -14,6 +14,8 @@ Chart.js offers support for all browsers where canvas is supported. Browser support for the canvas element is available in all modern & major mobile browsers (http://caniuse.com/#feat=canvas). +Thanks to BrowserStack for allowing our team to test on thousands of browsers. + ### Bugs & issues diff --git a/vendors/Chart.js/gulpfile.js b/vendors/Chart.js/gulpfile.js index a2315eec..d3a03ec8 100644 --- a/vendors/Chart.js/gulpfile.js +++ b/vendors/Chart.js/gulpfile.js @@ -22,17 +22,16 @@ var gulp = require('gulp'), var srcDir = './src/'; var outDir = './dist/'; -var testDir = './test/'; -var header = "/*!\n\ - * Chart.js\n\ - * http://chartjs.org/\n\ - * Version: {{ version }}\n\ - *\n\ - * Copyright 2016 Nick Downie\n\ - * Released under the MIT license\n\ - * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n\ - */\n"; +var header = "/*!\n" + + " * Chart.js\n" + + " * http://chartjs.org/\n" + + " * Version: {{ version }}\n" + + " *\n" + + " * Copyright 2016 Nick Downie\n" + + " * Released under the MIT license\n" + + " * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n" + + " */\n"; var preTestFiles = [ './node_modules/moment/min/moment.min.js', @@ -76,9 +75,9 @@ function buildTask() { .pipe(insert.prepend(header)) .pipe(streamify(replace('{{ version }}', package.version))) .pipe(gulp.dest(outDir)) - .pipe(streamify(uglify({ - preserveComments: 'some' - }))) + .pipe(streamify(uglify())) + .pipe(insert.prepend(header)) + .pipe(streamify(replace('{{ version }}', package.version))) .pipe(streamify(concat('Chart.bundle.min.js'))) .pipe(gulp.dest(outDir)); @@ -89,9 +88,9 @@ function buildTask() { .pipe(insert.prepend(header)) .pipe(streamify(replace('{{ version }}', package.version))) .pipe(gulp.dest(outDir)) - .pipe(streamify(uglify({ - preserveComments: 'some' - }))) + .pipe(streamify(uglify())) + .pipe(insert.prepend(header)) + .pipe(streamify(replace('{{ version }}', package.version))) .pipe(streamify(concat('Chart.min.js'))) .pipe(gulp.dest(outDir)); @@ -116,7 +115,8 @@ function bumpTask(complete) { choices: choices }, function(res) { var increment = res.version.split(' ')[0], - newVersion = semver.inc(package.version, increment); + newVersion = semver.inc(package.version, increment), + oldVersion = package.version; // Set the new versions into the bower/package object package.version = newVersion; @@ -125,6 +125,13 @@ function bumpTask(complete) { // Write these to their own files, then build the output fs.writeFileSync('package.json', JSON.stringify(package, null, 2)); fs.writeFileSync('bower.json', JSON.stringify(bower, null, 2)); + + var oldCDN = 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/'+oldVersion+'/Chart.min.js', + newCDN = 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/'+newVersion+'/Chart.min.js'; + + gulp.src(['./README.md']) + .pipe(replace(oldCDN, newCDN)) + .pipe(gulp.dest('./')); complete(); }); @@ -149,13 +156,15 @@ function validHTMLTask() { .pipe(htmlv()); } - -function unittestTask() { +function startTest() { var files = ['./src/**/*.js']; Array.prototype.unshift.apply(files, preTestFiles); Array.prototype.push.apply(files, testFiles); + return files; +} - return gulp.src(files) +function unittestTask() { + return gulp.src(startTest()) .pipe(karma({ configFile: 'karma.conf.ci.js', action: 'run' @@ -163,11 +172,7 @@ function unittestTask() { } function unittestWatchTask() { - var files = ['./src/**/*.js']; - Array.prototype.unshift.apply(files, preTestFiles); - Array.prototype.push.apply(files, testFiles); - - return gulp.src(files) + return gulp.src(startTest()) .pipe(karma({ configFile: 'karma.conf.js', action: 'watch' @@ -175,11 +180,7 @@ function unittestWatchTask() { } function coverageTask() { - var files = ['./src/**/*.js']; - Array.prototype.unshift.apply(files, preTestFiles); - Array.prototype.push.apply(files, testFiles); - - return gulp.src(files) + return gulp.src(startTest()) .pipe(karma({ configFile: 'karma.coverage.conf.js', action: 'run' diff --git a/vendors/Chart.js/package.json b/vendors/Chart.js/package.json index c905b2f0..91faec90 100644 --- a/vendors/Chart.js/package.json +++ b/vendors/Chart.js/package.json @@ -2,7 +2,7 @@ "name": "chart.js", "homepage": "http://www.chartjs.org", "description": "Simple HTML5 charts using the canvas element.", - "version": "2.1.0", + "version": "2.1.4", "license": "MIT", "main": "src/chart.js", "repository": { @@ -47,7 +47,7 @@ "main": "Chart.js" }, "dependencies": { - "chartjs-color": "^1.0.2", + "chartjs-color": "^2.0.0", "moment": "^2.10.6" } -} +} \ No newline at end of file diff --git a/vendors/Chart.js/samples/timeScale/line-time-point-data.html b/vendors/Chart.js/samples/timeScale/line-time-point-data.html index fe463d55..97e03e3f 100644 --- a/vendors/Chart.js/samples/timeScale/line-time-point-data.html +++ b/vendors/Chart.js/samples/timeScale/line-time-point-data.html @@ -3,7 +3,6 @@ Time Scale Point Data - + + + +
+ +

Configuration Builder

+ +
+ +
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+

Your Date Range Picker

+ + +
+ +
+

Configuration

+ +
+ +
+
+ +
+ +
+ + + + + diff --git a/vendors/bootstrap-daterangepicker/example/amd/main.js b/vendors/bootstrap-daterangepicker/example/amd/main.js new file mode 100644 index 00000000..5c0f99a2 --- /dev/null +++ b/vendors/bootstrap-daterangepicker/example/amd/main.js @@ -0,0 +1,141 @@ +requirejs.config({ + "paths": { + "jquery": "https://code.jquery.com/jquery-1.11.3.min", + "moment": "../../moment", + "daterangepicker": "../../daterangepicker" + } +}); + +requirejs(['jquery', 'moment', 'daterangepicker'] , function ($, moment) { +$(document).ready(function() { + + $('#config-text').keyup(function() { + eval($(this).val()); + }); + + $('.configurator input, .configurator select').change(function() { + updateConfig(); + }); + + $('.demo i').click(function() { + $(this).parent().find('input').click(); + }); + + $('#startDate').daterangepicker({ + singleDatePicker: true, + startDate: moment().subtract(6, 'days') + }); + + $('#endDate').daterangepicker({ + singleDatePicker: true, + startDate: moment() + }); + + updateConfig(); + + function updateConfig() { + var options = {}; + + if ($('#singleDatePicker').is(':checked')) + options.singleDatePicker = true; + + if ($('#showDropdowns').is(':checked')) + options.showDropdowns = true; + + if ($('#showWeekNumbers').is(':checked')) + options.showWeekNumbers = true; + + if ($('#showISOWeekNumbers').is(':checked')) + options.showISOWeekNumbers = true; + + if ($('#timePicker').is(':checked')) + options.timePicker = true; + + if ($('#timePicker24Hour').is(':checked')) + options.timePicker24Hour = true; + + if ($('#timePickerIncrement').val().length && $('#timePickerIncrement').val() != 1) + options.timePickerIncrement = parseInt($('#timePickerIncrement').val(), 10); + + if ($('#timePickerSeconds').is(':checked')) + options.timePickerSeconds = true; + + if ($('#autoApply').is(':checked')) + options.autoApply = true; + + if ($('#dateLimit').is(':checked')) + options.dateLimit = { days: 7 }; + + if ($('#ranges').is(':checked')) { + options.ranges = { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }; + } + + if ($('#locale').is(':checked')) { + options.locale = { + format: 'MM/DD/YYYY HH:mm', + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + fromLabel: 'From', + toLabel: 'To', + customRangeLabel: 'Custom', + daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr','Sa'], + monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + firstDay: 1 + }; + } + + if (!$('#linkedCalendars').is(':checked')) + options.linkedCalendars = false; + + if (!$('#autoUpdateInput').is(':checked')) + options.autoUpdateInput = false; + + if ($('#alwaysShowCalendars').is(':checked')) + options.alwaysShowCalendars = true; + + if ($('#parentEl').val().length) + options.parentEl = $('#parentEl').val(); + + if ($('#startDate').val().length) + options.startDate = $('#startDate').val(); + + if ($('#endDate').val().length) + options.endDate = $('#endDate').val(); + + if ($('#minDate').val().length) + options.minDate = $('#minDate').val(); + + if ($('#maxDate').val().length) + options.maxDate = $('#maxDate').val(); + + if ($('#opens').val().length && $('#opens').val() != 'right') + options.opens = $('#opens').val(); + + if ($('#drops').val().length && $('#drops').val() != 'down') + options.drops = $('#drops').val(); + + if ($('#buttonClasses').val().length && $('#buttonClasses').val() != 'btn btn-sm') + options.buttonClasses = $('#buttonClasses').val(); + + if ($('#applyClass').val().length && $('#applyClass').val() != 'btn-success') + options.applyClass = $('#applyClass').val(); + + if ($('#cancelClass').val().length && $('#cancelClass').val() != 'btn-default') + options.cancelClass = $('#cancelClass').val(); + + $('#config-text').val("$('#demo').daterangepicker(" + JSON.stringify(options, null, ' ') + ", function(start, end, label) {\n console.log(\"New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')\");\n});"); + + $('#config-demo').daterangepicker(options, function(start, end, label) { console.log('New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')'); }); + + } + +}); +}); diff --git a/vendors/bootstrap-daterangepicker/example/amd/require.js b/vendors/bootstrap-daterangepicker/example/amd/require.js new file mode 100644 index 00000000..857eb5b7 --- /dev/null +++ b/vendors/bootstrap-daterangepicker/example/amd/require.js @@ -0,0 +1,36 @@ +/* + RequireJS 2.2.0 Copyright jQuery Foundation and other contributors. + Released under MIT license, http://github.com/requirejs/requirejs/LICENSE +*/ +var requirejs,require,define; +(function(ga){function ka(b,c,d,g){return g||""}function K(b){return"[object Function]"===Q.call(b)}function L(b){return"[object Array]"===Q.call(b)}function y(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(K(k)){if(this.events.error&&this.map.isDefine||g.onError!== +ha)try{h=l.execCb(c,k,b,h)}catch(d){a=d}else h=l.execCb(c,k,b,h);this.map.isDefine&&void 0===h&&((b=this.module)?h=b.exports:this.usingExports&&(h=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",A(this.error=a)}else h=k;this.exports=h;if(this.map.isDefine&&!this.ignore&&(v[c]=h,g.onResourceLoad)){var f=[];y(this.depMaps,function(a){f.push(a.normalizedMap||a)});g.onResourceLoad(l,this.map,f)}C(c); +this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}},callPlugin:function(){var a=this.map,b=a.id,d=q(a.prefix);this.depMaps.push(d);w(d,"defined",z(this,function(h){var k,f,d=e(fa,this.map.id),M=this.map.name,r=this.map.parentMap?this.map.parentMap.name:null,m=l.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(h.normalize&&(M=h.normalize(M,function(a){return c(a,r,!0)})|| +""),f=q(a.prefix+"!"+M,this.map.parentMap),w(f,"defined",z(this,function(a){this.map.normalizedMap=f;this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),h=e(t,f.id)){this.depMaps.push(f);if(this.events.error)h.on("error",z(this,function(a){this.emit("error",a)}));h.enable()}}else d?(this.map.url=l.nameToUrl(d),this.load()):(k=z(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),k.error=z(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];D(t,function(a){0=== +a.map.id.indexOf(b+"_unnormalized")&&C(a.map.id)});A(a)}),k.fromText=z(this,function(h,c){var d=a.name,f=q(d),M=S;c&&(h=c);M&&(S=!1);u(f);x(p.config,b)&&(p.config[d]=p.config[b]);try{g.exec(h)}catch(e){return A(F("fromtexteval","fromText eval for "+b+" failed: "+e,e,[b]))}M&&(S=!0);this.depMaps.push(f);l.completeLoad(d);m([d],k)}),h.load(a.name,m,k,p))}));l.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){Z[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,z(this,function(a, +b){var c,h;if("string"===typeof a){a=q(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=e(R,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;w(a,"defined",z(this,function(a){this.undefed||(this.defineDep(b,a),this.check())}));this.errback?w(a,"error",z(this,this.errback)):this.events.error&&w(a,"error",z(this,function(a){this.emit("error",a)}))}c=a.id;h=t[c];x(R,c)||!h||h.enabled||l.enable(a,this)}));D(this.pluginMaps,z(this,function(a){var b=e(t,a.id); +b&&!b.enabled&&l.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};l={config:p,contextName:b,registry:t,defined:v,urlFetched:W,defQueue:G,defQueueMap:{},Module:da,makeModuleMap:q,nextTick:g.nextTick,onError:A,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");if("string"===typeof a.urlArgs){var b= +a.urlArgs;a.urlArgs=function(a,c){return(-1===c.indexOf("?")?"?":"&")+b}}var c=p.shim,h={paths:!0,bundles:!0,config:!0,map:!0};D(a,function(a,b){h[b]?(p[b]||(p[b]={}),Y(p[b],a,!0,!0)):p[b]=a});a.bundles&&D(a.bundles,function(a,b){y(a,function(a){a!==b&&(fa[a]=b)})});a.shim&&(D(a.shim,function(a,b){L(a)&&(a={deps:a});!a.exports&&!a.init||a.exportsFn||(a.exportsFn=l.makeShimExports(a));c[b]=a}),p.shim=c);a.packages&&y(a.packages,function(a){var b;a="string"===typeof a?{name:a}:a;b=a.name;a.location&& +(p.paths[b]=a.location);p.pkgs[b]=a.name+"/"+(a.main||"main").replace(na,"").replace(U,"")});D(t,function(a,b){a.inited||a.map.unnormalized||(a.map=q(b,null,!0))});(a.deps||a.callback)&&l.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ga,arguments));return b||a.exports&&ia(a.exports)}},makeRequire:function(a,n){function m(c,d,f){var e,r;n.enableBuildCallback&&d&&K(d)&&(d.__requireJsBuild=!0);if("string"===typeof c){if(K(d))return A(F("requireargs", +"Invalid require call"),f);if(a&&x(R,c))return R[c](t[a.id]);if(g.get)return g.get(l,c,a,m);e=q(c,a,!1,!0);e=e.id;return x(v,e)?v[e]:A(F("notloaded",'Module name "'+e+'" has not been loaded yet for context: '+b+(a?"":". Use require([])")))}P();l.nextTick(function(){P();r=u(q(null,a));r.skipMap=n.skipMap;r.init(c,d,f,{enabled:!0});H()});return m}n=n||{};Y(m,{isBrowser:E,toUrl:function(b){var d,f=b.lastIndexOf("."),g=b.split("/")[0];-1!==f&&("."!==g&&".."!==g||1e.attachEvent.toString().indexOf("[native code")||ca?(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)):(S=!0,e.attachEvent("onreadystatechange",b.onScriptLoad));e.src=d;if(m.onNodeCreated)m.onNodeCreated(e,m,c,d);P=e;H?C.insertBefore(e,H):C.appendChild(e);P=null;return e}if(ja)try{setTimeout(function(){}, +0),importScripts(d),b.completeLoad(c)}catch(q){b.onError(F("importscripts","importScripts failed for "+c+" at "+d,q,[c]))}};E&&!w.skipDataMain&&X(document.getElementsByTagName("script"),function(b){C||(C=b.parentNode);if(O=b.getAttribute("data-main"))return u=O,w.baseUrl||-1!==u.indexOf("!")||(I=u.split("/"),u=I.pop(),T=I.length?I.join("/")+"/":"./",w.baseUrl=T),u=u.replace(U,""),g.jsExtRegExp.test(u)&&(u=O),w.deps=w.deps?w.deps.concat(u):[u],!0});define=function(b,c,d){var e,g;"string"!==typeof b&& +(d=c,c=b,b=null);L(c)||(d=c,c=null);!c&&K(d)&&(c=[],d.length&&(d.toString().replace(qa,ka).replace(ra,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));S&&(e=P||pa())&&(b||(b=e.getAttribute("data-requiremodule")),g=J[e.getAttribute("data-requirecontext")]);g?(g.defQueue.push([b,c,d]),g.defQueueMap[b]=!0):V.push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(w)}})(this); diff --git a/vendors/bootstrap-daterangepicker/example/browserify/README.md b/vendors/bootstrap-daterangepicker/example/browserify/README.md new file mode 100644 index 00000000..123b093c --- /dev/null +++ b/vendors/bootstrap-daterangepicker/example/browserify/README.md @@ -0,0 +1,11 @@ +# Browserify example + +Two steps need to be done for this to work + +In the project root + + npm install + +In this folder + + ../../node_modules/.bin/browserify main.js -o bundle.js diff --git a/vendors/bootstrap-daterangepicker/example/browserify/bundle.js b/vendors/bootstrap-daterangepicker/example/browserify/bundle.js new file mode 100644 index 00000000..e69de29b diff --git a/vendors/bootstrap-daterangepicker/example/browserify/index.html b/vendors/bootstrap-daterangepicker/example/browserify/index.html new file mode 100644 index 00000000..bdce82e8 --- /dev/null +++ b/vendors/bootstrap-daterangepicker/example/browserify/index.html @@ -0,0 +1,209 @@ + + + + + A date range picker for Bootstrap + + + + + + +
+ +

Configuration Builder

+ +
+ +
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+

Your Date Range Picker

+ + +
+ +
+

Configuration

+ +
+ +
+
+ +
+ +
+ + + + diff --git a/vendors/bootstrap-daterangepicker/example/browserify/main.js b/vendors/bootstrap-daterangepicker/example/browserify/main.js new file mode 100644 index 00000000..30e92d49 --- /dev/null +++ b/vendors/bootstrap-daterangepicker/example/browserify/main.js @@ -0,0 +1,135 @@ +require('../../daterangepicker.js'); +var $ = require('jquery'), + moment = require('moment'); + +$(document).ready(function() { + + $('#config-text').keyup(function() { + eval($(this).val()); + }); + + $('.configurator input, .configurator select').change(function() { + updateConfig(); + }); + + $('.demo i').click(function() { + $(this).parent().find('input').click(); + }); + + $('#startDate').daterangepicker({ + singleDatePicker: true, + startDate: moment().subtract(6, 'days') + }); + + $('#endDate').daterangepicker({ + singleDatePicker: true, + startDate: moment() + }); + + updateConfig(); + + function updateConfig() { + var options = {}; + + if ($('#singleDatePicker').is(':checked')) + options.singleDatePicker = true; + + if ($('#showDropdowns').is(':checked')) + options.showDropdowns = true; + + if ($('#showWeekNumbers').is(':checked')) + options.showWeekNumbers = true; + + if ($('#showISOWeekNumbers').is(':checked')) + options.showISOWeekNumbers = true; + + if ($('#timePicker').is(':checked')) + options.timePicker = true; + + if ($('#timePicker24Hour').is(':checked')) + options.timePicker24Hour = true; + + if ($('#timePickerIncrement').val().length && $('#timePickerIncrement').val() != 1) + options.timePickerIncrement = parseInt($('#timePickerIncrement').val(), 10); + + if ($('#timePickerSeconds').is(':checked')) + options.timePickerSeconds = true; + + if ($('#autoApply').is(':checked')) + options.autoApply = true; + + if ($('#dateLimit').is(':checked')) + options.dateLimit = { days: 7 }; + + if ($('#ranges').is(':checked')) { + options.ranges = { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }; + } + + if ($('#locale').is(':checked')) { + options.locale = { + format: 'MM/DD/YYYY HH:mm', + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + fromLabel: 'From', + toLabel: 'To', + customRangeLabel: 'Custom', + daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr','Sa'], + monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + firstDay: 1 + }; + } + + if (!$('#linkedCalendars').is(':checked')) + options.linkedCalendars = false; + + if (!$('#autoUpdateInput').is(':checked')) + options.autoUpdateInput = false; + + if ($('#alwaysShowCalendars').is(':checked')) + options.alwaysShowCalendars = true; + + if ($('#parentEl').val().length) + options.parentEl = $('#parentEl').val(); + + if ($('#startDate').val().length) + options.startDate = $('#startDate').val(); + + if ($('#endDate').val().length) + options.endDate = $('#endDate').val(); + + if ($('#minDate').val().length) + options.minDate = $('#minDate').val(); + + if ($('#maxDate').val().length) + options.maxDate = $('#maxDate').val(); + + if ($('#opens').val().length && $('#opens').val() != 'right') + options.opens = $('#opens').val(); + + if ($('#drops').val().length && $('#drops').val() != 'down') + options.drops = $('#drops').val(); + + if ($('#buttonClasses').val().length && $('#buttonClasses').val() != 'btn btn-sm') + options.buttonClasses = $('#buttonClasses').val(); + + if ($('#applyClass').val().length && $('#applyClass').val() != 'btn-success') + options.applyClass = $('#applyClass').val(); + + if ($('#cancelClass').val().length && $('#cancelClass').val() != 'btn-default') + options.cancelClass = $('#cancelClass').val(); + + $('#config-text').val("$('#demo').daterangepicker(" + JSON.stringify(options, null, ' ') + ", function(start, end, label) {\n console.log(\"New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')\");\n});"); + + $('#config-demo').daterangepicker(options, function(start, end, label) { console.log('New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')'); }); + + } + +}); diff --git a/vendors/bootstrap-daterangepicker/package.js b/vendors/bootstrap-daterangepicker/package.js index b3bc174f..604788db 100644 --- a/vendors/bootstrap-daterangepicker/package.js +++ b/vendors/bootstrap-daterangepicker/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'dangrossman:bootstrap-daterangepicker', - version: '2.1.19', + version: '2.1.21', summary: 'Date range picker component for Bootstrap', git: 'https://github.com/dangrossman/bootstrap-daterangepicker', documentation: 'README.md' diff --git a/vendors/bootstrap-daterangepicker/package.json b/vendors/bootstrap-daterangepicker/package.json index cdaed3d2..a25ff681 100644 --- a/vendors/bootstrap-daterangepicker/package.json +++ b/vendors/bootstrap-daterangepicker/package.json @@ -1,6 +1,6 @@ { "name": "bootstrap-daterangepicker", - "version": "2.1.19", + "version": "2.1.21", "description": "Date range picker component for Bootstrap", "main": "daterangepicker.js", "style": "daterangepicker.css", diff --git a/vendors/bootstrap-daterangepicker/website/index.html b/vendors/bootstrap-daterangepicker/website/index.html index 109a50cd..006dfced 100644 --- a/vendors/bootstrap-daterangepicker/website/index.html +++ b/vendors/bootstrap-daterangepicker/website/index.html @@ -603,7 +603,7 @@ showWeekNumbers: (boolean) Show localized week numbers at the start of each week on the calendars
  • - showWeekNumbers: (boolean) Show ISO week numbers at the start of each week on the calendars + showISOWeekNumbers: (boolean) Show ISO week numbers at the start of each week on the calendars
  • timePicker: (boolean) Allow selection of dates with times, not just dates @@ -655,6 +655,11 @@ calendars before they are displayed, and may return true or false to indicate whether that date should be available for selection or not.
  • +
  • + isCustomDate: (function) A function that is passed each date in the two + calendars before they are displayed, and may return a string or array of CSS class names + to apply to that date's calendar cell. +
  • autoUpdateInput: (boolean) Indicates whether the date range picker should automatically update the value of an <input> element it's attached to diff --git a/vendors/bootstrap-daterangepicker/website/website.js b/vendors/bootstrap-daterangepicker/website/website.js index cfd9cf9e..61ea7470 100644 --- a/vendors/bootstrap-daterangepicker/website/website.js +++ b/vendors/bootstrap-daterangepicker/website/website.js @@ -77,6 +77,7 @@ $(document).ready(function() { fromLabel: 'From', toLabel: 'To', customRangeLabel: 'Custom', + weekLabel: 'W', daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr','Sa'], monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], firstDay: 1 @@ -139,4 +140,4 @@ $(document).ready(function() { }); } $('body').scrollspy({ target: '#nav-spy', offset: 20 }); -}); \ No newline at end of file +}); diff --git a/vendors/bootstrap-progressbar/.bower.json b/vendors/bootstrap-progressbar/.bower.json index 4a16cca6..295a4e91 100644 --- a/vendors/bootstrap-progressbar/.bower.json +++ b/vendors/bootstrap-progressbar/.bower.json @@ -34,6 +34,5 @@ }, "_source": "https://github.com/minddust/bootstrap-progressbar.git", "_target": "^0.9.0", - "_originalSource": "bootstrap-progressbar", - "_direct": true + "_originalSource": "bootstrap-progressbar" } \ No newline at end of file diff --git a/vendors/bootstrap-wysiwyg/.bower.json b/vendors/bootstrap-wysiwyg/.bower.json index 6c57f99e..08f79266 100644 --- a/vendors/bootstrap-wysiwyg/.bower.json +++ b/vendors/bootstrap-wysiwyg/.bower.json @@ -38,6 +38,5 @@ }, "_source": "https://github.com/steveathon/bootstrap-wysiwyg.git", "_target": "^1.0.5", - "_originalSource": "bootstrap-wysiwyg-steveathon", - "_direct": true + "_originalSource": "bootstrap-wysiwyg-steveathon" } \ No newline at end of file diff --git a/vendors/bootstrap/.bower.json b/vendors/bootstrap/.bower.json index d35965fd..0ee6a338 100644 --- a/vendors/bootstrap/.bower.json +++ b/vendors/bootstrap/.bower.json @@ -40,6 +40,5 @@ }, "_source": "https://github.com/twbs/bootstrap.git", "_target": "^3.3.6", - "_originalSource": "bootstrap", - "_direct": true + "_originalSource": "bootstrap" } \ No newline at end of file diff --git a/vendors/cropper/.bower.json b/vendors/cropper/.bower.json index 316348aa..07714787 100644 --- a/vendors/cropper/.bower.json +++ b/vendors/cropper/.bower.json @@ -47,20 +47,19 @@ }, "devDependencies": { "bootstrap": "~3.3.6", - "fontawesome": "~4.5.0", - "html5-boilerplate": "~5.2.0", - "jquery": "~1.12.0", - "qunit": "~1.20.0" + "fontawesome": "~4.6.1", + "html5-boilerplate": "~5.3.0", + "jquery": "~1.12.3", + "qunit": "~1.22.0" }, - "version": "2.3.0", - "_release": "2.3.0", + "version": "2.3.1", + "_release": "2.3.1", "_resolution": { "type": "version", - "tag": "v2.3.0", - "commit": "2cbe834845b19c79b84a4d889dc38a156911ebd8" + "tag": "v2.3.1", + "commit": "91547592292e2f296e40bbab4881e41013b80d27" }, "_source": "https://github.com/fengyuanchen/cropper.git", "_target": "^2.3.0", - "_originalSource": "cropper", - "_direct": true + "_originalSource": "cropper" } \ No newline at end of file diff --git a/vendors/cropper/CHANGELOG.md b/vendors/cropper/CHANGELOG.md index be683d7c..4ef3474d 100644 --- a/vendors/cropper/CHANGELOG.md +++ b/vendors/cropper/CHANGELOG.md @@ -1,6 +1,13 @@ # Changelog +## 2.3.1 (May 28, 2016) + +- Improved the rotate and scale transform behaviour (#633, idea by afeibus). +- Improved the `getCroppedCanvas` method to return the whole canvas if it is not cropped (#666, PR by @vinnymac). +- Check cross origin setting when load image by XMLHTTPRequest (#669) + + ## 2.3.0 (Feb 22, 2016) - Added a new parameter to the `replace` method for applying filters. diff --git a/vendors/cropper/README.md b/vendors/cropper/README.md index 68e784f3..65115c34 100644 --- a/vendors/cropper/README.md +++ b/vendors/cropper/README.md @@ -2,7 +2,7 @@ > A simple jQuery image cropping plugin. -- [Homepage](http://fengyuanchen.github.io/cropper) +- [Website](https://fengyuanchen.github.io/cropper) - [Cropper without jQuery](https://github.com/fengyuanchen/cropperjs) [![Build Status Images](https://travis-ci.org/fengyuanchen/cropper.svg)](https://travis-ci.org/fengyuanchen/cropper) @@ -48,8 +48,8 @@ dist/ ├── cropper.css ( 5 KB) ├── cropper.min.css ( 4 KB) -├── cropper.js (77 KB) -└── cropper.min.js (27 KB) +├── cropper.js (79 KB) +└── cropper.min.js (28 KB) ``` @@ -77,7 +77,7 @@ Include files: ``` -The CDNJS provides CDN support for Cropper's CSS and JavaScript. You can find the links [here](https://cdnjs.com/libraries/cropper). +The [cdnjs](https://github.com/cdnjs/cdnjs) provides CDN support for Cropper's CSS and JavaScript. You can find the links [here](https://cdnjs.com/libraries/cropper). ### Usage @@ -85,12 +85,19 @@ The CDNJS provides CDN support for Cropper's CSS and JavaScript. You can find th Initialize with `$.fn.cropper` method. ```html - +
    ``` +```css +/* Limit image width to avoid overflow the container */ +img { + max-width: 100%; /* This rule is very important, please do not ignore this! */ +} +``` + ```js $('#image').cropper({ aspectRatio: 16 / 9, @@ -114,7 +121,8 @@ See the [FAQ](FAQ.md) documentation. #### Notes -- The size of the cropper inherits from the size of the image's parent element (wrapper), so be sure to wrap the image with a visible block element. +- The size of the cropper inherits from the size of the image's parent element (wrapper), so be sure to wrap the image with a **visible block element**. + > If you are using cropper in a modal, you should initialize the cropper after the modal shown completely. Otherwise, you will not get a correct cropper. - The outputted cropped data bases on the original image size, so you can use them to crop the image directly. @@ -125,6 +133,8 @@ See the [FAQ](FAQ.md) documentation. - [Known iOS resource limits](https://developer.apple.com/library/mac/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html): As iOS devices limit memory, the browser may crash when you are cropping a large image (iPhone camera resolution). To avoid this, you may resize the image first (below 1024px) before start a cropper. +- Known image size increase: When export the cropped image on browser-side with the `HTMLCanvasElement.toDataURL` method, the the exported image'size may be greater than the original image's. This is because the exported image'type is not the same as the original image's. So just pass the original image's type as the first parameter to `toDataURL` to fix this. For example, if the original type is JPEG, then use `$().cropper('getCroppedCanvas').toDataURL('image/jpeg')` to export image. + [⬆ back to top](#table-of-contents) @@ -229,6 +239,8 @@ Check the current image's Exif Orientation information. More exactly, read the Orientation value for rotating or flipping the image, and then override the Orientation value with `1` (the default value) to avoid some issues (#120, #509) on iOS devices. +**Note:** Don't trust this all the time as some JPG images have incorrect (not standard) Orientation values. + > Requires [Typed Arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) support ([IE 10+](http://caniuse.com/typedarrays)). @@ -349,7 +361,7 @@ Define zoom ratio when zoom the image by wheeling mouse. - Type: `Boolean` - Default: `true` -Enable to move the crop box. +Enable to move the crop box by dragging. ### cropBoxResizable @@ -357,7 +369,7 @@ Enable to move the crop box. - Type: `Boolean` - Default: `true` -Enable to resize the crop box. +Enable to resize the crop box by dragging. ### toggleDragModeOnDblclick @@ -607,7 +619,7 @@ $().cropper('zoom', -0.1); Zoom the canvas (image wrapper) to an absolute ratio. ```js -$().cropper('zoom', 1); // 1:1 (canvasData.width === canvasData.naturalWidth) +$().cropper('zoomTo', 1); // 1:1 (canvasData.width === canvasData.naturalWidth) ``` @@ -618,7 +630,7 @@ $().cropper('zoom', 1); // 1:1 (canvasData.width === canvasData.naturalWidth) - Rotate right: requires a positive number (degree > 0) - Rotate left: requires a negative number (degree < 0) -Rotate the canvas (image wrapper) with a relative degree. +Rotate the image with a relative degree. > Requires [CSS3 2D Transforms](http://caniuse.com/transforms2d) support (IE 9+). @@ -633,7 +645,7 @@ $().cropper('rotate', -90); - **degree**: - Type: `Number` -Rotate the canvas (image wrapper) to an absolute degree. +Rotate the image to an absolute degree. ### scale(scaleX[, scaleY]) @@ -700,7 +712,9 @@ Scale the ordinate of the image. - `scaleX`: the scaling factor to apply on the abscissa of the image - `scaleY`: the scaling factor to apply on the ordinate of the image -Output the cropped area position and size data (base on the original image). +Output the final cropped area position and size data (base on the natural size of the original image). + +> You can send the data to server-side to crop the image directly. ![a schematic diagram of data's properties](assets/img/data.jpg) @@ -713,7 +727,7 @@ Output the cropped area position and size data (base on the original image). Change the cropped area position and size with new data (base on the original image). -**Note:** Only available in strict mode. +> **Note:** This method only available when the `viewMode` option great than or equal to `1`. ### getContainerData() @@ -829,9 +843,9 @@ Change the crop box position and size with new data. - Rotated image: requires [CSS3 2D Transforms](http://caniuse.com/transforms2d) support (IE 9+). - Cross-origin image: requires HTML5 [CORS settings attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) support (IE 11+). -Get a canvas drawn the cropped image. +Get a canvas drawn the cropped image. If it is not cropped, then returns the whole canvas. -> After then, you can display the canvas as an image directly, or use [canvas.toDataURL](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL) to get a Data URL, or use [canvas.toBlob](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob) to get a blob and upload it to server with [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData) if the browser supports these APIs. +> After then, you can display the canvas as an image directly, or use [HTMLCanvasElement.toDataURL](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL) to get a Data URL, or use [HTMLCanvasElement.toBlob](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob) to get a blob and upload it to server with [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData) if the browser supports these APIs. ```js $().cropper('getCroppedCanvas'); @@ -841,7 +855,7 @@ $().cropper('getCroppedCanvas', { height: 90 }); -// Upload cropped image to server if the browser supports `canvas.toBlob` +// Upload cropped image to server if the browser supports `HTMLCanvasElement.toBlob` $().cropper('getCroppedCanvas').toBlob(function (blob) { var formData = new FormData(); @@ -1028,11 +1042,12 @@ If you have to use other plugin with the same namespace, just call the `$.fn.cro ## Browser support -- Chrome (latest 2) -- Firefox (latest 2) +- Chrome (latest) +- Firefox (latest) +- Safari (latest) +- Opera (latest) +- Edge (latest) - Internet Explorer 8+ -- Opera (latest 2) -- Safari (latest 2) As a jQuery plugin, you also need to see the [jQuery Browser Support](http://jquery.com/browser-support/). diff --git a/vendors/cropper/bower.json b/vendors/cropper/bower.json index 9006df99..287c178b 100644 --- a/vendors/cropper/bower.json +++ b/vendors/cropper/bower.json @@ -47,9 +47,9 @@ }, "devDependencies": { "bootstrap": "~3.3.6", - "fontawesome": "~4.5.0", - "html5-boilerplate": "~5.2.0", - "jquery": "~1.12.0", - "qunit": "~1.20.0" + "fontawesome": "~4.6.1", + "html5-boilerplate": "~5.3.0", + "jquery": "~1.12.3", + "qunit": "~1.22.0" } } diff --git a/vendors/cropper/dist/cropper.css b/vendors/cropper/dist/cropper.css index 8668c7c0..b2826387 100644 --- a/vendors/cropper/dist/cropper.css +++ b/vendors/cropper/dist/cropper.css @@ -1,11 +1,11 @@ /*! - * Cropper v2.3.0 + * Cropper v2.3.1 * https://github.com/fengyuanchen/cropper * * Copyright (c) 2014-2016 Fengyuan Chen and contributors * Released under the MIT license * - * Date: 2016-02-22T02:13:13.332Z + * Date: 2016-05-28T14:47:08.528Z */ .cropper-container { font-size: 0; diff --git a/vendors/cropper/dist/cropper.js b/vendors/cropper/dist/cropper.js index 80548590..2de80930 100644 --- a/vendors/cropper/dist/cropper.js +++ b/vendors/cropper/dist/cropper.js @@ -1,11 +1,11 @@ /*! - * Cropper v2.3.0 + * Cropper v2.3.1 * https://github.com/fengyuanchen/cropper * * Copyright (c) 2014-2016 Fengyuan Chen and contributors * Released under the MIT license * - * Date: 2016-02-22T02:13:13.332Z + * Date: 2016-05-28T14:47:08.528Z */ (function (factory) { @@ -178,14 +178,15 @@ var scaleX = options.scaleX; var scaleY = options.scaleY; - if (isNumber(rotate)) { - transforms.push('rotate(' + rotate + 'deg)'); - } - + // Scale should come first before rotate (#633) if (isNumber(scaleX) && isNumber(scaleY)) { transforms.push('scale(' + scaleX + ',' + scaleY + ')'); } + if (isNumber(rotate)) { + transforms.push('rotate(' + rotate + 'deg)'); + } + return transforms.length ? transforms.join(' ') : 'none'; } @@ -514,6 +515,10 @@ read(this.response); }; + if (options.checkCrossOrigin && isCrossOriginURL(url) && $this.prop('crossOrigin')) { + url = addTimestamp(url); + } + xhr.open('get', url); xhr.responseType = 'arraybuffer'; xhr.send(); @@ -2661,10 +2666,14 @@ var context; var data; - if (!this.isBuilt || !this.isCropped || !SUPPORT_CANVAS) { + if (!this.isBuilt || !SUPPORT_CANVAS) { return; } + if (!this.isCropped) { + return getSourceCanvas(this.$clone[0], this.image); + } + if (!$.isPlainObject(options)) { options = {}; } diff --git a/vendors/cropper/dist/cropper.min.css b/vendors/cropper/dist/cropper.min.css index a6bb71ea..25eb66f1 100644 --- a/vendors/cropper/dist/cropper.min.css +++ b/vendors/cropper/dist/cropper.min.css @@ -1,9 +1,9 @@ /*! - * Cropper v2.3.0 + * Cropper v2.3.1 * https://github.com/fengyuanchen/cropper * * Copyright (c) 2014-2016 Fengyuan Chen and contributors * Released under the MIT license * - * Date: 2016-02-22T02:13:13.332Z + * Date: 2016-05-28T14:47:08.528Z */.cropper-container{font-size:0;line-height:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;direction:ltr!important;-ms-touch-action:none;touch-action:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.cropper-container img{display:block;width:100%;min-width:0!important;max-width:none!important;height:100%;min-height:0!important;max-height:none!important;image-orientation:0deg!important}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{position:absolute;top:0;right:0;bottom:0;left:0}.cropper-wrap-box{overflow:hidden}.cropper-drag-box{opacity:0;background-color:#fff;filter:alpha(opacity=0)}.cropper-dashed,.cropper-modal{opacity:.5;filter:alpha(opacity=50)}.cropper-modal{background-color:#000}.cropper-view-box{display:block;overflow:hidden;width:100%;height:100%;outline:#39f solid 1px;outline-color:rgba(51,153,255,.75)}.cropper-dashed{position:absolute;display:block;border:0 dashed #eee}.cropper-dashed.dashed-h{top:33.33333%;left:0;width:100%;height:33.33333%;border-top-width:1px;border-bottom-width:1px}.cropper-dashed.dashed-v{top:0;left:33.33333%;width:33.33333%;height:100%;border-right-width:1px;border-left-width:1px}.cropper-center{position:absolute;top:50%;left:50%;display:block;width:0;height:0;opacity:.75;filter:alpha(opacity=75)}.cropper-center:after,.cropper-center:before{position:absolute;display:block;content:' ';background-color:#eee}.cropper-center:before{top:0;left:-3px;width:7px;height:1px}.cropper-center:after{top:-3px;left:0;width:1px;height:7px}.cropper-face,.cropper-line,.cropper-point{position:absolute;display:block;width:100%;height:100%;opacity:.1;filter:alpha(opacity=10)}.cropper-face{top:0;left:0;background-color:#fff}.cropper-line,.cropper-point{background-color:#39f}.cropper-line.line-e{top:0;right:-3px;width:5px;cursor:e-resize}.cropper-line.line-n{top:-3px;left:0;height:5px;cursor:n-resize}.cropper-line.line-w{top:0;left:-3px;width:5px;cursor:w-resize}.cropper-line.line-s{bottom:-3px;left:0;height:5px;cursor:s-resize}.cropper-point{width:5px;height:5px;opacity:.75;filter:alpha(opacity=75)}.cropper-point.point-e{top:50%;right:-3px;margin-top:-3px;cursor:e-resize}.cropper-point.point-n{top:-3px;left:50%;margin-left:-3px;cursor:n-resize}.cropper-point.point-w{top:50%;left:-3px;margin-top:-3px;cursor:w-resize}.cropper-point.point-s{bottom:-3px;left:50%;margin-left:-3px;cursor:s-resize}.cropper-point.point-ne{top:-3px;right:-3px;cursor:ne-resize}.cropper-point.point-nw{top:-3px;left:-3px;cursor:nw-resize}.cropper-point.point-sw{bottom:-3px;left:-3px;cursor:sw-resize}.cropper-point.point-se{right:-3px;bottom:-3px;width:20px;height:20px;cursor:se-resize;opacity:1;filter:alpha(opacity=100)}.cropper-point.point-se:before{position:absolute;right:-50%;bottom:-50%;display:block;width:200%;height:200%;content:' ';opacity:0;background-color:#39f;filter:alpha(opacity=0)}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{width:5px;height:5px;opacity:.75;filter:alpha(opacity=75)}}.cropper-invisible{opacity:0;filter:alpha(opacity=0)}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{position:absolute;display:block;width:0;height:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed} \ No newline at end of file diff --git a/vendors/cropper/dist/cropper.min.js b/vendors/cropper/dist/cropper.min.js index 137ee972..df6912eb 100644 --- a/vendors/cropper/dist/cropper.min.js +++ b/vendors/cropper/dist/cropper.min.js @@ -1,10 +1,10 @@ /*! - * Cropper v2.3.0 + * Cropper v2.3.1 * https://github.com/fengyuanchen/cropper * * Copyright (c) 2014-2016 Fengyuan Chen and contributors * Released under the MIT license * - * Date: 2016-02-22T02:13:13.332Z + * Date: 2016-05-28T14:47:08.528Z */ -!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){"use strict";function i(t){return"number"==typeof t&&!isNaN(t)}function e(t){return"undefined"==typeof t}function s(t,e){var s=[];return i(e)&&s.push(e),s.slice.apply(t,s)}function a(t,i){var e=s(arguments,2);return function(){return t.apply(i,e.concat(s(arguments)))}}function o(t){var i=t.match(/^(https?:)\/\/([^\:\/\?#]+):?(\d*)/i);return i&&(i[1]!==C.protocol||i[2]!==C.hostname||i[3]!==C.port)}function h(t){var i="timestamp="+(new Date).getTime();return t+(-1===t.indexOf("?")?"?":"&")+i}function n(t){return t?' crossOrigin="'+t+'"':""}function r(t,i){var e;return t.naturalWidth&&!mt?i(t.naturalWidth,t.naturalHeight):(e=document.createElement("img"),e.onload=function(){i(this.width,this.height)},void(e.src=t.src))}function p(t){var e=[],s=t.rotate,a=t.scaleX,o=t.scaleY;return i(s)&&e.push("rotate("+s+"deg)"),i(a)&&i(o)&&e.push("scale("+a+","+o+")"),e.length?e.join(" "):"none"}function l(t,i){var e,s,a=Ct(t.degree)%180,o=(a>90?180-a:a)*Math.PI/180,h=bt(o),n=Bt(o),r=t.width,p=t.height,l=t.aspectRatio;return i?(e=r/(n+h/l),s=e/l):(e=r*n+p*h,s=r*h+p*n),{width:e,height:s}}function c(e,s){var a,o,h,n=t("")[0],r=n.getContext("2d"),p=0,c=0,d=s.naturalWidth,g=s.naturalHeight,u=s.rotate,f=s.scaleX,m=s.scaleY,v=i(f)&&i(m)&&(1!==f||1!==m),w=i(u)&&0!==u,x=w||v,C=d*Ct(f||1),b=g*Ct(m||1);return v&&(a=C/2,o=b/2),w&&(h=l({width:C,height:b,degree:u}),C=h.width,b=h.height,a=C/2,o=b/2),n.width=C,n.height=b,x&&(p=-d/2,c=-g/2,r.save(),r.translate(a,o)),w&&r.rotate(u*Math.PI/180),v&&r.scale(f,m),r.drawImage(e,$t(p),$t(c),$t(d),$t(g)),x&&r.restore(),n}function d(i){var e=i.length,s=0,a=0;return e&&(t.each(i,function(t,i){s+=i.pageX,a+=i.pageY}),s/=e,a/=e),{pageX:s,pageY:a}}function g(t,i,e){var s,a="";for(s=i,e+=i;e>s;s++)a+=Lt(t.getUint8(s));return a}function u(t){var i,e,s,a,o,h,n,r,p,l,c=new D(t),d=c.byteLength;if(255===c.getUint8(0)&&216===c.getUint8(1))for(p=2;d>p;){if(255===c.getUint8(p)&&225===c.getUint8(p+1)){n=p;break}p++}if(n&&(e=n+4,s=n+10,"Exif"===g(c,e,4)&&(h=c.getUint16(s),o=18761===h,(o||19789===h)&&42===c.getUint16(s+2,o)&&(a=c.getUint32(s+4,o),a>=8&&(r=s+a)))),r)for(d=c.getUint16(r,o),l=0;d>l;l++)if(p=r+12*l+2,274===c.getUint16(p,o)){p+=8,i=c.getUint16(p,o),mt&&c.setUint16(p,1,o);break}return i}function f(t){var i,e=t.replace(G,""),s=atob(e),a=s.length,o=new B(a),h=new y(o);for(i=0;a>i;i++)h[i]=s.charCodeAt(i);return o}function m(t){var i,e=new y(t),s=e.length,a="";for(i=0;s>i;i++)a+=Lt(e[i]);return"data:image/jpeg;base64,"+$(a)}function v(i,e){this.$element=t(i),this.options=t.extend({},v.DEFAULTS,t.isPlainObject(e)&&e),this.isLoaded=!1,this.isBuilt=!1,this.isCompleted=!1,this.isRotated=!1,this.isCropped=!1,this.isDisabled=!1,this.isReplaced=!1,this.isLimited=!1,this.wheeling=!1,this.isImg=!1,this.originalUrl="",this.canvas=null,this.cropBox=null,this.init()}var w=t(window),x=t(document),C=window.location,b=window.navigator,B=window.ArrayBuffer,y=window.Uint8Array,D=window.DataView,$=window.btoa,L="cropper",T="cropper-modal",X="cropper-hide",Y="cropper-hidden",k="cropper-invisible",M="cropper-move",W="cropper-crop",H="cropper-disabled",R="cropper-bg",z="mousedown touchstart pointerdown MSPointerDown",O="mousemove touchmove pointermove MSPointerMove",E="mouseup touchend touchcancel pointerup pointercancel MSPointerUp MSPointerCancel",P="wheel mousewheel DOMMouseScroll",U="dblclick",I="load."+L,F="error."+L,j="resize."+L,A="build."+L,S="built."+L,N="cropstart."+L,_="cropmove."+L,q="cropend."+L,Z="crop."+L,K="zoom."+L,Q=/e|w|s|n|se|sw|ne|nw|all|crop|move|zoom/,V=/^data\:/,G=/^data\:([^\;]+)\;base64,/,J=/^data\:image\/jpeg.*;base64,/,tt="preview",it="action",et="e",st="w",at="s",ot="n",ht="se",nt="sw",rt="ne",pt="nw",lt="all",ct="crop",dt="move",gt="zoom",ut="none",ft=t.isFunction(t("")[0].getContext),mt=b&&/safari/i.test(b.userAgent)&&/apple computer/i.test(b.vendor),vt=Number,wt=Math.min,xt=Math.max,Ct=Math.abs,bt=Math.sin,Bt=Math.cos,yt=Math.sqrt,Dt=Math.round,$t=Math.floor,Lt=String.fromCharCode;v.prototype={constructor:v,init:function(){var t,i=this.$element;if(i.is("img")){if(this.isImg=!0,this.originalUrl=t=i.attr("src"),!t)return;t=i.prop("src")}else i.is("canvas")&&ft&&(t=i[0].toDataURL());this.load(t)},trigger:function(i,e){var s=t.Event(i,e);return this.$element.trigger(s),s},load:function(i){var e,s,a=this.options,o=this.$element;if(i&&(o.one(A,a.build),!this.trigger(A).isDefaultPrevented())){if(this.url=i,this.image={},!a.checkOrientation||!B)return this.clone();if(e=t.proxy(this.read,this),V.test(i))return J.test(i)?e(f(i)):this.clone();s=new XMLHttpRequest,s.onerror=s.onabort=t.proxy(function(){this.clone()},this),s.onload=function(){e(this.response)},s.open("get",i),s.responseType="arraybuffer",s.send()}},read:function(t){var i,e,s,a=this.options,o=u(t),h=this.image;if(o>1)switch(this.url=m(t),o){case 2:e=-1;break;case 3:i=-180;break;case 4:s=-1;break;case 5:i=90,s=-1;break;case 6:i=90;break;case 7:i=90,e=-1;break;case 8:i=-90}a.rotatable&&(h.rotate=i),a.scalable&&(h.scaleX=e,h.scaleY=s),this.clone()},clone:function(){var i,e,s=this.options,a=this.$element,r=this.url,p="";s.checkCrossOrigin&&o(r)&&(p=a.prop("crossOrigin"),p?i=r:(p="anonymous",i=h(r))),this.crossOrigin=p,this.crossOriginUrl=i,this.$clone=e=t("'),this.isImg?a[0].complete?this.start():a.one(I,t.proxy(this.start,this)):e.one(I,t.proxy(this.start,this)).one(F,t.proxy(this.stop,this)).addClass(X).insertAfter(a)},start:function(){var i=this.$element,e=this.$clone;this.isImg||(e.off(F,this.stop),i=e),r(i[0],t.proxy(function(i,e){t.extend(this.image,{naturalWidth:i,naturalHeight:e,aspectRatio:i/e}),this.isLoaded=!0,this.build()},this))},stop:function(){this.$clone.remove(),this.$clone=null},build:function(){var i,e,s,a=this.options,o=this.$element,h=this.$clone;this.isLoaded&&(this.isBuilt&&this.unbuild(),this.$container=o.parent(),this.$cropper=i=t(v.TEMPLATE),this.$canvas=i.find(".cropper-canvas").append(h),this.$dragBox=i.find(".cropper-drag-box"),this.$cropBox=e=i.find(".cropper-crop-box"),this.$viewBox=i.find(".cropper-view-box"),this.$face=s=e.find(".cropper-face"),o.addClass(Y).after(i),this.isImg||h.removeClass(X),this.initPreview(),this.bind(),a.aspectRatio=xt(0,a.aspectRatio)||NaN,a.viewMode=xt(0,wt(3,Dt(a.viewMode)))||0,a.autoCrop?(this.isCropped=!0,a.modal&&this.$dragBox.addClass(T)):e.addClass(Y),a.guides||e.find(".cropper-dashed").addClass(Y),a.center||e.find(".cropper-center").addClass(Y),a.cropBoxMovable&&s.addClass(M).data(it,lt),a.highlight||s.addClass(k),a.background&&i.addClass(R),a.cropBoxResizable||e.find(".cropper-line, .cropper-point").addClass(Y),this.setDragMode(a.dragMode),this.render(),this.isBuilt=!0,this.setData(a.data),o.one(S,a.built),setTimeout(t.proxy(function(){this.trigger(S),this.isCompleted=!0},this),0))},unbuild:function(){this.isBuilt&&(this.isBuilt=!1,this.isCompleted=!1,this.initialImage=null,this.initialCanvas=null,this.initialCropBox=null,this.container=null,this.canvas=null,this.cropBox=null,this.unbind(),this.resetPreview(),this.$preview=null,this.$viewBox=null,this.$cropBox=null,this.$dragBox=null,this.$canvas=null,this.$container=null,this.$cropper.remove(),this.$cropper=null)},render:function(){this.initContainer(),this.initCanvas(),this.initCropBox(),this.renderCanvas(),this.isCropped&&this.renderCropBox()},initContainer:function(){var t=this.options,i=this.$element,e=this.$container,s=this.$cropper;s.addClass(Y),i.removeClass(Y),s.css(this.container={width:xt(e.width(),vt(t.minContainerWidth)||200),height:xt(e.height(),vt(t.minContainerHeight)||100)}),i.addClass(Y),s.removeClass(Y)},initCanvas:function(){var i,e=this.options.viewMode,s=this.container,a=s.width,o=s.height,h=this.image,n=h.naturalWidth,r=h.naturalHeight,p=90===Ct(h.rotate),l=p?r:n,c=p?n:r,d=l/c,g=a,u=o;o*d>a?3===e?g=o*d:u=a/d:3===e?u=a/d:g=o*d,i={naturalWidth:l,naturalHeight:c,aspectRatio:d,width:g,height:u},i.oldLeft=i.left=(a-g)/2,i.oldTop=i.top=(o-u)/2,this.canvas=i,this.isLimited=1===e||2===e,this.limitCanvas(!0,!0),this.initialImage=t.extend({},h),this.initialCanvas=t.extend({},i)},limitCanvas:function(t,i){var e,s,a,o,h=this.options,n=h.viewMode,r=this.container,p=r.width,l=r.height,c=this.canvas,d=c.aspectRatio,g=this.cropBox,u=this.isCropped&&g;t&&(e=vt(h.minCanvasWidth)||0,s=vt(h.minCanvasHeight)||0,n&&(n>1?(e=xt(e,p),s=xt(s,l),3===n&&(s*d>e?e=s*d:s=e/d)):e?e=xt(e,u?g.width:0):s?s=xt(s,u?g.height:0):u&&(e=g.width,s=g.height,s*d>e?e=s*d:s=e/d)),e&&s?s*d>e?s=e/d:e=s*d:e?s=e/d:s&&(e=s*d),c.minWidth=e,c.minHeight=s,c.maxWidth=1/0,c.maxHeight=1/0),i&&(n?(a=p-c.width,o=l-c.height,c.minLeft=wt(0,a),c.minTop=wt(0,o),c.maxLeft=xt(0,a),c.maxTop=xt(0,o),u&&this.isLimited&&(c.minLeft=wt(g.left,g.left+g.width-c.width),c.minTop=wt(g.top,g.top+g.height-c.height),c.maxLeft=g.left,c.maxTop=g.top,2===n&&(c.width>=p&&(c.minLeft=wt(0,a),c.maxLeft=xt(0,a)),c.height>=l&&(c.minTop=wt(0,o),c.maxTop=xt(0,o))))):(c.minLeft=-c.width,c.minTop=-c.height,c.maxLeft=p,c.maxTop=l))},renderCanvas:function(t){var i,e,s=this.canvas,a=this.image,o=a.rotate,h=a.naturalWidth,n=a.naturalHeight;this.isRotated&&(this.isRotated=!1,e=l({width:a.width,height:a.height,degree:o}),i=e.width/e.height,i!==s.aspectRatio&&(s.left-=(e.width-s.width)/2,s.top-=(e.height-s.height)/2,s.width=e.width,s.height=e.height,s.aspectRatio=i,s.naturalWidth=h,s.naturalHeight=n,o%180&&(e=l({width:h,height:n,degree:o}),s.naturalWidth=e.width,s.naturalHeight=e.height),this.limitCanvas(!0,!1))),(s.width>s.maxWidth||s.widths.maxHeight||s.heighte.width?o.height=o.width/s:o.width=o.height*s),this.cropBox=o,this.limitCropBox(!0,!0),o.width=wt(xt(o.width,o.minWidth),o.maxWidth),o.height=wt(xt(o.height,o.minHeight),o.maxHeight),o.width=xt(o.minWidth,o.width*a),o.height=xt(o.minHeight,o.height*a),o.oldLeft=o.left=e.left+(e.width-o.width)/2,o.oldTop=o.top=e.top+(e.height-o.height)/2,this.initialCropBox=t.extend({},o)},limitCropBox:function(t,i){var e,s,a,o,h=this.options,n=h.aspectRatio,r=this.container,p=r.width,l=r.height,c=this.canvas,d=this.cropBox,g=this.isLimited;t&&(e=vt(h.minCropBoxWidth)||0,s=vt(h.minCropBoxHeight)||0,e=wt(e,p),s=wt(s,l),a=wt(p,g?c.width:p),o=wt(l,g?c.height:l),n&&(e&&s?s*n>e?s=e/n:e=s*n:e?s=e/n:s&&(e=s*n),o*n>a?o=a/n:a=o*n),d.minWidth=wt(e,a),d.minHeight=wt(s,o),d.maxWidth=a,d.maxHeight=o),i&&(g?(d.minLeft=xt(0,c.left),d.minTop=xt(0,c.top),d.maxLeft=wt(p,c.left+c.width)-d.width,d.maxTop=wt(l,c.top+c.height)-d.height):(d.minLeft=0,d.minTop=0,d.maxLeft=p-d.width,d.maxTop=l-d.height))},renderCropBox:function(){var t=this.options,i=this.container,e=i.width,s=i.height,a=this.cropBox;(a.width>a.maxWidth||a.widtha.maxHeight||a.height'),this.$viewBox.html(i),this.$preview.each(function(){var i=t(this);i.data(tt,{width:i.width(),height:i.height(),html:i.html()}),i.html("')})},resetPreview:function(){this.$preview.each(function(){var i=t(this),e=i.data(tt);i.css({width:e.width,height:e.height}).html(e.html).removeData(tt)})},preview:function(){var i=this.image,e=this.canvas,s=this.cropBox,a=s.width,o=s.height,h=i.width,n=i.height,r=s.left-e.left-i.left,l=s.top-e.top-i.top;this.isCropped&&!this.isDisabled&&(this.$clone2.css({width:h,height:n,marginLeft:-r,marginTop:-l,transform:p(i)}),this.$preview.each(function(){var e=t(this),s=e.data(tt),c=s.width,d=s.height,g=c,u=d,f=1;a&&(f=c/a,u=o*f),o&&u>d&&(f=d/o,g=a*f,u=d),e.css({width:g,height:u}).find("img").css({width:h*f,height:n*f,marginLeft:-r*f,marginTop:-l*f,transform:p(i)})}))},bind:function(){var i=this.options,e=this.$element,s=this.$cropper;t.isFunction(i.cropstart)&&e.on(N,i.cropstart),t.isFunction(i.cropmove)&&e.on(_,i.cropmove),t.isFunction(i.cropend)&&e.on(q,i.cropend),t.isFunction(i.crop)&&e.on(Z,i.crop),t.isFunction(i.zoom)&&e.on(K,i.zoom),s.on(z,t.proxy(this.cropStart,this)),i.zoomable&&i.zoomOnWheel&&s.on(P,t.proxy(this.wheel,this)),i.toggleDragModeOnDblclick&&s.on(U,t.proxy(this.dblclick,this)),x.on(O,this._cropMove=a(this.cropMove,this)).on(E,this._cropEnd=a(this.cropEnd,this)),i.responsive&&w.on(j,this._resize=a(this.resize,this))},unbind:function(){var i=this.options,e=this.$element,s=this.$cropper;t.isFunction(i.cropstart)&&e.off(N,i.cropstart),t.isFunction(i.cropmove)&&e.off(_,i.cropmove),t.isFunction(i.cropend)&&e.off(q,i.cropend),t.isFunction(i.crop)&&e.off(Z,i.crop),t.isFunction(i.zoom)&&e.off(K,i.zoom),s.off(z,this.cropStart),i.zoomable&&i.zoomOnWheel&&s.off(P,this.wheel),i.toggleDragModeOnDblclick&&s.off(U,this.dblclick),x.off(O,this._cropMove).off(E,this._cropEnd),i.responsive&&w.off(j,this._resize)},resize:function(){var i,e,s,a=this.options.restore,o=this.$container,h=this.container;!this.isDisabled&&h&&(s=o.width()/h.width,(1!==s||o.height()!==h.height)&&(a&&(i=this.getCanvasData(),e=this.getCropBoxData()),this.render(),a&&(this.setCanvasData(t.each(i,function(t,e){i[t]=e*s})),this.setCropBoxData(t.each(e,function(t,i){e[t]=i*s})))))},dblclick:function(){this.isDisabled||(this.$dragBox.hasClass(W)?this.setDragMode(dt):this.setDragMode(ct))},wheel:function(i){var e=i.originalEvent||i,s=vt(this.options.wheelZoomRatio)||.1,a=1;this.isDisabled||(i.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout(t.proxy(function(){this.wheeling=!1},this),50),e.deltaY?a=e.deltaY>0?1:-1:e.wheelDelta?a=-e.wheelDelta/120:e.detail&&(a=e.detail>0?1:-1),this.zoom(-a*s,i)))},cropStart:function(i){var e,s,a=this.options,o=i.originalEvent,h=o&&o.touches,n=i;if(!this.isDisabled){if(h){if(e=h.length,e>1){if(!a.zoomable||!a.zoomOnTouch||2!==e)return;n=h[1],this.startX2=n.pageX,this.startY2=n.pageY,s=gt}n=h[0]}if(s=s||t(n.target).data(it),Q.test(s)){if(this.trigger(N,{originalEvent:o,action:s}).isDefaultPrevented())return;i.preventDefault(),this.action=s,this.cropping=!1,this.startX=n.pageX||o&&o.pageX,this.startY=n.pageY||o&&o.pageY,s===ct&&(this.cropping=!0,this.$dragBox.addClass(T))}}},cropMove:function(t){var i,e=this.options,s=t.originalEvent,a=s&&s.touches,o=t,h=this.action;if(!this.isDisabled){if(a){if(i=a.length,i>1){if(!e.zoomable||!e.zoomOnTouch||2!==i)return;o=a[1],this.endX2=o.pageX,this.endY2=o.pageY}o=a[0]}if(h){if(this.trigger(_,{originalEvent:s,action:h}).isDefaultPrevented())return;t.preventDefault(),this.endX=o.pageX||s&&s.pageX,this.endY=o.pageY||s&&s.pageY,this.change(o.shiftKey,h===gt?t:null)}}},cropEnd:function(t){var i=t.originalEvent,e=this.action;this.isDisabled||e&&(t.preventDefault(),this.cropping&&(this.cropping=!1,this.$dragBox.toggleClass(T,this.isCropped&&this.options.modal)),this.action="",this.trigger(q,{originalEvent:i,action:e}))},change:function(t,i){var e,s,a=this.options,o=a.aspectRatio,h=this.action,n=this.container,r=this.canvas,p=this.cropBox,l=p.width,c=p.height,d=p.left,g=p.top,u=d+l,f=g+c,m=0,v=0,w=n.width,x=n.height,C=!0;switch(!o&&t&&(o=l&&c?l/c:1),this.limited&&(m=p.minLeft,v=p.minTop,w=m+wt(n.width,r.left+r.width),x=v+wt(n.height,r.top+r.height)),s={x:this.endX-this.startX,y:this.endY-this.startY},o&&(s.X=s.y*o,s.Y=s.x/o),h){case lt:d+=s.x,g+=s.y;break;case et:if(s.x>=0&&(u>=w||o&&(v>=g||f>=x))){C=!1;break}l+=s.x,o&&(c=l/o,g-=s.Y/2),0>l&&(h=st,l=0);break;case ot:if(s.y<=0&&(v>=g||o&&(m>=d||u>=w))){C=!1;break}c-=s.y,g+=s.y,o&&(l=c*o,d+=s.X/2),0>c&&(h=at,c=0);break;case st:if(s.x<=0&&(m>=d||o&&(v>=g||f>=x))){C=!1;break}l-=s.x,d+=s.x,o&&(c=l/o,g+=s.Y/2),0>l&&(h=et,l=0);break;case at:if(s.y>=0&&(f>=x||o&&(m>=d||u>=w))){C=!1;break}c+=s.y,o&&(l=c*o,d-=s.X/2),0>c&&(h=ot,c=0);break;case rt:if(o){if(s.y<=0&&(v>=g||u>=w)){C=!1;break}c-=s.y,g+=s.y,l=c*o}else s.x>=0?w>u?l+=s.x:s.y<=0&&v>=g&&(C=!1):l+=s.x,s.y<=0?g>v&&(c-=s.y,g+=s.y):(c-=s.y,g+=s.y);0>l&&0>c?(h=nt,c=0,l=0):0>l?(h=pt,l=0):0>c&&(h=ht,c=0);break;case pt:if(o){if(s.y<=0&&(v>=g||m>=d)){C=!1;break}c-=s.y,g+=s.y,l=c*o,d+=s.X}else s.x<=0?d>m?(l-=s.x,d+=s.x):s.y<=0&&v>=g&&(C=!1):(l-=s.x,d+=s.x),s.y<=0?g>v&&(c-=s.y,g+=s.y):(c-=s.y,g+=s.y);0>l&&0>c?(h=ht,c=0,l=0):0>l?(h=rt,l=0):0>c&&(h=nt,c=0);break;case nt:if(o){if(s.x<=0&&(m>=d||f>=x)){C=!1;break}l-=s.x,d+=s.x,c=l/o}else s.x<=0?d>m?(l-=s.x,d+=s.x):s.y>=0&&f>=x&&(C=!1):(l-=s.x,d+=s.x),s.y>=0?x>f&&(c+=s.y):c+=s.y;0>l&&0>c?(h=rt,c=0,l=0):0>l?(h=ht,l=0):0>c&&(h=pt,c=0);break;case ht:if(o){if(s.x>=0&&(u>=w||f>=x)){C=!1;break}l+=s.x,c=l/o}else s.x>=0?w>u?l+=s.x:s.y>=0&&f>=x&&(C=!1):l+=s.x,s.y>=0?x>f&&(c+=s.y):c+=s.y;0>l&&0>c?(h=pt,c=0,l=0):0>l?(h=nt,l=0):0>c&&(h=rt,c=0);break;case dt:this.move(s.x,s.y),C=!1;break;case gt:this.zoom(function(t,i,e,s){var a=yt(t*t+i*i),o=yt(e*e+s*s);return(o-a)/a}(Ct(this.startX-this.startX2),Ct(this.startY-this.startY2),Ct(this.endX-this.endX2),Ct(this.endY-this.endY2)),i),this.startX2=this.endX2,this.startY2=this.endY2,C=!1;break;case ct:if(!s.x||!s.y){C=!1;break}e=this.$cropper.offset(),d=this.startX-e.left,g=this.startY-e.top,l=p.minWidth,c=p.minHeight,s.x>0?h=s.y>0?ht:rt:s.x<0&&(d-=l,h=s.y>0?nt:pt),s.y<0&&(g-=c),this.isCropped||(this.$cropBox.removeClass(Y),this.isCropped=!0,this.limited&&this.limitCropBox(!0,!0))}C&&(p.width=l,p.height=c,p.left=d,p.top=g,this.action=h,this.renderCropBox()),this.startX=this.endX,this.startY=this.endY},crop:function(){this.isBuilt&&!this.isDisabled&&(this.isCropped||(this.isCropped=!0,this.limitCropBox(!0,!0),this.options.modal&&this.$dragBox.addClass(T),this.$cropBox.removeClass(Y)),this.setCropBoxData(this.initialCropBox))},reset:function(){this.isBuilt&&!this.isDisabled&&(this.image=t.extend({},this.initialImage),this.canvas=t.extend({},this.initialCanvas),this.cropBox=t.extend({},this.initialCropBox),this.renderCanvas(),this.isCropped&&this.renderCropBox())},clear:function(){this.isCropped&&!this.isDisabled&&(t.extend(this.cropBox,{left:0,top:0,width:0,height:0}),this.isCropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),this.$dragBox.removeClass(T),this.$cropBox.addClass(Y))},replace:function(t,i){!this.isDisabled&&t&&(this.isImg&&this.$element.attr("src",t),i?(this.url=t,this.$clone.attr("src",t),this.isBuilt&&this.$preview.find("img").add(this.$clone2).attr("src",t)):(this.isImg&&(this.isReplaced=!0),this.options.data=null,this.load(t)))},enable:function(){this.isBuilt&&(this.isDisabled=!1,this.$cropper.removeClass(H))},disable:function(){this.isBuilt&&(this.isDisabled=!0,this.$cropper.addClass(H))},destroy:function(){var t=this.$element;this.isLoaded?(this.isImg&&this.isReplaced&&t.attr("src",this.originalUrl),this.unbuild(),t.removeClass(Y)):this.isImg?t.off(I,this.start):this.$clone&&this.$clone.remove(),t.removeData(L)},move:function(t,i){var s=this.canvas;this.moveTo(e(t)?t:s.left+vt(t),e(i)?i:s.top+vt(i))},moveTo:function(t,s){var a=this.canvas,o=!1;e(s)&&(s=t),t=vt(t),s=vt(s),this.isBuilt&&!this.isDisabled&&this.options.movable&&(i(t)&&(a.left=t,o=!0),i(s)&&(a.top=s,o=!0),o&&this.renderCanvas(!0))},zoom:function(t,i){var e=this.canvas;t=vt(t),t=0>t?1/(1-t):1+t,this.zoomTo(e.width*t/e.naturalWidth,i)},zoomTo:function(t,i){var e,s,a,o,h,n=this.options,r=this.canvas,p=r.width,l=r.height,c=r.naturalWidth,g=r.naturalHeight;if(t=vt(t),t>=0&&this.isBuilt&&!this.isDisabled&&n.zoomable){if(s=c*t,a=g*t,i&&(e=i.originalEvent),this.trigger(K,{originalEvent:e,oldRatio:p/c,ratio:s/c}).isDefaultPrevented())return;e?(o=this.$cropper.offset(),h=e.touches?d(e.touches):{pageX:i.pageX||e.pageX||0,pageY:i.pageY||e.pageY||0},r.left-=(s-p)*((h.pageX-o.left-r.left)/p),r.top-=(a-l)*((h.pageY-o.top-r.top)/l)):(r.left-=(s-p)/2,r.top-=(a-l)/2),r.width=s,r.height=a,this.renderCanvas(!0)}},rotate:function(t){this.rotateTo((this.image.rotate||0)+vt(t))},rotateTo:function(t){t=vt(t),i(t)&&this.isBuilt&&!this.isDisabled&&this.options.rotatable&&(this.image.rotate=t%360,this.isRotated=!0,this.renderCanvas(!0))},scale:function(t,s){var a=this.image,o=!1;e(s)&&(s=t),t=vt(t),s=vt(s),this.isBuilt&&!this.isDisabled&&this.options.scalable&&(i(t)&&(a.scaleX=t,o=!0),i(s)&&(a.scaleY=s,o=!0),o&&this.renderImage(!0))},scaleX:function(t){var e=this.image.scaleY;this.scale(t,i(e)?e:1)},scaleY:function(t){var e=this.image.scaleX;this.scale(i(e)?e:1,t)},getData:function(i){var e,s,a=this.options,o=this.image,h=this.canvas,n=this.cropBox;return this.isBuilt&&this.isCropped?(s={x:n.left-h.left,y:n.top-h.top,width:n.width,height:n.height},e=o.width/o.naturalWidth,t.each(s,function(t,a){a/=e,s[t]=i?Dt(a):a})):s={x:0,y:0,width:0,height:0},a.rotatable&&(s.rotate=o.rotate||0),a.scalable&&(s.scaleX=o.scaleX||1,s.scaleY=o.scaleY||1),s},setData:function(e){var s,a,o,h=this.options,n=this.image,r=this.canvas,p={};t.isFunction(e)&&(e=e.call(this.element)),this.isBuilt&&!this.isDisabled&&t.isPlainObject(e)&&(h.rotatable&&i(e.rotate)&&e.rotate!==n.rotate&&(n.rotate=e.rotate,this.isRotated=s=!0),h.scalable&&(i(e.scaleX)&&e.scaleX!==n.scaleX&&(n.scaleX=e.scaleX,a=!0),i(e.scaleY)&&e.scaleY!==n.scaleY&&(n.scaleY=e.scaleY,a=!0)),s?this.renderCanvas():a&&this.renderImage(),o=n.width/n.naturalWidth,i(e.x)&&(p.left=e.x*o+r.left),i(e.y)&&(p.top=e.y*o+r.top),i(e.width)&&(p.width=e.width*o),i(e.height)&&(p.height=e.height*o),this.setCropBoxData(p))},getContainerData:function(){return this.isBuilt?this.container:{}},getImageData:function(){return this.isLoaded?this.image:{}},getCanvasData:function(){var i=this.canvas,e={};return this.isBuilt&&t.each(["left","top","width","height","naturalWidth","naturalHeight"],function(t,s){e[s]=i[s]}),e},setCanvasData:function(e){var s=this.canvas,a=s.aspectRatio;t.isFunction(e)&&(e=e.call(this.$element)),this.isBuilt&&!this.isDisabled&&t.isPlainObject(e)&&(i(e.left)&&(s.left=e.left),i(e.top)&&(s.top=e.top),i(e.width)?(s.width=e.width,s.height=e.width/a):i(e.height)&&(s.height=e.height,s.width=e.height*a),this.renderCanvas(!0))},getCropBoxData:function(){var t,i=this.cropBox;return this.isBuilt&&this.isCropped&&(t={left:i.left,top:i.top,width:i.width,height:i.height}),t||{}},setCropBoxData:function(e){var s,a,o=this.cropBox,h=this.options.aspectRatio;t.isFunction(e)&&(e=e.call(this.$element)),this.isBuilt&&this.isCropped&&!this.isDisabled&&t.isPlainObject(e)&&(i(e.left)&&(o.left=e.left),i(e.top)&&(o.top=e.top),i(e.width)&&(s=!0,o.width=e.width),i(e.height)&&(a=!0,o.height=e.height),h&&(s?o.height=o.width/h:a&&(o.width=o.height*h)),this.renderCropBox())},getCroppedCanvas:function(i){var e,s,a,o,h,n,r,p,l,d,g;return this.isBuilt&&this.isCropped&&ft?(t.isPlainObject(i)||(i={}),g=this.getData(),e=g.width,s=g.height,p=e/s,t.isPlainObject(i)&&(h=i.width,n=i.height,h?(n=h/p,r=h/e):n&&(h=n*p,r=n/s)),a=$t(h||e),o=$t(n||s),l=t("")[0],l.width=a,l.height=o,d=l.getContext("2d"),i.fillColor&&(d.fillStyle=i.fillColor,d.fillRect(0,0,a,o)),d.drawImage.apply(d,function(){var t,i,a,o,h,n,p=c(this.$clone[0],this.image),l=p.width,d=p.height,u=this.canvas,f=[p],m=g.x+u.naturalWidth*(Ct(g.scaleX||1)-1)/2,v=g.y+u.naturalHeight*(Ct(g.scaleY||1)-1)/2;return-e>=m||m>l?m=t=a=h=0:0>=m?(a=-m,m=0,t=h=wt(l,e+m)):l>=m&&(a=0,t=h=wt(e,l-m)),0>=t||-s>=v||v>d?v=i=o=n=0:0>=v?(o=-v,v=0,i=n=wt(d,s+v)):d>=v&&(o=0,i=n=wt(s,d-v)),f.push($t(m),$t(v),$t(t),$t(i)),r&&(a*=r,o*=r,h*=r,n*=r),h>0&&n>0&&f.push($t(a),$t(o),$t(h),$t(n)),f}.call(this)),l):void 0},setAspectRatio:function(t){var i=this.options;this.isDisabled||e(t)||(i.aspectRatio=xt(0,t)||NaN,this.isBuilt&&(this.initCropBox(),this.isCropped&&this.renderCropBox()))},setDragMode:function(t){var i,e,s=this.options;this.isLoaded&&!this.isDisabled&&(i=t===ct,e=s.movable&&t===dt,t=i||e?t:ut,this.$dragBox.data(it,t).toggleClass(W,i).toggleClass(M,e),s.cropBoxMovable||this.$face.data(it,t).toggleClass(W,i).toggleClass(M,e))}},v.DEFAULTS={viewMode:0,dragMode:"crop",aspectRatio:NaN,data:null,preview:"",responsive:!0,restore:!0,checkCrossOrigin:!0,checkOrientation:!0,modal:!0,guides:!0,center:!0,highlight:!0,background:!0,autoCrop:!0,autoCropArea:.8,movable:!0,rotatable:!0,scalable:!0,zoomable:!0,zoomOnTouch:!0,zoomOnWheel:!0,wheelZoomRatio:.1,cropBoxMovable:!0,cropBoxResizable:!0,toggleDragModeOnDblclick:!0,minCanvasWidth:0,minCanvasHeight:0,minCropBoxWidth:0,minCropBoxHeight:0,minContainerWidth:200,minContainerHeight:100,build:null,built:null,cropstart:null,cropmove:null,cropend:null,crop:null,zoom:null},v.setDefaults=function(i){t.extend(v.DEFAULTS,i)},v.TEMPLATE='
    ',v.other=t.fn.cropper,t.fn.cropper=function(i){var a,o=s(arguments,1);return this.each(function(){var e,s,h=t(this),n=h.data(L);if(!n){if(/destroy/.test(i))return;e=t.extend({},h.data(),t.isPlainObject(i)&&i),h.data(L,n=new v(this,e))}"string"==typeof i&&t.isFunction(s=n[i])&&(a=s.apply(n,o))}),e(a)?this:a},t.fn.cropper.Constructor=v,t.fn.cropper.setDefaults=v.setDefaults,t.fn.cropper.noConflict=function(){return t.fn.cropper=v.other,this}}); \ No newline at end of file +!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){"use strict";function i(t){return"number"==typeof t&&!isNaN(t)}function e(t){return"undefined"==typeof t}function s(t,e){var s=[];return i(e)&&s.push(e),s.slice.apply(t,s)}function a(t,i){var e=s(arguments,2);return function(){return t.apply(i,e.concat(s(arguments)))}}function o(t){var i=t.match(/^(https?:)\/\/([^\:\/\?#]+):?(\d*)/i);return i&&(i[1]!==C.protocol||i[2]!==C.hostname||i[3]!==C.port)}function h(t){var i="timestamp="+(new Date).getTime();return t+(-1===t.indexOf("?")?"?":"&")+i}function n(t){return t?' crossOrigin="'+t+'"':""}function r(t,i){var e;return t.naturalWidth&&!mt?i(t.naturalWidth,t.naturalHeight):(e=document.createElement("img"),e.onload=function(){i(this.width,this.height)},void(e.src=t.src))}function p(t){var e=[],s=t.rotate,a=t.scaleX,o=t.scaleY;return i(a)&&i(o)&&e.push("scale("+a+","+o+")"),i(s)&&e.push("rotate("+s+"deg)"),e.length?e.join(" "):"none"}function l(t,i){var e,s,a=Ct(t.degree)%180,o=(a>90?180-a:a)*Math.PI/180,h=bt(o),n=Bt(o),r=t.width,p=t.height,l=t.aspectRatio;return i?(e=r/(n+h/l),s=e/l):(e=r*n+p*h,s=r*h+p*n),{width:e,height:s}}function c(e,s){var a,o,h,n=t("")[0],r=n.getContext("2d"),p=0,c=0,d=s.naturalWidth,g=s.naturalHeight,u=s.rotate,f=s.scaleX,m=s.scaleY,v=i(f)&&i(m)&&(1!==f||1!==m),w=i(u)&&0!==u,x=w||v,C=d*Ct(f||1),b=g*Ct(m||1);return v&&(a=C/2,o=b/2),w&&(h=l({width:C,height:b,degree:u}),C=h.width,b=h.height,a=C/2,o=b/2),n.width=C,n.height=b,x&&(p=-d/2,c=-g/2,r.save(),r.translate(a,o)),w&&r.rotate(u*Math.PI/180),v&&r.scale(f,m),r.drawImage(e,$t(p),$t(c),$t(d),$t(g)),x&&r.restore(),n}function d(i){var e=i.length,s=0,a=0;return e&&(t.each(i,function(t,i){s+=i.pageX,a+=i.pageY}),s/=e,a/=e),{pageX:s,pageY:a}}function g(t,i,e){var s,a="";for(s=i,e+=i;e>s;s++)a+=Lt(t.getUint8(s));return a}function u(t){var i,e,s,a,o,h,n,r,p,l,c=new D(t),d=c.byteLength;if(255===c.getUint8(0)&&216===c.getUint8(1))for(p=2;d>p;){if(255===c.getUint8(p)&&225===c.getUint8(p+1)){n=p;break}p++}if(n&&(e=n+4,s=n+10,"Exif"===g(c,e,4)&&(h=c.getUint16(s),o=18761===h,(o||19789===h)&&42===c.getUint16(s+2,o)&&(a=c.getUint32(s+4,o),a>=8&&(r=s+a)))),r)for(d=c.getUint16(r,o),l=0;d>l;l++)if(p=r+12*l+2,274===c.getUint16(p,o)){p+=8,i=c.getUint16(p,o),mt&&c.setUint16(p,1,o);break}return i}function f(t){var i,e=t.replace(G,""),s=atob(e),a=s.length,o=new B(a),h=new y(o);for(i=0;a>i;i++)h[i]=s.charCodeAt(i);return o}function m(t){var i,e=new y(t),s=e.length,a="";for(i=0;s>i;i++)a+=Lt(e[i]);return"data:image/jpeg;base64,"+$(a)}function v(i,e){this.$element=t(i),this.options=t.extend({},v.DEFAULTS,t.isPlainObject(e)&&e),this.isLoaded=!1,this.isBuilt=!1,this.isCompleted=!1,this.isRotated=!1,this.isCropped=!1,this.isDisabled=!1,this.isReplaced=!1,this.isLimited=!1,this.wheeling=!1,this.isImg=!1,this.originalUrl="",this.canvas=null,this.cropBox=null,this.init()}var w=t(window),x=t(document),C=window.location,b=window.navigator,B=window.ArrayBuffer,y=window.Uint8Array,D=window.DataView,$=window.btoa,L="cropper",T="cropper-modal",X="cropper-hide",Y="cropper-hidden",k="cropper-invisible",M="cropper-move",W="cropper-crop",H="cropper-disabled",R="cropper-bg",z="mousedown touchstart pointerdown MSPointerDown",O="mousemove touchmove pointermove MSPointerMove",E="mouseup touchend touchcancel pointerup pointercancel MSPointerUp MSPointerCancel",P="wheel mousewheel DOMMouseScroll",U="dblclick",I="load."+L,F="error."+L,j="resize."+L,A="build."+L,S="built."+L,N="cropstart."+L,_="cropmove."+L,q="cropend."+L,Z="crop."+L,K="zoom."+L,Q=/e|w|s|n|se|sw|ne|nw|all|crop|move|zoom/,V=/^data\:/,G=/^data\:([^\;]+)\;base64,/,J=/^data\:image\/jpeg.*;base64,/,tt="preview",it="action",et="e",st="w",at="s",ot="n",ht="se",nt="sw",rt="ne",pt="nw",lt="all",ct="crop",dt="move",gt="zoom",ut="none",ft=t.isFunction(t("")[0].getContext),mt=b&&/safari/i.test(b.userAgent)&&/apple computer/i.test(b.vendor),vt=Number,wt=Math.min,xt=Math.max,Ct=Math.abs,bt=Math.sin,Bt=Math.cos,yt=Math.sqrt,Dt=Math.round,$t=Math.floor,Lt=String.fromCharCode;v.prototype={constructor:v,init:function(){var t,i=this.$element;if(i.is("img")){if(this.isImg=!0,this.originalUrl=t=i.attr("src"),!t)return;t=i.prop("src")}else i.is("canvas")&&ft&&(t=i[0].toDataURL());this.load(t)},trigger:function(i,e){var s=t.Event(i,e);return this.$element.trigger(s),s},load:function(i){var e,s,a=this.options,n=this.$element;if(i&&(n.one(A,a.build),!this.trigger(A).isDefaultPrevented())){if(this.url=i,this.image={},!a.checkOrientation||!B)return this.clone();if(e=t.proxy(this.read,this),V.test(i))return J.test(i)?e(f(i)):this.clone();s=new XMLHttpRequest,s.onerror=s.onabort=t.proxy(function(){this.clone()},this),s.onload=function(){e(this.response)},a.checkCrossOrigin&&o(i)&&n.prop("crossOrigin")&&(i=h(i)),s.open("get",i),s.responseType="arraybuffer",s.send()}},read:function(t){var i,e,s,a=this.options,o=u(t),h=this.image;if(o>1)switch(this.url=m(t),o){case 2:e=-1;break;case 3:i=-180;break;case 4:s=-1;break;case 5:i=90,s=-1;break;case 6:i=90;break;case 7:i=90,e=-1;break;case 8:i=-90}a.rotatable&&(h.rotate=i),a.scalable&&(h.scaleX=e,h.scaleY=s),this.clone()},clone:function(){var i,e,s=this.options,a=this.$element,r=this.url,p="";s.checkCrossOrigin&&o(r)&&(p=a.prop("crossOrigin"),p?i=r:(p="anonymous",i=h(r))),this.crossOrigin=p,this.crossOriginUrl=i,this.$clone=e=t("'),this.isImg?a[0].complete?this.start():a.one(I,t.proxy(this.start,this)):e.one(I,t.proxy(this.start,this)).one(F,t.proxy(this.stop,this)).addClass(X).insertAfter(a)},start:function(){var i=this.$element,e=this.$clone;this.isImg||(e.off(F,this.stop),i=e),r(i[0],t.proxy(function(i,e){t.extend(this.image,{naturalWidth:i,naturalHeight:e,aspectRatio:i/e}),this.isLoaded=!0,this.build()},this))},stop:function(){this.$clone.remove(),this.$clone=null},build:function(){var i,e,s,a=this.options,o=this.$element,h=this.$clone;this.isLoaded&&(this.isBuilt&&this.unbuild(),this.$container=o.parent(),this.$cropper=i=t(v.TEMPLATE),this.$canvas=i.find(".cropper-canvas").append(h),this.$dragBox=i.find(".cropper-drag-box"),this.$cropBox=e=i.find(".cropper-crop-box"),this.$viewBox=i.find(".cropper-view-box"),this.$face=s=e.find(".cropper-face"),o.addClass(Y).after(i),this.isImg||h.removeClass(X),this.initPreview(),this.bind(),a.aspectRatio=xt(0,a.aspectRatio)||NaN,a.viewMode=xt(0,wt(3,Dt(a.viewMode)))||0,a.autoCrop?(this.isCropped=!0,a.modal&&this.$dragBox.addClass(T)):e.addClass(Y),a.guides||e.find(".cropper-dashed").addClass(Y),a.center||e.find(".cropper-center").addClass(Y),a.cropBoxMovable&&s.addClass(M).data(it,lt),a.highlight||s.addClass(k),a.background&&i.addClass(R),a.cropBoxResizable||e.find(".cropper-line, .cropper-point").addClass(Y),this.setDragMode(a.dragMode),this.render(),this.isBuilt=!0,this.setData(a.data),o.one(S,a.built),setTimeout(t.proxy(function(){this.trigger(S),this.isCompleted=!0},this),0))},unbuild:function(){this.isBuilt&&(this.isBuilt=!1,this.isCompleted=!1,this.initialImage=null,this.initialCanvas=null,this.initialCropBox=null,this.container=null,this.canvas=null,this.cropBox=null,this.unbind(),this.resetPreview(),this.$preview=null,this.$viewBox=null,this.$cropBox=null,this.$dragBox=null,this.$canvas=null,this.$container=null,this.$cropper.remove(),this.$cropper=null)},render:function(){this.initContainer(),this.initCanvas(),this.initCropBox(),this.renderCanvas(),this.isCropped&&this.renderCropBox()},initContainer:function(){var t=this.options,i=this.$element,e=this.$container,s=this.$cropper;s.addClass(Y),i.removeClass(Y),s.css(this.container={width:xt(e.width(),vt(t.minContainerWidth)||200),height:xt(e.height(),vt(t.minContainerHeight)||100)}),i.addClass(Y),s.removeClass(Y)},initCanvas:function(){var i,e=this.options.viewMode,s=this.container,a=s.width,o=s.height,h=this.image,n=h.naturalWidth,r=h.naturalHeight,p=90===Ct(h.rotate),l=p?r:n,c=p?n:r,d=l/c,g=a,u=o;o*d>a?3===e?g=o*d:u=a/d:3===e?u=a/d:g=o*d,i={naturalWidth:l,naturalHeight:c,aspectRatio:d,width:g,height:u},i.oldLeft=i.left=(a-g)/2,i.oldTop=i.top=(o-u)/2,this.canvas=i,this.isLimited=1===e||2===e,this.limitCanvas(!0,!0),this.initialImage=t.extend({},h),this.initialCanvas=t.extend({},i)},limitCanvas:function(t,i){var e,s,a,o,h=this.options,n=h.viewMode,r=this.container,p=r.width,l=r.height,c=this.canvas,d=c.aspectRatio,g=this.cropBox,u=this.isCropped&&g;t&&(e=vt(h.minCanvasWidth)||0,s=vt(h.minCanvasHeight)||0,n&&(n>1?(e=xt(e,p),s=xt(s,l),3===n&&(s*d>e?e=s*d:s=e/d)):e?e=xt(e,u?g.width:0):s?s=xt(s,u?g.height:0):u&&(e=g.width,s=g.height,s*d>e?e=s*d:s=e/d)),e&&s?s*d>e?s=e/d:e=s*d:e?s=e/d:s&&(e=s*d),c.minWidth=e,c.minHeight=s,c.maxWidth=1/0,c.maxHeight=1/0),i&&(n?(a=p-c.width,o=l-c.height,c.minLeft=wt(0,a),c.minTop=wt(0,o),c.maxLeft=xt(0,a),c.maxTop=xt(0,o),u&&this.isLimited&&(c.minLeft=wt(g.left,g.left+g.width-c.width),c.minTop=wt(g.top,g.top+g.height-c.height),c.maxLeft=g.left,c.maxTop=g.top,2===n&&(c.width>=p&&(c.minLeft=wt(0,a),c.maxLeft=xt(0,a)),c.height>=l&&(c.minTop=wt(0,o),c.maxTop=xt(0,o))))):(c.minLeft=-c.width,c.minTop=-c.height,c.maxLeft=p,c.maxTop=l))},renderCanvas:function(t){var i,e,s=this.canvas,a=this.image,o=a.rotate,h=a.naturalWidth,n=a.naturalHeight;this.isRotated&&(this.isRotated=!1,e=l({width:a.width,height:a.height,degree:o}),i=e.width/e.height,i!==s.aspectRatio&&(s.left-=(e.width-s.width)/2,s.top-=(e.height-s.height)/2,s.width=e.width,s.height=e.height,s.aspectRatio=i,s.naturalWidth=h,s.naturalHeight=n,o%180&&(e=l({width:h,height:n,degree:o}),s.naturalWidth=e.width,s.naturalHeight=e.height),this.limitCanvas(!0,!1))),(s.width>s.maxWidth||s.widths.maxHeight||s.heighte.width?o.height=o.width/s:o.width=o.height*s),this.cropBox=o,this.limitCropBox(!0,!0),o.width=wt(xt(o.width,o.minWidth),o.maxWidth),o.height=wt(xt(o.height,o.minHeight),o.maxHeight),o.width=xt(o.minWidth,o.width*a),o.height=xt(o.minHeight,o.height*a),o.oldLeft=o.left=e.left+(e.width-o.width)/2,o.oldTop=o.top=e.top+(e.height-o.height)/2,this.initialCropBox=t.extend({},o)},limitCropBox:function(t,i){var e,s,a,o,h=this.options,n=h.aspectRatio,r=this.container,p=r.width,l=r.height,c=this.canvas,d=this.cropBox,g=this.isLimited;t&&(e=vt(h.minCropBoxWidth)||0,s=vt(h.minCropBoxHeight)||0,e=wt(e,p),s=wt(s,l),a=wt(p,g?c.width:p),o=wt(l,g?c.height:l),n&&(e&&s?s*n>e?s=e/n:e=s*n:e?s=e/n:s&&(e=s*n),o*n>a?o=a/n:a=o*n),d.minWidth=wt(e,a),d.minHeight=wt(s,o),d.maxWidth=a,d.maxHeight=o),i&&(g?(d.minLeft=xt(0,c.left),d.minTop=xt(0,c.top),d.maxLeft=wt(p,c.left+c.width)-d.width,d.maxTop=wt(l,c.top+c.height)-d.height):(d.minLeft=0,d.minTop=0,d.maxLeft=p-d.width,d.maxTop=l-d.height))},renderCropBox:function(){var t=this.options,i=this.container,e=i.width,s=i.height,a=this.cropBox;(a.width>a.maxWidth||a.widtha.maxHeight||a.height'),this.$viewBox.html(i),this.$preview.each(function(){var i=t(this);i.data(tt,{width:i.width(),height:i.height(),html:i.html()}),i.html("')})},resetPreview:function(){this.$preview.each(function(){var i=t(this),e=i.data(tt);i.css({width:e.width,height:e.height}).html(e.html).removeData(tt)})},preview:function(){var i=this.image,e=this.canvas,s=this.cropBox,a=s.width,o=s.height,h=i.width,n=i.height,r=s.left-e.left-i.left,l=s.top-e.top-i.top;this.isCropped&&!this.isDisabled&&(this.$clone2.css({width:h,height:n,marginLeft:-r,marginTop:-l,transform:p(i)}),this.$preview.each(function(){var e=t(this),s=e.data(tt),c=s.width,d=s.height,g=c,u=d,f=1;a&&(f=c/a,u=o*f),o&&u>d&&(f=d/o,g=a*f,u=d),e.css({width:g,height:u}).find("img").css({width:h*f,height:n*f,marginLeft:-r*f,marginTop:-l*f,transform:p(i)})}))},bind:function(){var i=this.options,e=this.$element,s=this.$cropper;t.isFunction(i.cropstart)&&e.on(N,i.cropstart),t.isFunction(i.cropmove)&&e.on(_,i.cropmove),t.isFunction(i.cropend)&&e.on(q,i.cropend),t.isFunction(i.crop)&&e.on(Z,i.crop),t.isFunction(i.zoom)&&e.on(K,i.zoom),s.on(z,t.proxy(this.cropStart,this)),i.zoomable&&i.zoomOnWheel&&s.on(P,t.proxy(this.wheel,this)),i.toggleDragModeOnDblclick&&s.on(U,t.proxy(this.dblclick,this)),x.on(O,this._cropMove=a(this.cropMove,this)).on(E,this._cropEnd=a(this.cropEnd,this)),i.responsive&&w.on(j,this._resize=a(this.resize,this))},unbind:function(){var i=this.options,e=this.$element,s=this.$cropper;t.isFunction(i.cropstart)&&e.off(N,i.cropstart),t.isFunction(i.cropmove)&&e.off(_,i.cropmove),t.isFunction(i.cropend)&&e.off(q,i.cropend),t.isFunction(i.crop)&&e.off(Z,i.crop),t.isFunction(i.zoom)&&e.off(K,i.zoom),s.off(z,this.cropStart),i.zoomable&&i.zoomOnWheel&&s.off(P,this.wheel),i.toggleDragModeOnDblclick&&s.off(U,this.dblclick),x.off(O,this._cropMove).off(E,this._cropEnd),i.responsive&&w.off(j,this._resize)},resize:function(){var i,e,s,a=this.options.restore,o=this.$container,h=this.container;!this.isDisabled&&h&&(s=o.width()/h.width,1===s&&o.height()===h.height||(a&&(i=this.getCanvasData(),e=this.getCropBoxData()),this.render(),a&&(this.setCanvasData(t.each(i,function(t,e){i[t]=e*s})),this.setCropBoxData(t.each(e,function(t,i){e[t]=i*s})))))},dblclick:function(){this.isDisabled||(this.$dragBox.hasClass(W)?this.setDragMode(dt):this.setDragMode(ct))},wheel:function(i){var e=i.originalEvent||i,s=vt(this.options.wheelZoomRatio)||.1,a=1;this.isDisabled||(i.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout(t.proxy(function(){this.wheeling=!1},this),50),e.deltaY?a=e.deltaY>0?1:-1:e.wheelDelta?a=-e.wheelDelta/120:e.detail&&(a=e.detail>0?1:-1),this.zoom(-a*s,i)))},cropStart:function(i){var e,s,a=this.options,o=i.originalEvent,h=o&&o.touches,n=i;if(!this.isDisabled){if(h){if(e=h.length,e>1){if(!a.zoomable||!a.zoomOnTouch||2!==e)return;n=h[1],this.startX2=n.pageX,this.startY2=n.pageY,s=gt}n=h[0]}if(s=s||t(n.target).data(it),Q.test(s)){if(this.trigger(N,{originalEvent:o,action:s}).isDefaultPrevented())return;i.preventDefault(),this.action=s,this.cropping=!1,this.startX=n.pageX||o&&o.pageX,this.startY=n.pageY||o&&o.pageY,s===ct&&(this.cropping=!0,this.$dragBox.addClass(T))}}},cropMove:function(t){var i,e=this.options,s=t.originalEvent,a=s&&s.touches,o=t,h=this.action;if(!this.isDisabled){if(a){if(i=a.length,i>1){if(!e.zoomable||!e.zoomOnTouch||2!==i)return;o=a[1],this.endX2=o.pageX,this.endY2=o.pageY}o=a[0]}if(h){if(this.trigger(_,{originalEvent:s,action:h}).isDefaultPrevented())return;t.preventDefault(),this.endX=o.pageX||s&&s.pageX,this.endY=o.pageY||s&&s.pageY,this.change(o.shiftKey,h===gt?t:null)}}},cropEnd:function(t){var i=t.originalEvent,e=this.action;this.isDisabled||e&&(t.preventDefault(),this.cropping&&(this.cropping=!1,this.$dragBox.toggleClass(T,this.isCropped&&this.options.modal)),this.action="",this.trigger(q,{originalEvent:i,action:e}))},change:function(t,i){var e,s,a=this.options,o=a.aspectRatio,h=this.action,n=this.container,r=this.canvas,p=this.cropBox,l=p.width,c=p.height,d=p.left,g=p.top,u=d+l,f=g+c,m=0,v=0,w=n.width,x=n.height,C=!0;switch(!o&&t&&(o=l&&c?l/c:1),this.limited&&(m=p.minLeft,v=p.minTop,w=m+wt(n.width,r.left+r.width),x=v+wt(n.height,r.top+r.height)),s={x:this.endX-this.startX,y:this.endY-this.startY},o&&(s.X=s.y*o,s.Y=s.x/o),h){case lt:d+=s.x,g+=s.y;break;case et:if(s.x>=0&&(u>=w||o&&(v>=g||f>=x))){C=!1;break}l+=s.x,o&&(c=l/o,g-=s.Y/2),0>l&&(h=st,l=0);break;case ot:if(s.y<=0&&(v>=g||o&&(m>=d||u>=w))){C=!1;break}c-=s.y,g+=s.y,o&&(l=c*o,d+=s.X/2),0>c&&(h=at,c=0);break;case st:if(s.x<=0&&(m>=d||o&&(v>=g||f>=x))){C=!1;break}l-=s.x,d+=s.x,o&&(c=l/o,g+=s.Y/2),0>l&&(h=et,l=0);break;case at:if(s.y>=0&&(f>=x||o&&(m>=d||u>=w))){C=!1;break}c+=s.y,o&&(l=c*o,d-=s.X/2),0>c&&(h=ot,c=0);break;case rt:if(o){if(s.y<=0&&(v>=g||u>=w)){C=!1;break}c-=s.y,g+=s.y,l=c*o}else s.x>=0?w>u?l+=s.x:s.y<=0&&v>=g&&(C=!1):l+=s.x,s.y<=0?g>v&&(c-=s.y,g+=s.y):(c-=s.y,g+=s.y);0>l&&0>c?(h=nt,c=0,l=0):0>l?(h=pt,l=0):0>c&&(h=ht,c=0);break;case pt:if(o){if(s.y<=0&&(v>=g||m>=d)){C=!1;break}c-=s.y,g+=s.y,l=c*o,d+=s.X}else s.x<=0?d>m?(l-=s.x,d+=s.x):s.y<=0&&v>=g&&(C=!1):(l-=s.x,d+=s.x),s.y<=0?g>v&&(c-=s.y,g+=s.y):(c-=s.y,g+=s.y);0>l&&0>c?(h=ht,c=0,l=0):0>l?(h=rt,l=0):0>c&&(h=nt,c=0);break;case nt:if(o){if(s.x<=0&&(m>=d||f>=x)){C=!1;break}l-=s.x,d+=s.x,c=l/o}else s.x<=0?d>m?(l-=s.x,d+=s.x):s.y>=0&&f>=x&&(C=!1):(l-=s.x,d+=s.x),s.y>=0?x>f&&(c+=s.y):c+=s.y;0>l&&0>c?(h=rt,c=0,l=0):0>l?(h=ht,l=0):0>c&&(h=pt,c=0);break;case ht:if(o){if(s.x>=0&&(u>=w||f>=x)){C=!1;break}l+=s.x,c=l/o}else s.x>=0?w>u?l+=s.x:s.y>=0&&f>=x&&(C=!1):l+=s.x,s.y>=0?x>f&&(c+=s.y):c+=s.y;0>l&&0>c?(h=pt,c=0,l=0):0>l?(h=nt,l=0):0>c&&(h=rt,c=0);break;case dt:this.move(s.x,s.y),C=!1;break;case gt:this.zoom(function(t,i,e,s){var a=yt(t*t+i*i),o=yt(e*e+s*s);return(o-a)/a}(Ct(this.startX-this.startX2),Ct(this.startY-this.startY2),Ct(this.endX-this.endX2),Ct(this.endY-this.endY2)),i),this.startX2=this.endX2,this.startY2=this.endY2,C=!1;break;case ct:if(!s.x||!s.y){C=!1;break}e=this.$cropper.offset(),d=this.startX-e.left,g=this.startY-e.top,l=p.minWidth,c=p.minHeight,s.x>0?h=s.y>0?ht:rt:s.x<0&&(d-=l,h=s.y>0?nt:pt),s.y<0&&(g-=c),this.isCropped||(this.$cropBox.removeClass(Y),this.isCropped=!0,this.limited&&this.limitCropBox(!0,!0))}C&&(p.width=l,p.height=c,p.left=d,p.top=g,this.action=h,this.renderCropBox()),this.startX=this.endX,this.startY=this.endY},crop:function(){this.isBuilt&&!this.isDisabled&&(this.isCropped||(this.isCropped=!0,this.limitCropBox(!0,!0),this.options.modal&&this.$dragBox.addClass(T),this.$cropBox.removeClass(Y)),this.setCropBoxData(this.initialCropBox))},reset:function(){this.isBuilt&&!this.isDisabled&&(this.image=t.extend({},this.initialImage),this.canvas=t.extend({},this.initialCanvas),this.cropBox=t.extend({},this.initialCropBox),this.renderCanvas(),this.isCropped&&this.renderCropBox())},clear:function(){this.isCropped&&!this.isDisabled&&(t.extend(this.cropBox,{left:0,top:0,width:0,height:0}),this.isCropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),this.$dragBox.removeClass(T),this.$cropBox.addClass(Y))},replace:function(t,i){!this.isDisabled&&t&&(this.isImg&&this.$element.attr("src",t),i?(this.url=t,this.$clone.attr("src",t),this.isBuilt&&this.$preview.find("img").add(this.$clone2).attr("src",t)):(this.isImg&&(this.isReplaced=!0),this.options.data=null,this.load(t)))},enable:function(){this.isBuilt&&(this.isDisabled=!1,this.$cropper.removeClass(H))},disable:function(){this.isBuilt&&(this.isDisabled=!0,this.$cropper.addClass(H))},destroy:function(){var t=this.$element;this.isLoaded?(this.isImg&&this.isReplaced&&t.attr("src",this.originalUrl),this.unbuild(),t.removeClass(Y)):this.isImg?t.off(I,this.start):this.$clone&&this.$clone.remove(),t.removeData(L)},move:function(t,i){var s=this.canvas;this.moveTo(e(t)?t:s.left+vt(t),e(i)?i:s.top+vt(i))},moveTo:function(t,s){var a=this.canvas,o=!1;e(s)&&(s=t),t=vt(t),s=vt(s),this.isBuilt&&!this.isDisabled&&this.options.movable&&(i(t)&&(a.left=t,o=!0),i(s)&&(a.top=s,o=!0),o&&this.renderCanvas(!0))},zoom:function(t,i){var e=this.canvas;t=vt(t),t=0>t?1/(1-t):1+t,this.zoomTo(e.width*t/e.naturalWidth,i)},zoomTo:function(t,i){var e,s,a,o,h,n=this.options,r=this.canvas,p=r.width,l=r.height,c=r.naturalWidth,g=r.naturalHeight;if(t=vt(t),t>=0&&this.isBuilt&&!this.isDisabled&&n.zoomable){if(s=c*t,a=g*t,i&&(e=i.originalEvent),this.trigger(K,{originalEvent:e,oldRatio:p/c,ratio:s/c}).isDefaultPrevented())return;e?(o=this.$cropper.offset(),h=e.touches?d(e.touches):{pageX:i.pageX||e.pageX||0,pageY:i.pageY||e.pageY||0},r.left-=(s-p)*((h.pageX-o.left-r.left)/p),r.top-=(a-l)*((h.pageY-o.top-r.top)/l)):(r.left-=(s-p)/2,r.top-=(a-l)/2),r.width=s,r.height=a,this.renderCanvas(!0)}},rotate:function(t){this.rotateTo((this.image.rotate||0)+vt(t))},rotateTo:function(t){t=vt(t),i(t)&&this.isBuilt&&!this.isDisabled&&this.options.rotatable&&(this.image.rotate=t%360,this.isRotated=!0,this.renderCanvas(!0))},scale:function(t,s){var a=this.image,o=!1;e(s)&&(s=t),t=vt(t),s=vt(s),this.isBuilt&&!this.isDisabled&&this.options.scalable&&(i(t)&&(a.scaleX=t,o=!0),i(s)&&(a.scaleY=s,o=!0),o&&this.renderImage(!0))},scaleX:function(t){var e=this.image.scaleY;this.scale(t,i(e)?e:1)},scaleY:function(t){var e=this.image.scaleX;this.scale(i(e)?e:1,t)},getData:function(i){var e,s,a=this.options,o=this.image,h=this.canvas,n=this.cropBox;return this.isBuilt&&this.isCropped?(s={x:n.left-h.left,y:n.top-h.top,width:n.width,height:n.height},e=o.width/o.naturalWidth,t.each(s,function(t,a){a/=e,s[t]=i?Dt(a):a})):s={x:0,y:0,width:0,height:0},a.rotatable&&(s.rotate=o.rotate||0),a.scalable&&(s.scaleX=o.scaleX||1,s.scaleY=o.scaleY||1),s},setData:function(e){var s,a,o,h=this.options,n=this.image,r=this.canvas,p={};t.isFunction(e)&&(e=e.call(this.element)),this.isBuilt&&!this.isDisabled&&t.isPlainObject(e)&&(h.rotatable&&i(e.rotate)&&e.rotate!==n.rotate&&(n.rotate=e.rotate,this.isRotated=s=!0),h.scalable&&(i(e.scaleX)&&e.scaleX!==n.scaleX&&(n.scaleX=e.scaleX,a=!0),i(e.scaleY)&&e.scaleY!==n.scaleY&&(n.scaleY=e.scaleY,a=!0)),s?this.renderCanvas():a&&this.renderImage(),o=n.width/n.naturalWidth,i(e.x)&&(p.left=e.x*o+r.left),i(e.y)&&(p.top=e.y*o+r.top),i(e.width)&&(p.width=e.width*o),i(e.height)&&(p.height=e.height*o),this.setCropBoxData(p))},getContainerData:function(){return this.isBuilt?this.container:{}},getImageData:function(){return this.isLoaded?this.image:{}},getCanvasData:function(){var i=this.canvas,e={};return this.isBuilt&&t.each(["left","top","width","height","naturalWidth","naturalHeight"],function(t,s){e[s]=i[s]}),e},setCanvasData:function(e){var s=this.canvas,a=s.aspectRatio;t.isFunction(e)&&(e=e.call(this.$element)),this.isBuilt&&!this.isDisabled&&t.isPlainObject(e)&&(i(e.left)&&(s.left=e.left),i(e.top)&&(s.top=e.top),i(e.width)?(s.width=e.width,s.height=e.width/a):i(e.height)&&(s.height=e.height,s.width=e.height*a),this.renderCanvas(!0))},getCropBoxData:function(){var t,i=this.cropBox;return this.isBuilt&&this.isCropped&&(t={left:i.left,top:i.top,width:i.width,height:i.height}),t||{}},setCropBoxData:function(e){var s,a,o=this.cropBox,h=this.options.aspectRatio;t.isFunction(e)&&(e=e.call(this.$element)),this.isBuilt&&this.isCropped&&!this.isDisabled&&t.isPlainObject(e)&&(i(e.left)&&(o.left=e.left),i(e.top)&&(o.top=e.top),i(e.width)&&(s=!0,o.width=e.width),i(e.height)&&(a=!0,o.height=e.height),h&&(s?o.height=o.width/h:a&&(o.width=o.height*h)),this.renderCropBox())},getCroppedCanvas:function(i){var e,s,a,o,h,n,r,p,l,d,g;return this.isBuilt&&ft?this.isCropped?(t.isPlainObject(i)||(i={}),g=this.getData(),e=g.width,s=g.height,p=e/s,t.isPlainObject(i)&&(h=i.width,n=i.height,h?(n=h/p,r=h/e):n&&(h=n*p,r=n/s)),a=$t(h||e),o=$t(n||s),l=t("")[0],l.width=a,l.height=o,d=l.getContext("2d"),i.fillColor&&(d.fillStyle=i.fillColor,d.fillRect(0,0,a,o)),d.drawImage.apply(d,function(){var t,i,a,o,h,n,p=c(this.$clone[0],this.image),l=p.width,d=p.height,u=this.canvas,f=[p],m=g.x+u.naturalWidth*(Ct(g.scaleX||1)-1)/2,v=g.y+u.naturalHeight*(Ct(g.scaleY||1)-1)/2;return-e>=m||m>l?m=t=a=h=0:0>=m?(a=-m,m=0,t=h=wt(l,e+m)):l>=m&&(a=0,t=h=wt(e,l-m)),0>=t||-s>=v||v>d?v=i=o=n=0:0>=v?(o=-v,v=0,i=n=wt(d,s+v)):d>=v&&(o=0,i=n=wt(s,d-v)),f.push($t(m),$t(v),$t(t),$t(i)),r&&(a*=r,o*=r,h*=r,n*=r),h>0&&n>0&&f.push($t(a),$t(o),$t(h),$t(n)),f}.call(this)),l):c(this.$clone[0],this.image):void 0},setAspectRatio:function(t){var i=this.options;this.isDisabled||e(t)||(i.aspectRatio=xt(0,t)||NaN,this.isBuilt&&(this.initCropBox(),this.isCropped&&this.renderCropBox()))},setDragMode:function(t){var i,e,s=this.options;this.isLoaded&&!this.isDisabled&&(i=t===ct,e=s.movable&&t===dt,t=i||e?t:ut,this.$dragBox.data(it,t).toggleClass(W,i).toggleClass(M,e),s.cropBoxMovable||this.$face.data(it,t).toggleClass(W,i).toggleClass(M,e))}},v.DEFAULTS={viewMode:0,dragMode:"crop",aspectRatio:NaN,data:null,preview:"",responsive:!0,restore:!0,checkCrossOrigin:!0,checkOrientation:!0,modal:!0,guides:!0,center:!0,highlight:!0,background:!0,autoCrop:!0,autoCropArea:.8,movable:!0,rotatable:!0,scalable:!0,zoomable:!0,zoomOnTouch:!0,zoomOnWheel:!0,wheelZoomRatio:.1,cropBoxMovable:!0,cropBoxResizable:!0,toggleDragModeOnDblclick:!0,minCanvasWidth:0,minCanvasHeight:0,minCropBoxWidth:0,minCropBoxHeight:0,minContainerWidth:200,minContainerHeight:100,build:null,built:null,cropstart:null,cropmove:null,cropend:null,crop:null,zoom:null},v.setDefaults=function(i){t.extend(v.DEFAULTS,i)},v.TEMPLATE='
    ',v.other=t.fn.cropper,t.fn.cropper=function(i){var a,o=s(arguments,1);return this.each(function(){var e,s,h=t(this),n=h.data(L);if(!n){if(/destroy/.test(i))return;e=t.extend({},h.data(),t.isPlainObject(i)&&i),h.data(L,n=new v(this,e))}"string"==typeof i&&t.isFunction(s=n[i])&&(a=s.apply(n,o))}),e(a)?this:a},t.fn.cropper.Constructor=v,t.fn.cropper.setDefaults=v.setDefaults,t.fn.cropper.noConflict=function(){return t.fn.cropper=v.other,this}}); \ No newline at end of file diff --git a/vendors/cropper/package.json b/vendors/cropper/package.json index acbf1595..1ab728e0 100644 --- a/vendors/cropper/package.json +++ b/vendors/cropper/package.json @@ -1,11 +1,11 @@ { "name": "cropper", "description": "A simple jQuery image cropping plugin.", - "version": "2.3.0", + "version": "2.3.1", "main": "dist/cropper.js", "license": "MIT", "repository": "fengyuanchen/cropper", - "homepage": "http://fengyuanchen.github.io/cropper", + "homepage": "https://fengyuanchen.github.io/cropper", "author": { "name": "Fengyuan Chen", "url": "http://chenfengyuan.com" @@ -33,21 +33,21 @@ "jquery": ">= 1.9.1" }, "devDependencies": { - "gulp": "^3.9.0", + "gulp": "^3.9.1", "gulp-autoprefixer": "^3.1.0", "gulp-concat": "^2.6.0", "gulp-csscomb": "^3.0.6", - "gulp-csslint": "^0.2.0", + "gulp-csslint": "^0.3.0", "gulp-htmlcomb": "^0.1.0", "gulp-jscs": "^3.0.2", "gulp-jshint": "^1.12.0", "gulp-load-plugins": "^1.2.0", - "gulp-minify-css": "^1.2.3", + "gulp-minify-css": "^1.2.4", "gulp-qunit": "^1.3.0", "gulp-rename": "^1.2.2", "gulp-replace": "^0.5.4", "gulp-sass": "^2.1.1", "gulp-sourcemaps": "^1.6.0", - "gulp-uglify": "^1.5.1" + "gulp-uglify": "^1.5.3" } } diff --git a/vendors/cropper/src/js/init.js b/vendors/cropper/src/js/init.js index 0be551a4..ee1a7ca8 100644 --- a/vendors/cropper/src/js/init.js +++ b/vendors/cropper/src/js/init.js @@ -77,6 +77,10 @@ read(this.response); }; + if (options.checkCrossOrigin && isCrossOriginURL(url) && $this.prop('crossOrigin')) { + url = addTimestamp(url); + } + xhr.open('get', url); xhr.responseType = 'arraybuffer'; xhr.send(); diff --git a/vendors/cropper/src/js/methods.js b/vendors/cropper/src/js/methods.js index f4d0998c..b4bd00f5 100644 --- a/vendors/cropper/src/js/methods.js +++ b/vendors/cropper/src/js/methods.js @@ -626,10 +626,14 @@ var context; var data; - if (!this.isBuilt || !this.isCropped || !SUPPORT_CANVAS) { + if (!this.isBuilt || !SUPPORT_CANVAS) { return; } + if (!this.isCropped) { + return getSourceCanvas(this.$clone[0], this.image); + } + if (!$.isPlainObject(options)) { options = {}; } diff --git a/vendors/cropper/src/js/utilities.js b/vendors/cropper/src/js/utilities.js index 013cceb0..fe2ec989 100644 --- a/vendors/cropper/src/js/utilities.js +++ b/vendors/cropper/src/js/utilities.js @@ -70,14 +70,15 @@ var scaleX = options.scaleX; var scaleY = options.scaleY; - if (isNumber(rotate)) { - transforms.push('rotate(' + rotate + 'deg)'); - } - + // Scale should come first before rotate (#633) if (isNumber(scaleX) && isNumber(scaleY)) { transforms.push('scale(' + scaleX + ',' + scaleY + ')'); } + if (isNumber(rotate)) { + transforms.push('rotate(' + rotate + 'deg)'); + } + return transforms.length ? transforms.join(' ') : 'none'; } diff --git a/vendors/cropper/src/scss/_variables.scss b/vendors/cropper/src/scss/_variables.scss index 5840ea82..c740086f 100644 --- a/vendors/cropper/src/scss/_variables.scss +++ b/vendors/cropper/src/scss/_variables.scss @@ -5,15 +5,15 @@ // Colors // ------------------------- -$color-brand: #39f; -$color-black: #000; -$color-white: #fff; +$color-brand: #39f !default; +$color-black: #000 !default; +$color-white: #fff !default; // Media queries breakpoints // ------------------------- -$screen-xs: 480px; // Extra small screen / phone -$screen-sm: 768px; // Small screen / tablet -$screen-md: 992px; // Medium screen / desktop -$screen-lg: 1200px; // Large screen / wide desktop +$screen-xs: 480px !default; // Extra small screen / phone +$screen-sm: 768px !default; // Small screen / tablet +$screen-md: 992px !default; // Medium screen / desktop +$screen-lg: 1200px !default; // Large screen / wide desktop diff --git a/vendors/datatables.net-bs/.bower.json b/vendors/datatables.net-bs/.bower.json index 752318ea..8f8ccc2e 100644 --- a/vendors/datatables.net-bs/.bower.json +++ b/vendors/datatables.net-bs/.bower.json @@ -35,15 +35,14 @@ ], "homepage": "https://datatables.net", "license": "MIT", - "version": "1.10.11", - "_release": "1.10.11", + "version": "1.10.12", + "_release": "1.10.12", "_resolution": { "type": "version", - "tag": "1.10.11", - "commit": "1f3d9518bda788dcca16a2d370a8d127c72fe666" + "tag": "1.10.12", + "commit": "1bf893948299f1bfe2865c1a3977cd8e4b8137da" }, "_source": "https://github.com/DataTables/Dist-DataTables-Bootstrap.git", "_target": "^1.10.11", - "_originalSource": "datatables.net-bs", - "_direct": true + "_originalSource": "datatables.net-bs" } \ No newline at end of file diff --git a/vendors/datatables.net-bs/css/dataTables.bootstrap.css b/vendors/datatables.net-bs/css/dataTables.bootstrap.css index 9abe1b5b..60bef77e 100644 --- a/vendors/datatables.net-bs/css/dataTables.bootstrap.css +++ b/vendors/datatables.net-bs/css/dataTables.bootstrap.css @@ -3,6 +3,7 @@ table.dataTable { margin-top: 6px !important; margin-bottom: 6px !important; max-width: none !important; + border-collapse: separate !important; } table.dataTable td, table.dataTable th { @@ -155,9 +156,6 @@ table.dataTable.table-condensed .sorting_desc:after { right: 6px; } -table.table-bordered.dataTable { - border-collapse: separate !important; -} table.table-bordered.dataTable th, table.table-bordered.dataTable td { border-left-width: 0; diff --git a/vendors/datatables.net-bs/css/dataTables.bootstrap.min.css b/vendors/datatables.net-bs/css/dataTables.bootstrap.min.css index 745f2996..16ed6375 100644 --- a/vendors/datatables.net-bs/css/dataTables.bootstrap.min.css +++ b/vendors/datatables.net-bs/css/dataTables.bootstrap.min.css @@ -1 +1 @@ -table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-collapse:separate !important}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} diff --git a/vendors/datatables.net-buttons-bs/.bower.json b/vendors/datatables.net-buttons-bs/.bower.json index 1ebe4e5d..0182bd90 100644 --- a/vendors/datatables.net-buttons-bs/.bower.json +++ b/vendors/datatables.net-buttons-bs/.bower.json @@ -40,15 +40,14 @@ ], "homepage": "https://datatables.net", "license": "MIT", - "version": "1.1.2", - "_release": "1.1.2", + "version": "1.2.1", + "_release": "1.2.1", "_resolution": { "type": "version", - "tag": "1.1.2", - "commit": "6a4790e7bd1c4fc334b4bdec8cee8fe471862123" + "tag": "1.2.1", + "commit": "14a9a2586190c38ac99a6d88ae3395e3a837acc3" }, "_source": "https://github.com/DataTables/Dist-DataTables-Buttons-Bootstrap.git", "_target": "^1.1.2", - "_originalSource": "datatables.net-buttons-bs", - "_direct": true + "_originalSource": "datatables.net-buttons-bs" } \ No newline at end of file diff --git a/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.js b/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.js index 30aa04d3..0dc7b5bb 100644 --- a/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.js +++ b/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.js @@ -1,5 +1,5 @@ /*! Bootstrap integration for DataTables' Buttons - * ©2015 SpryMedia Ltd - datatables.net/license + * ©2016 SpryMedia Ltd - datatables.net/license */ (function( factory ){ diff --git a/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.min.js b/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.min.js index eabe00d6..dc28bac1 100644 --- a/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.min.js +++ b/vendors/datatables.net-buttons-bs/js/buttons.bootstrap.min.js @@ -1,6 +1,6 @@ /*! Bootstrap integration for DataTables' Buttons - ©2015 SpryMedia Ltd - datatables.net/license + ©2016 SpryMedia Ltd - datatables.net/license */ (function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{className:"dt-buttons btn-group"}, button:{className:"btn btn-default"},collection:{tag:"ul",className:"dt-button-collection dropdown-menu",button:{tag:"li",className:"dt-button"},buttonLiner:{tag:"a",className:""}}}});a.ext.buttons.collection.text=function(a){return a.i18n("buttons.collection",'Collection ')};return a.Buttons}); diff --git a/vendors/datatables.net-buttons/.bower.json b/vendors/datatables.net-buttons/.bower.json index 286b9cd0..1ba81036 100644 --- a/vendors/datatables.net-buttons/.bower.json +++ b/vendors/datatables.net-buttons/.bower.json @@ -42,15 +42,14 @@ ], "homepage": "https://datatables.net", "license": "MIT", - "version": "1.1.2", - "_release": "1.1.2", + "version": "1.2.1", + "_release": "1.2.1", "_resolution": { "type": "version", - "tag": "1.1.2", - "commit": "cf57d365cc5638369d3a4196018daa54d71bc8e2" + "tag": "1.2.1", + "commit": "0518965e46150aa2a62d0132053f338cabe165fb" }, "_source": "https://github.com/DataTables/Dist-DataTables-Buttons.git", "_target": "^1.1.2", - "_originalSource": "datatables.net-buttons", - "_direct": true + "_originalSource": "datatables.net-buttons" } \ No newline at end of file diff --git a/vendors/datatables.net-buttons/js/buttons.colVis.js b/vendors/datatables.net-buttons/js/buttons.colVis.js index d1d4932e..08e42fae 100755 --- a/vendors/datatables.net-buttons/js/buttons.colVis.js +++ b/vendors/datatables.net-buttons/js/buttons.colVis.js @@ -1,6 +1,6 @@ /*! * Column visibility buttons for Buttons and DataTables. - * 2015 SpryMedia Ltd - datatables.net/license + * 2016 SpryMedia Ltd - datatables.net/license */ (function( factory ){ @@ -107,9 +107,9 @@ $.extend( DataTable.ext.buttons, { var col = dt.column( conf.columns ); dt - .on( 'column-visibility.dt'+conf.namespace, function (e, settings, column, state) { - if ( ! settings.bDestroying && column === conf.columns ) { - that.active( state ); + .on( 'column-visibility.dt'+conf.namespace, function (e, settings) { + if ( ! settings.bDestroying ) { + that.active( col.visible() ); } } ) .on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) { @@ -182,8 +182,10 @@ $.extend( DataTable.ext.buttons, { className: 'buttons-colvisGroup', action: function ( e, dt, button, conf ) { - dt.columns( conf.show ).visible( true ); - dt.columns( conf.hide ).visible( false ); + dt.columns( conf.show ).visible( true, false ); + dt.columns( conf.hide ).visible( false, false ); + + dt.columns.adjust(); }, show: [], diff --git a/vendors/datatables.net-buttons/js/buttons.colVis.min.js b/vendors/datatables.net-buttons/js/buttons.colVis.min.js index 35f07114..e007073b 100644 --- a/vendors/datatables.net-buttons/js/buttons.colVis.min.js +++ b/vendors/datatables.net-buttons/js/buttons.colVis.min.js @@ -1,5 +1,5 @@ -(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(d){return g(d,window,document)}):"object"===typeof exports?module.exports=function(d,e){d||(d=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(d,e).$;e.fn.dataTable.Buttons||require("datatables.net-buttons")(d,e);return g(e,d,d.document)}:g(jQuery,window,document)})(function(g,d,e,h){d=g.fn.dataTable;g.extend(d.ext.buttons,{colvis:function(b,a){return{extend:"collection", -text:function(c){return c.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:a.columns}]}},columnsToggle:function(b,a){return b.columns(a.columns).indexes().map(function(c){return{extend:"columnToggle",columns:c}}).toArray()},columnToggle:function(b,a){return{extend:"columnVisibility",columns:a.columns}},columnsVisibility:function(b,a){return b.columns(a.columns).indexes().map(function(c){return{extend:"columnVisibility",columns:c,visibility:a.visibility}}).toArray()}, -columnVisibility:{columns:h,text:function(b,a,c){return c._columnText(b,c.columns)},className:"buttons-columnVisibility",action:function(b,a,c,f){b=a.columns(f.columns);a=b.visible();b.visible(f.visibility!==h?f.visibility:!(a.length&&a[0]))},init:function(b,a,c){var f=this,a=b.column(c.columns);b.on("column-visibility.dt"+c.namespace,function(b,a,d,e){!a.bDestroying&&d===c.columns&&f.active(e)}).on("column-reorder.dt"+c.namespace,function(a,d,e){1===b.columns(c.columns).count()&&("number"===typeof c.columns&& -(c.columns=e.mapping[c.columns]),a=b.column(c.columns),f.text(c._columnText(b,c.columns)),f.active(a.visible()))});this.active(a.visible())},destroy:function(b,a,c){b.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(b,a){var c=b.column(a).index();return b.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(b){return b.i18n("buttons.colvisRestore", -"Restore visibility")},init:function(b,a,c){c._visOriginal=b.columns().indexes().map(function(a){return b.column(a).visible()}).toArray()},action:function(b,a,c,d){a.columns().every(function(b){b=a.colReorder&&a.colReorder.transpose?a.colReorder.transpose(b,"toOriginal"):b;this.visible(d._visOriginal[b])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(b,a,c,d){a.columns(d.show).visible(!0);a.columns(d.hide).visible(!1)},show:[],hide:[]}});return d.Buttons}); +(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(d){return g(d,window,document)}):"object"===typeof exports?module.exports=function(d,e){d||(d=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(d,e).$;e.fn.dataTable.Buttons||require("datatables.net-buttons")(d,e);return g(e,d,d.document)}:g(jQuery,window,document)})(function(g,d,e,h){d=g.fn.dataTable;g.extend(d.ext.buttons,{colvis:function(a,b){return{extend:"collection", +text:function(a){return a.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:b.columns}]}},columnsToggle:function(a,b){return a.columns(b.columns).indexes().map(function(a){return{extend:"columnToggle",columns:a}}).toArray()},columnToggle:function(a,b){return{extend:"columnVisibility",columns:b.columns}},columnsVisibility:function(a,b){return a.columns(b.columns).indexes().map(function(a){return{extend:"columnVisibility",columns:a,visibility:b.visibility}}).toArray()}, +columnVisibility:{columns:h,text:function(a,b,c){return c._columnText(a,c.columns)},className:"buttons-columnVisibility",action:function(a,b,c,f){a=b.columns(f.columns);b=a.visible();a.visible(f.visibility!==h?f.visibility:!(b.length&&b[0]))},init:function(a,b,c){var f=this,d=a.column(c.columns);a.on("column-visibility.dt"+c.namespace,function(a,b){b.bDestroying||f.active(d.visible())}).on("column-reorder.dt"+c.namespace,function(b,d,e){1===a.columns(c.columns).count()&&("number"===typeof c.columns&& +(c.columns=e.mapping[c.columns]),b=a.column(c.columns),f.text(c._columnText(a,c.columns)),f.active(b.visible()))});this.active(d.visible())},destroy:function(a,b,c){a.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(a,b){var c=a.column(b).index();return a.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("buttons.colvisRestore", +"Restore visibility")},init:function(a,b,c){c._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()},action:function(a,b,c,d){b.columns().every(function(a){a=b.colReorder&&b.colReorder.transpose?b.colReorder.transpose(a,"toOriginal"):a;this.visible(d._visOriginal[a])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(a,b,c,d){b.columns(d.show).visible(!0,!1);b.columns(d.hide).visible(!1,!1);b.columns.adjust()},show:[],hide:[]}});return d.Buttons}); diff --git a/vendors/datatables.net-buttons/js/buttons.flash.js b/vendors/datatables.net-buttons/js/buttons.flash.js index a817f794..bbc3254f 100644 --- a/vendors/datatables.net-buttons/js/buttons.flash.js +++ b/vendors/datatables.net-buttons/js/buttons.flash.js @@ -90,6 +90,10 @@ var ZeroClipboard_TableTools = { } }, + log: function ( str ) { + console.log( 'Flash: '+str ); + }, + register: function(id, client) { // register new client to receive events this.clients[id] = client; @@ -307,11 +311,10 @@ ZeroClipboard_TableTools.Client.prototype = { } }, - setSheetName: function(newText) { - // set sheet name, for excel - this.sheetName = newText; + setSheetData: function(data) { + // set the xlsx sheet data if (this.ready) { - this.movie.setSheetName(newText); + this.movie.setSheetData( JSON.stringify( data ) ); } }, @@ -506,7 +509,7 @@ var _filename = function ( config, incExtension ) } if ( filename.indexOf( '*' ) !== -1 ) { - filename = filename.replace( '*', $('title').text() ); + filename = $.trim( filename.replace( '*', $('title').text() ) ); } // Strip characters which the OS will object to @@ -530,7 +533,7 @@ var _sheetname = function ( config ) sheetName = config.sheetName.replace(/[\[\]\*\/\\\?\:]/g, ''); } - return sheetName; + return sheetName; }; /** @@ -547,7 +550,7 @@ var _title = function ( config ) } return title.indexOf( '*' ) !== -1 ? - title.replace( '*', $('title').text() ) : + title.replace( '*', $('title').text() || 'Exported data' ) : title; }; @@ -683,12 +686,367 @@ var flashButton = { }; +/** + * Convert from numeric position to letter for column names in Excel + * @param {int} n Column number + * @return {string} Column letter(s) name + */ +function createCellPos( n ){ + var ordA = 'A'.charCodeAt(0); + var ordZ = 'Z'.charCodeAt(0); + var len = ordZ - ordA + 1; + var s = ""; + + while( n >= 0 ) { + s = String.fromCharCode(n % len + ordA) + s; + n = Math.floor(n / len) - 1; + } + + return s; +} + +/** + * Create an XML node and add any children, attributes, etc without needing to + * be verbose in the DOM. + * + * @param {object} doc XML document + * @param {string} nodeName Node name + * @param {object} opts Options - can be `attr` (attributes), `children` + * (child nodes) and `text` (text content) + * @return {node} Created node + */ +function _createNode( doc, nodeName, opts ){ + var tempNode = doc.createElement( nodeName ); + + if ( opts ) { + if ( opts.attr ) { + $(tempNode).attr( opts.attr ); + } + + if( opts.children ) { + $.each( opts.children, function ( key, value ) { + tempNode.appendChild( value ); + }); + } + + if( opts.text ) { + tempNode.appendChild( doc.createTextNode( opts.text ) ); + } + } + + return tempNode; +} + +/** + * Get the width for an Excel column based on the contents of that column + * @param {object} data Data for export + * @param {int} col Column index + * @return {int} Column width + */ +function _excelColWidth( data, col ) { + var max = data.header[col].length; + var len; + + if ( data.footer && data.footer[col].length > max ) { + max = data.footer[col].length; + } + + for ( var i=0, ien=data.body.length ; i max ) { + max = len; + } + + // Max width rather than having potentially massive column widths + if ( max > 40 ) { + break; + } + } + + // And a min width + return max > 5 ? max : 5; +} + +try { + var _serialiser = new XMLSerializer(); + var _ieExcel; +} +catch (t) {} + +/** + * Convert XML documents in an object to strings + * @param {object} obj XLSX document object + */ +function _xlsxToStrings( obj ) { + if ( _ieExcel === undefined ) { + // Detect if we are dealing with IE's _awful_ serialiser by seeing if it + // drop attributes + _ieExcel = _serialiser + .serializeToString( + $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] ) + ) + .indexOf( 'xmlns:r' ) === -1; + } + + $.each( obj, function ( name, val ) { + if ( $.isPlainObject( val ) ) { + _xlsxToStrings( val ); + } + else { + if ( _ieExcel ) { + // IE's XML serialiser will drop some name space attributes from + // from the root node, so we need to save them. Do this by + // replacing the namespace nodes with a regular attribute that + // we convert back when serialised. Edge does not have this + // issue + var worksheet = val.childNodes[0]; + var i, ien; + var attrs = []; + + for ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) { + var attrName = worksheet.attributes[i].nodeName; + var attrValue = worksheet.attributes[i].nodeValue; + + if ( attrName.indexOf( ':' ) !== -1 ) { + attrs.push( { name: attrName, value: attrValue } ); + + worksheet.removeAttribute( attrName ); + } + } + + for ( i=0, ien=attrs.length ; i/g, '' ); + + obj[ name ] = str; + } + } ); +} + +// Excel - Pre-defined strings to build a basic XLSX file +var excelStrings = { + "_rels/.rels": + ''+ + ''+ + ''+ + '', + + "xl/_rels/workbook.xml.rels": + ''+ + ''+ + ''+ + ''+ + '', + + "[Content_Types].xml": + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '', + + "xl/workbook.xml": + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '', + + "xl/worksheets/sheet1.xml": + ''+ + ''+ + ''+ + '', + + "xl/styles.xml": + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ // Excel appears to use this as a dotted background regardless of values + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' +}; +// Note we could use 3 `for` loops for the styles, but when gzipped there is +// virtually no difference in size, since the above can be easily compressed + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DataTables options and methods */ // Set the default SWF path -DataTable.Buttons.swfPath = '//cdn.datatables.net/buttons/1.0.0/swf/flashExport.swf'; +DataTable.Buttons.swfPath = '//cdn.datatables.net/buttons/1.2.0/swf/flashExport.swf'; // Method to allow Flash buttons to be resized when made visible - as they are // of zero height and width if initialised hidden @@ -726,11 +1084,11 @@ DataTable.ext.buttons.copyFlash = $.extend( {}, flashButton, { data.str; flash.setAction( 'copy' ); - _setText( flash, output ); + _setText( flash, output ); dt.buttons.info( dt.i18n( 'buttons.copyTitle', 'Copy to clipboard' ), - dt.i18n( 'buttons.copyInfo', { + dt.i18n( 'buttons.copySuccess', { _: 'Copied %d rows to clipboard', 1: 'Copied 1 row to clipboard' }, data.rows ), @@ -776,57 +1134,147 @@ DataTable.ext.buttons.excelFlash = $.extend( {}, flashButton, { }, action: function ( e, dt, button, config ) { - // Set the text - var xml = ''; var flash = config._flash; + var rowPos = 0; + var rels = $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] ) ; //Parses xml + var relsGet = rels.getElementsByTagName( "sheetData" )[0]; + + var xlsx = { + _rels: { + ".rels": $.parseXML( excelStrings['_rels/.rels'] ) + }, + xl: { + _rels: { + "workbook.xml.rels": $.parseXML( excelStrings['xl/_rels/workbook.xml.rels'] ) + }, + "workbook.xml": $.parseXML( excelStrings['xl/workbook.xml'] ), + "styles.xml": $.parseXML( excelStrings['xl/styles.xml'] ), + "worksheets": { + "sheet1.xml": rels + } + + }, + "[Content_Types].xml": $.parseXML( excelStrings['[Content_Types].xml']) + }; + var data = dt.buttons.exportData( config.exportOptions ); + var currentRow, rowNode; var addRow = function ( row ) { - var cells = []; + currentRow = rowPos+1; + rowNode = _createNode( rels, "row", { attr: {r:currentRow} } ); for ( var i=0, ien=row.length ; i'+row[i]+'' : - ''+( - ! row[i].replace ? - row[i] : - row[i] - .replace(/&(?!amp;)/g, '&') - .replace(//g, '>') - .replace(/[\x00-\x1F\x7F-\x9F]/g, ''))+ // remove control characters - '' // they are not valid in XML - ); - } + // Detect numbers - don't match numbers with leading zeros or a negative + // anywhere but the start + if ( typeof row[i] === 'number' || ( + row[i].match && + $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && + ! $.trim(row[i]).match(/^0\d+/) ) + ) { + cell = _createNode( rels, 'c', { + attr: { + t: 'n', + r: cellId + }, + children: [ + _createNode( rels, 'v', { text: row[i] } ) + ] + } ); + } + else { + // Replace non standard characters for text output + var text = ! row[i].replace ? + row[i] : + row[i] + .replace(/&(?!amp;)/g, '&') + .replace(//g, '>') + .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''); - return ''+cells.join('')+''; + cell = _createNode( rels, 'c', { + attr: { + t: 'inlineStr', + r: cellId + }, + children:{ + row: _createNode( rels, 'is', { + children: { + row: _createNode( rels, 't', { + text: text + } ) + } + } ) + } + } ); + } + + rowNode.appendChild( cell ); + } + relsGet.appendChild(rowNode); + rowPos++; }; + $( 'sheets sheet', xlsx.xl['workbook.xml'] ).attr( 'name', _sheetname( config ) ); + + if ( config.customizeData ) { + config.customizeData( data ); + } + if ( config.header ) { - xml += addRow( data.header ); + addRow( data.header, rowPos ); + $('row c', rels).attr( 's', '2' ); // bold } - for ( var i=0, ien=data.body.length ; i');else d+='';return d},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){var a=this;this.domElement&&this.div&&(g(this.div).remove(),this.div=this.domElement=null,g.each(e.clients,function(b,d){d===a&&delete e.clients[b]}))},reposition:function(a){a&&((this.domElement=e.$(a))||this.hide());if(this.domElement&&this.div){var a=e.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}}, -clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+=a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)},setSheetName:function(a){this.sheetName=a;this.ready&&this.movie.setSheetName(a)},setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/, -"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var d,a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=f.getElementById(this.movieId);if(!this.movie){d=this;setTimeout(function(){d.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){d= -this;setTimeout(function(){d.receiveEvent("load",null)},100);this.ready=!0;return}this.ready=!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&& -(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var c=0,j=this.handlers[a].length;c'+a[c]+"":''+(!a[c].replace?a[c]:a[c].replace(/&(?!amp;)/g,"&").replace(//g,">").replace(/[\x00-\x1F\x7F-\x9F]/g,""))+"")}return""+b.join("")+""};c.header&&(a+=e(b.header));for(var f= -0,h=b.body.length;fd&&(d=a.footer[b].length);for(var e=0,f=a.body.length;ed&&(d=c),40'+c),c=c.replace(/_dt_b_namespace_token_/g,":"));c=c.replace(//g,"");a[b]=c}})}var j=g.fn.dataTable,h={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=k.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display=""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass= +function(a){return!!this.className.match(RegExp("\\s*"+a+"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,d){(a=this.clients[a])&&a.receiveEvent(b,d)},log:function(a){console.log("Flash: "+a)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.height=a.style.height.replace("px", +""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b},Client:function(a){this.handlers={};this.id=h.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;h.register(this.id,this);a&&this.glue(a)}};h.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"",action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,sheetName:"",glue:function(a,b){this.domElement=h.$(a);var d=99;this.domElement.style.zIndex&&(d=parseInt(this.domElement.style.zIndex, +10)+1);var c=h.getDOMObjectPosition(this.domElement);this.div=k.createElement("div");var e=this.div.style;e.position="absolute";e.left="0px";e.top="0px";e.width=c.width+"px";e.height=c.height+"px";e.zIndex=d;"undefined"!=typeof b&&""!==b&&(this.div.title=b);0!==c.width&&0!==c.height&&(this.sized=!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(c.width,c.height).replace(/&/g,"&"))},positionElement:function(){var a=h.getDOMObjectPosition(this.domElement), +b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&&0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var d="",c="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var e=location.href.match(/^https/i)?"https://":"http://",d=d+('');else d+='';return d},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){var a=this;this.domElement&&this.div&&(g(this.div).remove(),this.div=this.domElement=null,g.each(h.clients,function(b,d){d===a&&delete h.clients[b]}))}, +reposition:function(a){a&&((this.domElement=h.$(a))||this.hide());if(this.domElement&&this.div){var a=h.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+=a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)}, +setSheetData:function(a){this.ready&&this.movie.setSheetData(JSON.stringify(a))},setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var d,a=a.toString().toLowerCase().replace(/^on/, +"");switch(a){case "load":this.movie=k.getElementById(this.movieId);if(!this.movie){d=this;setTimeout(function(){d.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){d=this;setTimeout(function(){d.receiveEvent("load",null)},100);this.ready=!0;return}this.ready=!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setHandCursor(this.handCursorEnabled); +break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var c= +0,e=this.handlers[a].length;c',"xl/_rels/workbook.xml.rels":'', +"[Content_Types].xml":'', +"xl/workbook.xml":'', +"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}; +j.Buttons.swfPath="//cdn.datatables.net/buttons/1.2.0/swf/flashExport.swf";j.Api.register("buttons.resize()",function(){g.each(h.clients,function(a,b){b.domElement!==o&&b.domElement.parentNode&&b.positionElement()})});j.ext.buttons.copyFlash=g.extend({},s,{className:"buttons-copy buttons-flash",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){c._fromFlash&&(a=c._flash,d=x(b,c),c=c.customize?c.customize(d.str,c):d.str,a.setAction("copy"),r(a,c),b.buttons.info(b.i18n("buttons.copyTitle", +"Copy to clipboard"),b.i18n("buttons.copySuccess",{_:"Copied %d rows to clipboard",1:"Copied 1 row to clipboard"},d.rows),3E3))},fieldSeparator:"\t",fieldBoundary:""});j.ext.buttons.csvFlash=g.extend({},s,{className:"buttons-csv buttons-flash",text:function(a){return a.i18n("buttons.csv","CSV")},action:function(a,b,d,c){a=c._flash;b=x(b,c);b=c.customize?c.customize(b.str,c):b.str;a.setAction("csv");a.setFileName(q(c));r(a,b)},escapeChar:'"'});j.ext.buttons.excelFlash=g.extend({},s,{className:"buttons-excel buttons-flash", +text:function(a){return a.i18n("buttons.excel","Excel")},action:function(a,b,d,c){var a=c._flash,e=0,f=g.parseXML(p["xl/worksheets/sheet1.xml"]),h=f.getElementsByTagName("sheetData")[0],d={_rels:{".rels":g.parseXML(p["_rels/.rels"])},xl:{_rels:{"workbook.xml.rels":g.parseXML(p["xl/_rels/workbook.xml.rels"])},"workbook.xml":g.parseXML(p["xl/workbook.xml"]),"styles.xml":g.parseXML(p["xl/styles.xml"]),worksheets:{"sheet1.xml":f}},"[Content_Types].xml":g.parseXML(p["[Content_Types].xml"])},b=b.buttons.exportData(c.exportOptions), +i,k,j=function(a){i=e+1;k=l(f,"row",{attr:{r:i}});for(var b=0,c=a.length;b/g,">").replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, +""),d=l(f,"c",{attr:{t:"inlineStr",r:d},children:{row:l(f,"is",{children:{row:l(f,"t",{text:j})}})}}));k.appendChild(d)}h.appendChild(k);e++};g("sheets sheet",d.xl["workbook.xml"]).attr("name",z(c));c.customizeData&&c.customizeData(b);c.header&&(j(b.header,e),g("row c",f).attr("s","2"));for(var m=0,n=b.body.length;m= 0 ) { + s = String.fromCharCode(n % len + ordA) + s; + n = Math.floor(n / len) - 1; + } + + return s; +} + +try { + var _serialiser = new XMLSerializer(); + var _ieExcel; +} +catch (t) {} + +/** + * Recursively add XML files from an object's structure to a ZIP file. This + * allows the XSLX file to be easily defined with an object's structure matching + * the files structure. + * + * @param {JSZip} zip ZIP package + * @param {object} obj Object to add (recursive) + */ +function _addToZip( zip, obj ) { + if ( _ieExcel === undefined ) { + // Detect if we are dealing with IE's _awful_ serialiser by seeing if it + // drop attributes + _ieExcel = _serialiser + .serializeToString( + $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] ) + ) + .indexOf( 'xmlns:r' ) === -1; + } + + $.each( obj, function ( name, val ) { + if ( $.isPlainObject( val ) ) { + var newDir = zip.folder( name ); + _addToZip( newDir, val ); + } + else { + if ( _ieExcel ) { + // IE's XML serialiser will drop some name space attributes from + // from the root node, so we need to save them. Do this by + // replacing the namespace nodes with a regular attribute that + // we convert back when serialised. Edge does not have this + // issue + var worksheet = val.childNodes[0]; + var i, ien; + var attrs = []; + + for ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) { + var attrName = worksheet.attributes[i].nodeName; + var attrValue = worksheet.attributes[i].nodeValue; + + if ( attrName.indexOf( ':' ) !== -1 ) { + attrs.push( { name: attrName, value: attrValue } ); + + worksheet.removeAttribute( attrName ); + } + } + + for ( i=0, ien=attrs.length ; i/g, '' ); + + zip.file( name, str ); + } + } ); +} + +/** + * Create an XML node and add any children, attributes, etc without needing to + * be verbose in the DOM. + * + * @param {object} doc XML document + * @param {string} nodeName Node name + * @param {object} opts Options - can be `attr` (attributes), `children` + * (child nodes) and `text` (text content) + * @return {node} Created node + */ +function _createNode( doc, nodeName, opts ) { + var tempNode = doc.createElement( nodeName ); + + if ( opts ) { + if ( opts.attr ) { + $(tempNode).attr( opts.attr ); + } + + if( opts.children ) { + $.each( opts.children, function ( key, value ) { + tempNode.appendChild( value ); + }); + } + + if( opts.text ) { + tempNode.appendChild( doc.createTextNode( opts.text ) ); + } + } + + return tempNode; +} + +/** + * Get the width for an Excel column based on the contents of that column + * @param {object} data Data for export + * @param {int} col Column index + * @return {int} Column width + */ +function _excelColWidth( data, col ) { + var max = data.header[col].length; + var len; + + if ( data.footer && data.footer[col].length > max ) { + max = data.footer[col].length; + } + + for ( var i=0, ien=data.body.length ; i max ) { + max = len; + } + + // Max width rather than having potentially massive column widths + if ( max > 40 ) { + break; + } + } + + // And a min width + return max > 5 ? max : 5; +} + +// Excel - Pre-defined strings to build a basic XLSX file var excelStrings = { - "_rels/.rels": '\ -\ - \ -', + "_rels/.rels": + ''+ + ''+ + ''+ + '', - "xl/_rels/workbook.xml.rels": '\ -\ - \ -', + "xl/_rels/workbook.xml.rels": + ''+ + ''+ + ''+ + ''+ + '', - "[Content_Types].xml": '\ -\ - \ - \ - \ - \ - \ -', + "[Content_Types].xml": + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '', - "xl/workbook.xml": '\ -\ - \ - \ - \ - \ - \ - \ - \ - \ -', + "xl/workbook.xml": + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '', - "xl/worksheets/sheet1.xml": '\ -\ - \ - __DATA__\ - \ -' + "xl/worksheets/sheet1.xml": + ''+ + ''+ + ''+ + '', + + "xl/styles.xml": + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ // Excel appears to use this as a dotted background regardless of values + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' }; +// Note we could use 3 `for` loops for the styles, but when gzipped there is +// virtually no difference in size, since the above can be easily compressed @@ -582,7 +943,6 @@ DataTable.ext.buttons.csvHtml5 = { action: function ( e, dt, button, config ) { // Set the text - var newLine = _newLine( config ); var output = _exportData( dt, config ).str; var charset = config.charset; @@ -635,7 +995,7 @@ DataTable.ext.buttons.excelHtml5 = { className: 'buttons-excel buttons-html5', available: function () { - return window.FileReader !== undefined && window.JSZip !== undefined && ! _isSafari(); + return window.FileReader !== undefined && jsZip !== undefined && ! _isSafari() && _serialiser; }, text: function ( dt ) { @@ -643,64 +1003,163 @@ DataTable.ext.buttons.excelHtml5 = { }, action: function ( e, dt, button, config ) { - // Set the text - var xml = ''; + var rowPos = 0; + var getXml = function ( type ) { + var str = excelStrings[ type ]; + + //str = str.replace( /xmlns:/g, 'xmlns_' ).replace( /mc:/g, 'mc_' ); + + return $.parseXML( str ); + }; + var rels = getXml('xl/worksheets/sheet1.xml'); + var relsGet = rels.getElementsByTagName( "sheetData" )[0]; + + var xlsx = { + _rels: { + ".rels": getXml('_rels/.rels') + }, + xl: { + _rels: { + "workbook.xml.rels": getXml('xl/_rels/workbook.xml.rels') + }, + "workbook.xml": getXml('xl/workbook.xml'), + "styles.xml": getXml('xl/styles.xml'), + "worksheets": { + "sheet1.xml": rels + } + + }, + "[Content_Types].xml": getXml('[Content_Types].xml') + }; + var data = dt.buttons.exportData( config.exportOptions ); + var currentRow, rowNode; var addRow = function ( row ) { - var cells = []; + currentRow = rowPos+1; + rowNode = _createNode( rels, "row", { attr: {r:currentRow} } ); for ( var i=0, ien=row.length ; i'+row[i]+'' : - ''+( - ! row[i].replace ? - row[i] : - row[i] - .replace(/&(?!amp;)/g, '&') - .replace(//g, '>') - .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters - '' // they are not valid in XML - ); - } + // Detect numbers - don't match numbers with leading zeros or a negative + // anywhere but the start + if ( typeof row[i] === 'number' || ( + row[i].match && + $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && + ! $.trim(row[i]).match(/^0\d+/) ) + ) { + cell = _createNode( rels, 'c', { + attr: { + t: 'n', + r: cellId + }, + children: [ + _createNode( rels, 'v', { text: row[i] } ) + ] + } ); + } + else { + // Replace non standard characters for text output + var text = ! row[i].replace ? + row[i] : + row[i] + .replace(/&(?!amp;)/g, '&') + .replace(//g, '>') + .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''); - return ''+cells.join('')+''; + cell = _createNode( rels, 'c', { + attr: { + t: 'inlineStr', + r: cellId + }, + children:{ + row: _createNode( rels, 'is', { + children: { + row: _createNode( rels, 't', { + text: text + } ) + } + } ) + } + } ); + } + + rowNode.appendChild( cell ); + } + relsGet.appendChild(rowNode); + rowPos++; }; + $( 'sheets sheet', xlsx.xl['workbook.xml'] ).attr( 'name', _sheetname( config ) ); + + if ( config.customizeData ) { + config.customizeData( data ); + } + if ( config.header ) { - xml += addRow( data.header ); + addRow( data.header, rowPos ); + $('row c', rels).attr( 's', '2' ); // bold } - for ( var i=0, ien=data.body.length ; i\t',"xl/_rels/workbook.xml.rels":'\t', -"[Content_Types].xml":'\t\t\t\t\t', -"xl/workbook.xml":'\t\t\t\t\t\t\t\t\t\t', -"xl/worksheets/sheet1.xml":'\t\t\t__DATA__\t'};l.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5", -text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,e,c){var a=C(b,c),d=a.str,e=g("
    ").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});c.customize&&(d=c.customize(d,c));c=g("
    +
    + + +
  • diff --git a/vendors/echarts/test/radar.html b/vendors/echarts/test/radar.html index 62021d1e..b36c063c 100644 --- a/vendors/echarts/test/radar.html +++ b/vendors/echarts/test/radar.html @@ -60,6 +60,10 @@ ] }] }); + + chart.on('click', function (params) { + console.log(params) + }) }); diff --git a/vendors/echarts/test/reset.css b/vendors/echarts/test/reset.css index 09ffbd5d..2a90fc39 100644 --- a/vendors/echarts/test/reset.css +++ b/vendors/echarts/test/reset.css @@ -1,6 +1,7 @@ html, body, -#main { +#main, +body > .main { width: 100%; height: 100%; margin: 0; diff --git a/vendors/echarts/test/sankey.html b/vendors/echarts/test/sankey.html index 6a7fc2fe..2c809ef7 100644 --- a/vendors/echarts/test/sankey.html +++ b/vendors/echarts/test/sankey.html @@ -31,6 +31,11 @@ chart.resize(); } + chart.on('click', function (params) { + console.log(params, params.data); + }); + + $.getJSON('./data/energy.json') .done(function(data) { chart.setOption({ diff --git a/vendors/echarts/test/scale-integer.html b/vendors/echarts/test/scale-integer.html new file mode 100644 index 00000000..ae694455 --- /dev/null +++ b/vendors/echarts/test/scale-integer.html @@ -0,0 +1,46 @@ + + + + + + + + + +
    + + + \ No newline at end of file diff --git a/vendors/echarts/test/scatter.html b/vendors/echarts/test/scatter.html index 84278d8a..89dc4a7f 100644 --- a/vendors/echarts/test/scatter.html +++ b/vendors/echarts/test/scatter.html @@ -96,7 +96,11 @@ type: 'scatter', label: { emphasis: { - show: true + show: true, + position: 'top', + formatter: function (params) { + return params.value; + } } }, symbolSize: function (val) { @@ -122,7 +126,17 @@ return val[2] * 40; }, data: data3 - }] + }], + animationDelay: function (idx) { + return idx * 20; + }, + animationDelayUpdate: function (idx) { + return idx * 20; + } + }); + + chart.on('click', function (params) { + console.log(params.data); }); }) diff --git a/vendors/echarts/test/timeline-finance.html b/vendors/echarts/test/timeline-finance.html index c798a9bc..5b9bff46 100644 --- a/vendors/echarts/test/timeline-finance.html +++ b/vendors/echarts/test/timeline-finance.html @@ -321,6 +321,10 @@ var option = { chart.on('legendSelected', function () { }); + chart.on('click', function (params) { + console.log(params); + }); + window.onresize = chart.resize; }); diff --git a/vendors/echarts/test/treemap-disk.html b/vendors/echarts/test/treemap-disk.html index d94f9de9..6b6529b0 100644 --- a/vendors/echarts/test/treemap-disk.html +++ b/vendors/echarts/test/treemap-disk.html @@ -198,6 +198,10 @@ } ] }); + + chart.on('click', function (params) { + console.log(params); + }); } diff --git a/vendors/echarts/test/treemap-option.html b/vendors/echarts/test/treemap-option.html index 7fd7cadb..7488b3ad 100644 --- a/vendors/echarts/test/treemap-option.html +++ b/vendors/echarts/test/treemap-option.html @@ -77,18 +77,88 @@ name: 'option', type: 'treemap', visibleMin: 300, - data: data.children, + // animationDurationUpdate: 2000, + // data: data.children, + data: [ + { + name: 'a', + value: 10, + children: [ + { + name: 'a1', + value: 11, + children: [ + { + name: 'a11', + value: 111, + }, + { + name: 'a111', + value: 1111 + }, + { + name: 'a112', + value: 1111 + }, + { + name: 'a113', + value: 111 + }, + { + name: 'a114', + value: 111 + }, + { + name: 'a115', + value: 1100 + } + ] + } + ] + }, + { + name: 'b', + value: 6, + children: [ + { + name: 'b1', + value: 15, + chidren: [ + { + name: 'b11', + value: 120 + } + ] + } + ] + } + ], leafDepth: 1, nodeClick: 'link', itemStyle: { - normal: { - // gapWidth: 1 - // borderWidth: 1 - } + // normal: { + // gapWidth: 1, + // borderWidth: 1 + // } }, levels: [ - {}, { + itemStyle: { + normal: { + borderColor: '#333', + borderWidth: 4, + gapWidth: 2 + } + } + }, + { + itemStyle: { + normal: { + borderColor: '#aaa', + gapWidth: 2, + borderWidth: 2 + } + }, colorSaturation: [0.2, 0.7] } ] diff --git a/vendors/echarts/test/treemap-option2.html b/vendors/echarts/test/treemap-option2.html new file mode 100644 index 00000000..b59e443c --- /dev/null +++ b/vendors/echarts/test/treemap-option2.html @@ -0,0 +1,120 @@ + + + + + Option View + + + + + + +
    + + + + + \ No newline at end of file diff --git a/vendors/echarts/test/treemap-simple.html b/vendors/echarts/test/treemap-simple.html index 5c6186e8..50fd81f3 100644 --- a/vendors/echarts/test/treemap-simple.html +++ b/vendors/echarts/test/treemap-simple.html @@ -3,14 +3,9 @@ + -
    - - - - - - - - - diff --git a/vendors/echarts/test/ut/spec/.jshintrc b/vendors/echarts/test/ut/.jshintrc similarity index 93% rename from vendors/echarts/test/ut/spec/.jshintrc rename to vendors/echarts/test/ut/.jshintrc index 4f891219..16b71da1 100644 --- a/vendors/echarts/test/ut/spec/.jshintrc +++ b/vendors/echarts/test/ut/.jshintrc @@ -16,7 +16,7 @@ "plusplus": false, "quotmark": "single", "undef": true, - "predef": ["define", "require", "describe", "expect", "it"], + "predef": ["define", "require", "describe", "expect", "beforeEach", "it"], "unused": "vars", "strict": false, "maxparams": 20, diff --git a/vendors/echarts/test/ut/all.js b/vendors/echarts/test/ut/all.js deleted file mode 100755 index 18c65423..00000000 --- a/vendors/echarts/test/ut/all.js +++ /dev/null @@ -1,9 +0,0 @@ -document.write(' + - + + + + diff --git a/vendors/echarts/test/ut/ut.html b/vendors/echarts/test/ut/ut.html new file mode 100644 index 00000000..358dff44 --- /dev/null +++ b/vendors/echarts/test/ut/ut.html @@ -0,0 +1,19 @@ + + + + + Jasmine Spec Runner v2.3.4 + + + + + + + + + + + + + + diff --git a/vendors/echarts/test/ut/ut.js b/vendors/echarts/test/ut/ut.js new file mode 100644 index 00000000..20a64778 --- /dev/null +++ b/vendors/echarts/test/ut/ut.js @@ -0,0 +1,13 @@ +document.write(' + + + + + + +
    Color Hue
    +
    +
    Color List
    +
    +
    Map
    +
    +
    Stacked Bar (and inversed)
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendors/echarts/test/visualMap-layout.html b/vendors/echarts/test/visualMap-layout.html index 2b2353a1..e48d67ed 100644 --- a/vendors/echarts/test/visualMap-layout.html +++ b/vendors/echarts/test/visualMap-layout.html @@ -415,8 +415,8 @@ shadowColor: 'rgba(0, 0, 0, 0.5)' } }, - symbolSize: 5, - data: [] + symbolSize: 20, + data: [[50, 50, 50, 50, 50]] } ] }; diff --git a/vendors/echarts/test/visualMap-opacity.html b/vendors/echarts/test/visualMap-opacity.html index 0342bb8a..794b118a 100644 --- a/vendors/echarts/test/visualMap-opacity.html +++ b/vendors/echarts/test/visualMap-opacity.html @@ -10,7 +10,7 @@ -
    - - - \ No newline at end of file diff --git a/vendors/fastclick/.bower.json b/vendors/fastclick/.bower.json index d20384f4..8a69aefc 100644 --- a/vendors/fastclick/.bower.json +++ b/vendors/fastclick/.bower.json @@ -19,6 +19,5 @@ }, "_source": "https://github.com/ftlabs/fastclick.git", "_target": "^1.0.6", - "_originalSource": "fastclick", - "_direct": true + "_originalSource": "fastclick" } \ No newline at end of file diff --git a/vendors/font-awesome/.bower.json b/vendors/font-awesome/.bower.json index 505130a0..80a0161c 100644 --- a/vendors/font-awesome/.bower.json +++ b/vendors/font-awesome/.bower.json @@ -23,15 +23,14 @@ "Gemfile.lock", "*.md" ], - "version": "4.6.1", - "_release": "4.6.1", + "version": "4.6.3", + "_release": "4.6.3", "_resolution": { "type": "version", - "tag": "v4.6.1", - "commit": "2ea06070a708a56c260d4b60b23318ff55ce67f4" + "tag": "v4.6.3", + "commit": "0f618911b105195c931ec5d5bef425a2a2806cab" }, "_source": "https://github.com/FortAwesome/Font-Awesome.git", "_target": "^4.6.1", - "_originalSource": "fontawesome", - "_direct": true + "_originalSource": "fontawesome" } \ No newline at end of file diff --git a/vendors/font-awesome/css/font-awesome.css b/vendors/font-awesome/css/font-awesome.css index bb0fe51a..a0b879fa 100644 --- a/vendors/font-awesome/css/font-awesome.css +++ b/vendors/font-awesome/css/font-awesome.css @@ -1,13 +1,13 @@ /*! - * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.6.1'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.1') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.1') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.1') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.1') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.1#fontawesomeregular') format('svg'); + src: url('../fonts/fontawesome-webfont.eot?v=4.6.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } @@ -1383,7 +1383,7 @@ .fa-digg:before { content: "\f1a6"; } -.fa-pied-piper:before { +.fa-pied-piper-pp:before { content: "\f1a7"; } .fa-pied-piper-alt:before { @@ -1509,6 +1509,7 @@ content: "\f1ce"; } .fa-ra:before, +.fa-resistance:before, .fa-rebel:before { content: "\f1d0"; } @@ -2157,6 +2158,26 @@ .fa-snapchat-square:before { content: "\f2ad"; } +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} .sr-only { position: absolute; width: 1px; diff --git a/vendors/font-awesome/css/font-awesome.min.css b/vendors/font-awesome/css/font-awesome.min.css index 885b3840..9b27f8ea 100644 --- a/vendors/font-awesome/css/font-awesome.min.css +++ b/vendors/font-awesome/css/font-awesome.min.css @@ -1,4 +1,4 @@ /*! - * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.1');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.1') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.1') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.1') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.1') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.1#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/vendors/font-awesome/fonts/4.4.0/index.html b/vendors/font-awesome/fonts/4.4.0/index.html deleted file mode 100644 index dcb59326..00000000 --- a/vendors/font-awesome/fonts/4.4.0/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - -

    4.4.0

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - diff --git a/vendors/font-awesome/fonts/FontAwesome.otf b/vendors/font-awesome/fonts/FontAwesome.otf index 59853bcd..d4de13e8 100644 Binary files a/vendors/font-awesome/fonts/FontAwesome.otf and b/vendors/font-awesome/fonts/FontAwesome.otf differ diff --git a/vendors/font-awesome/fonts/fontawesome-webfont.eot b/vendors/font-awesome/fonts/fontawesome-webfont.eot index 96f92f9b..c7b00d2b 100644 Binary files a/vendors/font-awesome/fonts/fontawesome-webfont.eot and b/vendors/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/vendors/font-awesome/fonts/fontawesome-webfont.svg b/vendors/font-awesome/fonts/fontawesome-webfont.svg index 5a5f0ecd..8b66187f 100644 --- a/vendors/font-awesome/fonts/fontawesome-webfont.svg +++ b/vendors/font-awesome/fonts/fontawesome-webfont.svg @@ -363,7 +363,7 @@ - + @@ -626,7 +626,7 @@ - + @@ -664,12 +664,12 @@ - - - - - - + + + + + + diff --git a/vendors/font-awesome/fonts/fontawesome-webfont.ttf b/vendors/font-awesome/fonts/fontawesome-webfont.ttf index 86784df9..f221e50a 100644 Binary files a/vendors/font-awesome/fonts/fontawesome-webfont.ttf and b/vendors/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/vendors/font-awesome/fonts/fontawesome-webfont.woff b/vendors/font-awesome/fonts/fontawesome-webfont.woff index c7faa19c..6e7483cf 100644 Binary files a/vendors/font-awesome/fonts/fontawesome-webfont.woff and b/vendors/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/vendors/font-awesome/fonts/fontawesome-webfont.woff2 b/vendors/font-awesome/fonts/fontawesome-webfont.woff2 index cab8571d..7eb74fd1 100644 Binary files a/vendors/font-awesome/fonts/fontawesome-webfont.woff2 and b/vendors/font-awesome/fonts/fontawesome-webfont.woff2 differ diff --git a/vendors/font-awesome/less/font-awesome.less b/vendors/font-awesome/less/font-awesome.less index 76709600..c44e5f46 100644 --- a/vendors/font-awesome/less/font-awesome.less +++ b/vendors/font-awesome/less/font-awesome.less @@ -1,5 +1,5 @@ /*! - * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ diff --git a/vendors/font-awesome/less/icons.less b/vendors/font-awesome/less/icons.less index c5e64309..ba21b222 100644 --- a/vendors/font-awesome/less/icons.less +++ b/vendors/font-awesome/less/icons.less @@ -438,7 +438,7 @@ .@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } .@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } .@{fa-css-prefix}-digg:before { content: @fa-var-digg; } -.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } .@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } .@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } .@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } @@ -488,6 +488,7 @@ .@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } .@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } .@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, .@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } .@{fa-css-prefix}-ge:before, .@{fa-css-prefix}-empire:before { content: @fa-var-empire; } @@ -722,3 +723,11 @@ .@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } .@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } .@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } diff --git a/vendors/font-awesome/less/variables.less b/vendors/font-awesome/less/variables.less index 8118e8f7..2b338197 100644 --- a/vendors/font-awesome/less/variables.less +++ b/vendors/font-awesome/less/variables.less @@ -4,9 +4,9 @@ @fa-font-path: "../fonts"; @fa-font-size-base: 14px; @fa-line-height-base: 1; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.1/fonts"; // for referencing Bootstrap CDN font files directly +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; -@fa-version: "4.6.1"; +@fa-version: "4.6.3"; @fa-border-color: #eee; @fa-inverse: #fff; @fa-li-width: (30em / 14); @@ -240,6 +240,7 @@ @fa-var-eye: "\f06e"; @fa-var-eye-slash: "\f070"; @fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; @fa-var-facebook: "\f09a"; @fa-var-facebook-f: "\f09a"; @fa-var-facebook-official: "\f230"; @@ -274,6 +275,7 @@ @fa-var-fire: "\f06d"; @fa-var-fire-extinguisher: "\f134"; @fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; @fa-var-flag: "\f024"; @fa-var-flag-checkered: "\f11e"; @fa-var-flag-o: "\f11d"; @@ -286,6 +288,7 @@ @fa-var-folder-open: "\f07c"; @fa-var-folder-open-o: "\f115"; @fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; @fa-var-fonticons: "\f280"; @fa-var-fort-awesome: "\f286"; @fa-var-forumbee: "\f211"; @@ -317,6 +320,8 @@ @fa-var-globe: "\f0ac"; @fa-var-google: "\f1a0"; @fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; @fa-var-google-plus-square: "\f0d4"; @fa-var-google-wallet: "\f1ee"; @fa-var-graduation-cap: "\f19d"; @@ -482,8 +487,9 @@ @fa-var-photo: "\f03e"; @fa-var-picture-o: "\f03e"; @fa-var-pie-chart: "\f200"; -@fa-var-pied-piper: "\f1a7"; +@fa-var-pied-piper: "\f2ae"; @fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; @fa-var-pinterest: "\f0d2"; @fa-var-pinterest-p: "\f231"; @fa-var-pinterest-square: "\f0d3"; @@ -522,6 +528,7 @@ @fa-var-repeat: "\f01e"; @fa-var-reply: "\f112"; @fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; @fa-var-retweet: "\f079"; @fa-var-rmb: "\f157"; @fa-var-road: "\f018"; @@ -636,6 +643,7 @@ @fa-var-th: "\f00a"; @fa-var-th-large: "\f009"; @fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; @fa-var-thumb-tack: "\f08d"; @fa-var-thumbs-down: "\f165"; @fa-var-thumbs-o-down: "\f088"; @@ -729,6 +737,7 @@ @fa-var-yc-square: "\f1d4"; @fa-var-yelp: "\f1e9"; @fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; @fa-var-youtube: "\f167"; @fa-var-youtube-play: "\f16a"; @fa-var-youtube-square: "\f166"; diff --git a/vendors/font-awesome/scss/_icons.scss b/vendors/font-awesome/scss/_icons.scss index b64017ae..29443443 100644 --- a/vendors/font-awesome/scss/_icons.scss +++ b/vendors/font-awesome/scss/_icons.scss @@ -438,7 +438,7 @@ .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } -.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } @@ -488,6 +488,7 @@ .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } .#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } .#{$fa-css-prefix}-ge:before, .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } @@ -722,3 +723,11 @@ .#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } .#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } .#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } diff --git a/vendors/font-awesome/scss/_variables.scss b/vendors/font-awesome/scss/_variables.scss index 1f374d6c..a5a89ef9 100644 --- a/vendors/font-awesome/scss/_variables.scss +++ b/vendors/font-awesome/scss/_variables.scss @@ -4,9 +4,9 @@ $fa-font-path: "../fonts" !default; $fa-font-size-base: 14px !default; $fa-line-height-base: 1 !default; -//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.1/fonts" !default; // for referencing Bootstrap CDN font files directly +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts" !default; // for referencing Bootstrap CDN font files directly $fa-css-prefix: fa !default; -$fa-version: "4.6.1" !default; +$fa-version: "4.6.3" !default; $fa-border-color: #eee !default; $fa-inverse: #fff !default; $fa-li-width: (30em / 14) !default; @@ -240,6 +240,7 @@ $fa-var-external-link-square: "\f14c"; $fa-var-eye: "\f06e"; $fa-var-eye-slash: "\f070"; $fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; $fa-var-facebook: "\f09a"; $fa-var-facebook-f: "\f09a"; $fa-var-facebook-official: "\f230"; @@ -274,6 +275,7 @@ $fa-var-filter: "\f0b0"; $fa-var-fire: "\f06d"; $fa-var-fire-extinguisher: "\f134"; $fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; $fa-var-flag: "\f024"; $fa-var-flag-checkered: "\f11e"; $fa-var-flag-o: "\f11d"; @@ -286,6 +288,7 @@ $fa-var-folder-o: "\f114"; $fa-var-folder-open: "\f07c"; $fa-var-folder-open-o: "\f115"; $fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; $fa-var-fonticons: "\f280"; $fa-var-fort-awesome: "\f286"; $fa-var-forumbee: "\f211"; @@ -317,6 +320,8 @@ $fa-var-glide-g: "\f2a6"; $fa-var-globe: "\f0ac"; $fa-var-google: "\f1a0"; $fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; $fa-var-google-plus-square: "\f0d4"; $fa-var-google-wallet: "\f1ee"; $fa-var-graduation-cap: "\f19d"; @@ -482,8 +487,9 @@ $fa-var-phone-square: "\f098"; $fa-var-photo: "\f03e"; $fa-var-picture-o: "\f03e"; $fa-var-pie-chart: "\f200"; -$fa-var-pied-piper: "\f1a7"; +$fa-var-pied-piper: "\f2ae"; $fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; $fa-var-pinterest: "\f0d2"; $fa-var-pinterest-p: "\f231"; $fa-var-pinterest-square: "\f0d3"; @@ -522,6 +528,7 @@ $fa-var-reorder: "\f0c9"; $fa-var-repeat: "\f01e"; $fa-var-reply: "\f112"; $fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; $fa-var-retweet: "\f079"; $fa-var-rmb: "\f157"; $fa-var-road: "\f018"; @@ -636,6 +643,7 @@ $fa-var-text-width: "\f035"; $fa-var-th: "\f00a"; $fa-var-th-large: "\f009"; $fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; $fa-var-thumb-tack: "\f08d"; $fa-var-thumbs-down: "\f165"; $fa-var-thumbs-o-down: "\f088"; @@ -729,6 +737,7 @@ $fa-var-yc: "\f23b"; $fa-var-yc-square: "\f1d4"; $fa-var-yelp: "\f1e9"; $fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; $fa-var-youtube: "\f167"; $fa-var-youtube-play: "\f16a"; $fa-var-youtube-square: "\f166"; diff --git a/vendors/font-awesome/scss/font-awesome.scss b/vendors/font-awesome/scss/font-awesome.scss index a19d664c..2308b14c 100644 --- a/vendors/font-awesome/scss/font-awesome.scss +++ b/vendors/font-awesome/scss/font-awesome.scss @@ -1,5 +1,5 @@ /*! - * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ diff --git a/vendors/fullcalendar/.bower.json b/vendors/fullcalendar/.bower.json index 717d1405..3faadc71 100644 --- a/vendors/fullcalendar/.bower.json +++ b/vendors/fullcalendar/.bower.json @@ -1,7 +1,7 @@ { "name": "fullcalendar", "title": "FullCalendar", - "version": "2.7.1", + "version": "2.7.3", "description": "Full-sized drag & drop event calendar", "keywords": [ "calendar", @@ -48,11 +48,11 @@ "!/CHANGELOG.*", "!/CONTRIBUTING.*" ], - "_release": "2.7.1", + "_release": "2.7.3", "_resolution": { "type": "version", - "tag": "v2.7.1", - "commit": "c0cf46d19d632bf4402ef7198b3619ad63953582" + "tag": "v2.7.3", + "commit": "87dcd3f73c21d91c296830c7589b77c4fc8f386e" }, "_source": "https://github.com/arshaw/fullcalendar.git", "_target": "^2.6.1", diff --git a/vendors/fullcalendar/CHANGELOG.md b/vendors/fullcalendar/CHANGELOG.md index b90afbb7..32559a8a 100644 --- a/vendors/fullcalendar/CHANGELOG.md +++ b/vendors/fullcalendar/CHANGELOG.md @@ -1,4 +1,23 @@ +v2.7.3 (2016-06-02) +------------------- + +internal enhancements that plugins can benefit from: +- EventEmitter not correctly working with stopListeningTo +- normalizeEvent hook for manipulating event data + + +v2.7.2 (2016-05-20) +------------------- + +- fixed desktops/laptops with touch support not accepting mouse events for + dayClick/dragging/resizing (#3154, #3149) +- fixed dayClick incorrectly triggered on touch scroll (#3152) +- fixed touch event dragging wrongfully beginning upon scrolling document (#3160) +- fixed minified JS still contained comments +- UI change: mouse users must hover over an event to reveal its resizers + + v2.7.1 (2016-05-01) ------------------- diff --git a/vendors/fullcalendar/bower.json b/vendors/fullcalendar/bower.json index a4ed0f49..607e453d 100644 --- a/vendors/fullcalendar/bower.json +++ b/vendors/fullcalendar/bower.json @@ -1,7 +1,7 @@ { "name": "fullcalendar", "title": "FullCalendar", - "version": "2.7.1", + "version": "2.7.3", "description": "Full-sized drag & drop event calendar", "keywords": [ "calendar", diff --git a/vendors/fullcalendar/dist/fullcalendar.css b/vendors/fullcalendar/dist/fullcalendar.css index f82f2c48..81e9c1ee 100644 --- a/vendors/fullcalendar/dist/fullcalendar.css +++ b/vendors/fullcalendar/dist/fullcalendar.css @@ -1,5 +1,5 @@ /*! - * FullCalendar v2.7.1 Stylesheet + * FullCalendar v2.7.3 Stylesheet * Docs & License: http://fullcalendar.io/ * (c) 2016 Adam Shaw */ @@ -551,24 +551,19 @@ temporary rendered events). /* resizer (touch devices) */ -.fc-touch .fc-event .fc-resizer { - display: none; /* only show when selected */ +.fc-event .fc-resizer { + display: none; } -.fc-touch .fc-event.fc-selected .fc-resizer { +.fc-event.fc-allow-mouse-resize .fc-resizer, +.fc-event.fc-selected .fc-resizer { + /* only show when hovering or selected (with touch) */ display: block; } +/* hit area */ -/* Hit Area (for events and expander) ---------------------------------------------------------------------------------------------------*/ - -.fc-expander { /* fc-event is already position:relative */ - position: relative; -} - -.fc-touch .fc-expander:before, -.fc-touch .fc-event .fc-resizer:before { +.fc-event.fc-selected .fc-resizer:before { /* 40x40 touch area */ content: ""; position: absolute; @@ -645,9 +640,9 @@ temporary rendered events). right: -1px; /* overcome border */ } -/* resizer (cursor devices) */ +/* resizer (mouse devices) */ -.fc-cursor .fc-h-event .fc-resizer { +.fc-h-event.fc-allow-mouse-resize .fc-resizer { width: 7px; top: -1px; /* overcome top border */ bottom: -1px; /* overcome bottom border */ @@ -655,7 +650,7 @@ temporary rendered events). /* resizer (touch devices) */ -.fc-touch .fc-h-event .fc-resizer { +.fc-h-event.fc-selected .fc-resizer { /* 8x8 little dot */ border-radius: 4px; border-width: 1px; @@ -670,14 +665,14 @@ temporary rendered events). } /* left resizer */ -.fc-touch.fc-ltr .fc-h-event .fc-start-resizer, -.fc-touch.fc-rtl .fc-h-event .fc-end-resizer { +.fc-ltr .fc-h-event.fc-selected .fc-start-resizer, +.fc-rtl .fc-h-event.fc-selected .fc-end-resizer { margin-left: -4px; /* centers the 8x8 dot on the left edge */ } /* right resizer */ -.fc-touch.fc-ltr .fc-h-event .fc-end-resizer, -.fc-touch.fc-rtl .fc-h-event .fc-start-resizer { +.fc-ltr .fc-h-event.fc-selected .fc-end-resizer, +.fc-rtl .fc-h-event.fc-selected .fc-start-resizer { margin-right: -4px; /* centers the 8x8 dot on the right edge */ } @@ -720,14 +715,14 @@ be a descendant of the grid when it is being dragged. /* resizer (cursor devices) */ /* left resizer */ -.fc-cursor.fc-ltr .fc-day-grid-event .fc-start-resizer, -.fc-cursor.fc-rtl .fc-day-grid-event .fc-end-resizer { +.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer, +.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer { margin-left: -2px; /* to the day cell's edge */ } /* right resizer */ -.fc-cursor.fc-ltr .fc-day-grid-event .fc-end-resizer, -.fc-cursor.fc-rtl .fc-day-grid-event .fc-start-resizer { +.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer, +.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer { margin-right: -2px; /* to the day cell's edge */ } @@ -1197,7 +1192,7 @@ be a descendant of the grid when it is being dragged. /* resizer (cursor device) */ -.fc-cursor .fc-time-grid-event .fc-resizer { +.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer { left: 0; right: 0; bottom: 0; @@ -1210,13 +1205,13 @@ be a descendant of the grid when it is being dragged. cursor: s-resize; } -.fc-cursor .fc-time-grid-event .fc-resizer:after { +.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after { content: "="; } /* resizer (touch device) */ -.fc-touch .fc-time-grid-event .fc-resizer { +.fc-time-grid-event.fc-selected .fc-resizer { /* 10x10 dot */ border-radius: 5px; border-width: 1px; diff --git a/vendors/fullcalendar/dist/fullcalendar.js b/vendors/fullcalendar/dist/fullcalendar.js index 9c3e72da..cbe67697 100644 --- a/vendors/fullcalendar/dist/fullcalendar.js +++ b/vendors/fullcalendar/dist/fullcalendar.js @@ -1,5 +1,5 @@ /*! - * FullCalendar v2.7.1 + * FullCalendar v2.7.3 * Docs & License: http://fullcalendar.io/ * (c) 2016 Adam Shaw */ @@ -19,15 +19,12 @@ ;; var FC = $.fullCalendar = { - version: "2.7.1", - internalApiVersion: 3 + version: "2.7.3", + internalApiVersion: 4 }; var fcViews = FC.views = {}; -FC.isTouch = 'ontouchstart' in document; - - $.fn.fullCalendar = function(options) { var args = Array.prototype.slice.call(arguments, 1); // for a possible method call var res = this; // what this function will return (this jQuery object by default) @@ -471,6 +468,30 @@ function preventDefault(ev) { } +// attach a handler to get called when ANY scroll action happens on the page. +// this was impossible to do with normal on/off because 'scroll' doesn't bubble. +// http://stackoverflow.com/a/32954565/96342 +// returns `true` on success. +function bindAnyScroll(handler) { + if (window.addEventListener) { + window.addEventListener('scroll', handler, true); // useCapture=true + return true; + } + return false; +} + + +// undoes bindAnyScroll. must pass in the original function. +// returns `true` on success. +function unbindAnyScroll(handler) { + if (window.removeEventListener) { + window.removeEventListener('scroll', handler, true); // useCapture=true + return true; + } + return false; +} + + /* General Geometry Utils ----------------------------------------------------------------------------------------------------------------------*/ @@ -1839,69 +1860,65 @@ function mixIntoClass(theClass, members) { var EmitterMixin = FC.EmitterMixin = { - callbackHash: null, + // jQuery-ification via $(this) allows a non-DOM object to have + // the same event handling capabilities (including namespaces). - on: function(name, callback) { - this.loopCallbacks(name, 'add', [ callback ]); + on: function(types, handler) { - return this; // for chaining - }, + // handlers are always called with an "event" object as their first param. + // sneak the `this` context and arguments into the extra parameter object + // and forward them on to the original handler. + var intercept = function(ev, extra) { + return handler.apply( + extra.context || this, + extra.args || [] + ); + }; - - off: function(name, callback) { - this.loopCallbacks(name, 'remove', [ callback ]); - - return this; // for chaining - }, - - - trigger: function(name) { // args... - var args = Array.prototype.slice.call(arguments, 1); - - this.triggerWith(name, this, args); - - return this; // for chaining - }, - - - triggerWith: function(name, context, args) { - this.loopCallbacks(name, 'fireWith', [ context, args ]); - - return this; // for chaining - }, - - - /* - Given an event name string with possible namespaces, - call the given methodName on all the internal Callback object with the given arguments. - */ - loopCallbacks: function(name, methodName, args) { - var parts = name.split('.'); // "click.namespace" -> [ "click", "namespace" ] - var i, part; - var callbackObj; - - for (i = 0; i < parts.length; i++) { - part = parts[i]; - if (part) { // in case no event name like "click" - callbackObj = this.ensureCallbackObj((i ? '.' : '') + part); // put periods in front of namespaces - callbackObj[methodName].apply(callbackObj, args); - } + // mimick jQuery's internal "proxy" system (risky, I know) + // causing all functions with the same .guid to appear to be the same. + // https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448 + // this is needed for calling .off with the original non-intercept handler. + if (!handler.guid) { + handler.guid = $.guid++; } + intercept.guid = handler.guid; + + $(this).on(types, intercept); + + return this; // for chaining }, - ensureCallbackObj: function(name) { - if (!this.callbackHash) { - this.callbackHash = {}; - } - if (!this.callbackHash[name]) { - this.callbackHash[name] = $.Callbacks(); - } - return this.callbackHash[name]; + off: function(types, handler) { + $(this).off(types, handler); + + return this; // for chaining + }, + + + trigger: function(types) { + var args = Array.prototype.slice.call(arguments, 1); // arguments after the first + + // pass in "extra" info to the intercept + $(this).triggerHandler(types, { args: args }); + + return this; // for chaining + }, + + + triggerWith: function(types, context, args) { + + // `triggerHandler` is less reliant on the DOM compared to `trigger`. + // pass in "extra" info to the intercept. + $(this).triggerHandler(types, { context: context, args: args }); + + return this; // for chaining } }; + ;; /* @@ -1966,6 +1983,35 @@ var ListenerMixin = FC.ListenerMixin = (function() { })(); ;; +// simple class for toggle a `isIgnoringMouse` flag on delay +// initMouseIgnoring must first be called, with a millisecond delay setting. +var MouseIgnorerMixin = { + + isIgnoringMouse: false, // bool + delayUnignoreMouse: null, // method + + + initMouseIgnoring: function(delay) { + this.delayUnignoreMouse = debounce(proxy(this, 'unignoreMouse'), delay || 1000); + }, + + + // temporarily ignore mouse actions on segments + tempIgnoreMouse: function() { + this.isIgnoringMouse = true; + this.delayUnignoreMouse(); + }, + + + // delayUnignoreMouse eventually calls this + unignoreMouse: function() { + this.isIgnoringMouse = false; + } + +}; + +;; + /* A rectangular panel that is absolutely positioned over other content ------------------------------------------------------------------------------------------------------------------------ Options: @@ -2374,7 +2420,7 @@ var CoordCache = FC.CoordCache = Class.extend({ ----------------------------------------------------------------------------------------------------------------------*/ // TODO: use Emitter -var DragListener = FC.DragListener = Class.extend(ListenerMixin, { +var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMixin, { options: null, @@ -2386,6 +2432,8 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { originX: null, originY: null, + // the wrapping element that scrolls, or MIGHT scroll if there's overflow. + // TODO: do this for wrappers that have overflow:hidden as well. scrollEl: null, isInteracting: false, @@ -2398,9 +2446,13 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { delayTimeoutId: null, minDistance: null, + handleTouchScrollProxy: null, // calls handleTouchScroll, always bound to `this` + constructor: function(options) { this.options = options || {}; + this.handleTouchScrollProxy = proxy(this, 'handleTouchScroll'); + this.initMouseIgnoring(500); }, @@ -2412,7 +2464,10 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { var isTouch = getEvIsTouch(ev); if (ev.type === 'mousedown') { - if (!isPrimaryMouseButton(ev)) { + if (this.isIgnoringMouse) { + return; + } + else if (!isPrimaryMouseButton(ev)) { return; } else { @@ -2454,7 +2509,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { }, - endInteraction: function(ev) { + endInteraction: function(ev, isCancelled) { if (this.isInteracting) { this.endDrag(ev); @@ -2467,13 +2522,20 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { this.unbindHandlers(); this.isInteracting = false; - this.handleInteractionEnd(ev); + this.handleInteractionEnd(ev, isCancelled); + + // a touchstart+touchend on the same element will result in the following addition simulated events: + // mouseover + mouseout + click + // let's ignore these bogus events + if (this.isTouch) { + this.tempIgnoreMouse(); + } } }, - handleInteractionEnd: function(ev) { - this.trigger('interactionEnd', ev); + handleInteractionEnd: function(ev, isCancelled) { + this.trigger('interactionEnd', ev, isCancelled || false); }, @@ -2500,12 +2562,16 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { touchStartIgnores--; // and we don't want this to fire immediately, so ignore. } else { - _this.endInteraction(ev); + _this.endInteraction(ev, true); // isCancelled=true } } }); - if (this.scrollEl) { + // listen to ALL scroll actions on the page + if ( + !bindAnyScroll(this.handleTouchScrollProxy) && // hopefully this works and short-circuits the rest + this.scrollEl // otherwise, attach a single handler to this + ) { this.listenTo(this.scrollEl, 'scroll', this.handleTouchScroll); } } @@ -2526,8 +2592,10 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { unbindHandlers: function() { this.stopListeningTo($(document)); + // unbind scroll listening + unbindAnyScroll(this.handleTouchScrollProxy); if (this.scrollEl) { - this.stopListeningTo(this.scrollEl); + this.stopListeningTo(this.scrollEl, 'scroll'); } }, @@ -2660,7 +2728,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, { // if the drag is being initiated by touch, but a scroll happens before // the drag-initiating delay is over, cancel the drag if (!this.isDragging) { - this.endInteraction(ev); + this.endInteraction(ev, true); // isCancelled=true } }, @@ -3312,7 +3380,7 @@ var MouseFollower = Class.extend(ListenerMixin, { /* An abstract class comprised of a "grid" of areas that each represent a specific datetime ----------------------------------------------------------------------------------------------------------------------*/ -var Grid = FC.Grid = Class.extend(ListenerMixin, { +var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, { view: null, // a View object isRTL: null, // shortcut to the view's isRTL option @@ -3345,6 +3413,9 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, { this.view = view; this.isRTL = view.opt('isRTL'); this.elsByFill = {}; + + this.dayDragListener = this.buildDayDragListener(); + this.initMouseIgnoring(); }, @@ -3480,12 +3551,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, { this.el = el; preventSelection(el); - if (this.view.calendar.isTouch) { - this.bindDayHandler('touchstart', this.dayTouchStart); - } - else { - this.bindDayHandler('mousedown', this.dayMousedown); - } + this.bindDayHandler('touchstart', this.dayTouchStart); + this.bindDayHandler('mousedown', this.dayMousedown); // attach event-element-related handlers. in Grid.events // same garbage collection note as above. @@ -3563,16 +3630,24 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, { // Process a mousedown on an element that represents a day. For day clicking and selecting. dayMousedown: function(ev) { - this.clearDragListeners(); - this.buildDayDragListener().startInteraction(ev, { - //distance: 5, // needs more work if we want dayClick to fire correctly - }); + if (!this.isIgnoringMouse) { + this.dayDragListener.startInteraction(ev, { + //distance: 5, // needs more work if we want dayClick to fire correctly + }); + } }, dayTouchStart: function(ev) { - this.clearDragListeners(); - this.buildDayDragListener().startInteraction(ev, { + var view = this.view; + + // HACK to prevent a user's clickaway for unselecting a range or an event + // from causing a dayClick. + if (view.isSelected || view.selectedEvent) { + this.tempIgnoreMouse(); + } + + this.dayDragListener.startInteraction(ev, { delay: this.view.opt('longPressDelay') }); }, @@ -3590,10 +3665,10 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, { // this listener tracks a mousedown on a day element, and a subsequent drag. // if the drag ends on the same day, it is a 'dayClick'. // if 'selectable' is enabled, this listener also detects selections. - var dragListener = this.dayDragListener = new HitDragListener(this, { + var dragListener = new HitDragListener(this, { scroll: view.opt('dragScroll'), interactionStart: function() { - dayClickHit = dragListener.origHit; + dayClickHit = dragListener.origHit; // for dayClick, where no dragging happens }, dragStart: function() { view.unselect(); // since we could be rendering a new selection, we want to clear any old one @@ -3626,20 +3701,24 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, { _this.unrenderSelection(); enableCursor(); }, - interactionEnd: function(ev) { - if (dayClickHit) { - view.triggerDayClick( - _this.getHitSpan(dayClickHit), - _this.getHitEl(dayClickHit), - ev - ); + interactionEnd: function(ev, isCancelled) { + if (!isCancelled) { + if ( + dayClickHit && + !_this.isIgnoringMouse // see hack in dayTouchStart + ) { + view.triggerDayClick( + _this.getHitSpan(dayClickHit), + _this.getHitEl(dayClickHit), + ev + ); + } + if (selectionSpan) { + // the selection will already have been rendered. just report it + view.reportSelection(selectionSpan, ev); + } + enableCursor(); } - if (selectionSpan) { - // the selection will already have been rendered. just report it - view.reportSelection(selectionSpan, ev); - } - enableCursor(); - _this.dayDragListener = null; } }); @@ -3651,9 +3730,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, { // Useful for when public API methods that result in re-rendering are invoked during a drag. // Also useful for when touch devices misbehave and don't fire their touchend. clearDragListeners: function() { - if (this.dayDragListener) { - this.dayDragListener.endInteraction(); // will clear this.dayDragListener - } + this.dayDragListener.endInteraction(); + if (this.segDragListener) { this.segDragListener.endInteraction(); // will clear this.segDragListener } @@ -4113,15 +4191,11 @@ Grid.mixin({ // Attaches event-element-related handlers to the container element and leverage bubbling bindSegHandlers: function() { - if (this.view.calendar.isTouch) { - this.bindSegHandler('touchstart', this.handleSegTouchStart); - } - else { - this.bindSegHandler('mouseenter', this.handleSegMouseover); - this.bindSegHandler('mouseleave', this.handleSegMouseout); - this.bindSegHandler('mousedown', this.handleSegMousedown); - } - + this.bindSegHandler('touchstart', this.handleSegTouchStart); + this.bindSegHandler('touchend', this.handleSegTouchEnd); + this.bindSegHandler('mouseenter', this.handleSegMouseover); + this.bindSegHandler('mouseleave', this.handleSegMouseout); + this.bindSegHandler('mousedown', this.handleSegMousedown); this.bindSegHandler('click', this.handleSegClick); }, @@ -4149,8 +4223,12 @@ Grid.mixin({ // Updates internal state and triggers handlers for when an event element is moused over handleSegMouseover: function(seg, ev) { - if (!this.mousedOverSeg) { + if ( + !this.isIgnoringMouse && + !this.mousedOverSeg + ) { this.mousedOverSeg = seg; + seg.el.addClass('fc-allow-mouse-resize'); this.view.trigger('eventMouseover', seg.el[0], seg.event, ev); } }, @@ -4164,11 +4242,24 @@ Grid.mixin({ if (this.mousedOverSeg) { seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment this.mousedOverSeg = null; + seg.el.removeClass('fc-allow-mouse-resize'); this.view.trigger('eventMouseout', seg.el[0], seg.event, ev); } }, + handleSegMousedown: function(seg, ev) { + var isResizing = this.startSegResize(seg, ev, { distance: 5 }); + + if (!isResizing && this.view.isEventDraggable(seg.event)) { + this.buildSegDragListener(seg) + .startInteraction(ev, { + distance: 5 + }); + } + }, + + handleSegTouchStart: function(seg, ev) { var view = this.view; var event = seg.event; @@ -4184,37 +4275,25 @@ Grid.mixin({ } if (!isResizing && (isDraggable || isResizable)) { // allowed to be selected? - this.clearDragListeners(); dragListener = isDraggable ? this.buildSegDragListener(seg) : - new DragListener(); // seg isn't draggable, but let's use a generic DragListener - // simply for the delay, so it can be selected. + this.buildSegSelectListener(seg); // seg isn't draggable, but still needs to be selected - dragListener._dragStart = function() { // TODO: better way of binding - // if not previously selected, will fire after a delay. then, select the event - if (!isSelected) { - view.selectEvent(event); - } - }; - - dragListener.startInteraction(ev, { + dragListener.startInteraction(ev, { // won't start if already started delay: isSelected ? 0 : this.view.opt('longPressDelay') // do delay if not already selected }); } + + // a long tap simulates a mouseover. ignore this bogus mouseover. + this.tempIgnoreMouse(); }, - handleSegMousedown: function(seg, ev) { - var isResizing = this.startSegResize(seg, ev, { distance: 5 }); - - if (!isResizing && this.view.isEventDraggable(seg.event)) { - this.clearDragListeners(); - this.buildSegDragListener(seg) - .startInteraction(ev, { - distance: 5 - }); - } + handleSegTouchEnd: function(seg, ev) { + // touchstart+touchend = click, which simulates a mouseover. + // ignore this bogus mouseover. + this.tempIgnoreMouse(); }, @@ -4223,7 +4302,6 @@ Grid.mixin({ // `dragOptions` are optional. startSegResize: function(seg, ev, dragOptions) { if ($(ev.target).is('.fc-resizer')) { - this.clearDragListeners(); this.buildSegResizeListener(seg, $(ev.target).is('.fc-start-resizer')) .startInteraction(ev, dragOptions); return true; @@ -4239,6 +4317,7 @@ Grid.mixin({ // Builds a listener that will track user-dragging on an event segment. // Generic enough to work with any type of Grid. + // Has side effect of setting/unsetting `segDragListener` buildSegDragListener: function(seg) { var _this = this; var view = this.view; @@ -4249,6 +4328,10 @@ Grid.mixin({ var mouseFollower; // A clone of the original element that will move with the mouse var dropLocation; // zoned event date properties + if (this.segDragListener) { + return this.segDragListener; + } + // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents // of the view. var dragListener = this.segDragListener = new HitDragListener(view, { @@ -4268,6 +4351,10 @@ Grid.mixin({ mouseFollower.start(ev); }, dragStart: function(ev) { + if (dragListener.isTouch && !view.isEventSelected(event)) { + // if not previously selected, will fire after a delay. then, select the event + view.selectEvent(event); + } isDragging = true; _this.handleSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported _this.segDragStart(seg, ev); @@ -4339,6 +4426,34 @@ Grid.mixin({ }, + // seg isn't draggable, but let's use a generic DragListener + // simply for the delay, so it can be selected. + // Has side effect of setting/unsetting `segDragListener` + buildSegSelectListener: function(seg) { + var _this = this; + var view = this.view; + var event = seg.event; + + if (this.segDragListener) { + return this.segDragListener; + } + + var dragListener = this.segDragListener = new DragListener({ + dragStart: function(ev) { + if (dragListener.isTouch && !view.isEventSelected(event)) { + // if not previously selected, will fire after a delay. then, select the event + view.selectEvent(event); + } + }, + interactionEnd: function(ev) { + _this.segDragListener = null; + } + }); + + return dragListener; + }, + + // Called before event segment dragging starts segDragStart: function(seg, ev) { this.isDraggingSeg = true; @@ -8100,8 +8215,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, { // Binds DOM handlers to elements that reside outside the view container, such as the document bindGlobalHandlers: function() { this.listenTo($(document), 'mousedown', this.handleDocumentMousedown); - this.listenTo($(document), 'touchstart', this.handleDocumentTouchStart); - this.listenTo($(document), 'touchend', this.handleDocumentTouchEnd); + this.listenTo($(document), 'touchstart', this.processUnselect); }, @@ -8662,25 +8776,18 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, { /* Mouse / Touch Unselecting (time range & event unselection) ------------------------------------------------------------------------------------------------------------------*/ // TODO: move consistently to down/start or up/end? + // TODO: don't kill previous selection if touch scrolling handleDocumentMousedown: function(ev) { - // touch devices fire simulated mouse events on a "click". - // only process mousedown if we know this isn't a touch device. - if (!this.calendar.isTouch && isPrimaryMouseButton(ev)) { - this.processRangeUnselect(ev); - this.processEventUnselect(ev); + if (isPrimaryMouseButton(ev)) { + this.processUnselect(ev); } }, - handleDocumentTouchStart: function(ev) { + processUnselect: function(ev) { this.processRangeUnselect(ev); - }, - - - handleDocumentTouchEnd: function(ev) { - // TODO: don't do this if because of touch-scrolling this.processEventUnselect(ev); }, @@ -8953,7 +9060,6 @@ var Calendar = FC.Calendar = Class.extend({ view: null, // current View object header: null, loadingLevel: 0, // number of simultaneous loading tasks - isTouch: false, // a lot of this class' OOP logic is scoped within this constructor function, @@ -9000,10 +9106,6 @@ var Calendar = FC.Calendar = Class.extend({ ]); populateInstanceComputableOptions(this.options); - this.isTouch = this.options.isTouch != null ? - this.options.isTouch : - FC.isTouch; - this.viewSpecCache = {}; // somewhat unrelated }, @@ -9460,10 +9562,6 @@ function Calendar_constructor(element, overrides) { tm = options.theme ? 'ui' : 'fc'; element.addClass('fc'); - element.addClass( - t.isTouch ? 'fc-touch' : 'fc-cursor' - ); - if (options.isRTL) { element.addClass('fc-rtl'); } @@ -9506,7 +9604,7 @@ function Calendar_constructor(element, overrides) { header.removeElement(); content.remove(); - element.removeClass('fc fc-touch fc-cursor fc-ltr fc-rtl fc-unthemed ui-widget'); + element.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget'); if (windowResizeProxy) { $(window).unbind('resize', windowResizeProxy); @@ -10968,6 +11066,8 @@ function EventManager(options) { // assumed to be a calendar assignDatesToEvent(start, end, allDay, out); } + t.normalizeEvent(out); // hook for external use. a prototype method + return out; } @@ -11500,6 +11600,12 @@ function EventManager(options) { // assumed to be a calendar } +// hook for external libs to manipulate event properties upon creation. +// should manipulate the event in-place. +Calendar.prototype.normalizeEvent = function(event) { +}; + + // Returns a list of events that the given event should be compared against when being considered for a move to // the specified span. Attached to the Calendar's prototype because EventManager is a mixin for a Calendar. Calendar.prototype.getPeerEvents = function(span, event) { diff --git a/vendors/fullcalendar/dist/fullcalendar.min.css b/vendors/fullcalendar/dist/fullcalendar.min.css index 94120eca..3a251eb1 100644 --- a/vendors/fullcalendar/dist/fullcalendar.min.css +++ b/vendors/fullcalendar/dist/fullcalendar.min.css @@ -1,5 +1,5 @@ /*! - * FullCalendar v2.7.1 Stylesheet + * FullCalendar v2.7.3 Stylesheet * Docs & License: http://fullcalendar.io/ * (c) 2016 Adam Shaw - */.fc-bgevent,.fc-highlight{opacity:.3;filter:alpha(opacity=30)}.fc-icon,body .fc{font-size:1em}.fc-button-group,.fc-icon{display:inline-block}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-icon,.fc-unselectable{-khtml-user-select:none;-webkit-touch-callout:none}.fc .fc-axis,.fc button,.fc-time-grid-event .fc-time,.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}.fc th,.fc-basic-view .fc-week-number,.fc-icon,.fc-toolbar{text-align:center}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.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{background:#bce8f1}.fc-bgevent{background:#8fdf82}.fc-nonbusiness{background:#d7d7d7}.fc-icon{height:1em;line-height:1em;overflow:hidden;font-family:"Courier New",Courier,monospace;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\000AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\000BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\000D7";font-size:200%;top:6%}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close{cursor:pointer}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.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-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-row.fc-rigid,.fc-time-grid-event{overflow:hidden}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4}.fc-touch .fc-event .fc-resizer{display:none}.fc-touch .fc-event.fc-selected .fc-resizer{display:block}.fc-expander{position:relative}.fc-touch .fc-event .fc-resizer:before,.fc-touch .fc-expander:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-cursor .fc-h-event .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-touch .fc-h-event .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-touch.fc-ltr .fc-h-event .fc-start-resizer,.fc-touch.fc-rtl .fc-h-event .fc-end-resizer{margin-left:-4px}.fc-touch.fc-ltr .fc-h-event .fc-end-resizer,.fc-touch.fc-rtl .fc-h-event .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25;filter:alpha(opacity=25)}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-cursor.fc-ltr .fc-day-grid-event .fc-start-resizer,.fc-cursor.fc-rtl .fc-day-grid-event .fc-end-resizer{margin-left:-2px}.fc-cursor.fc-ltr .fc-day-grid-event .fc-end-resizer,.fc-cursor.fc-rtl .fc-day-grid-event .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fc-toolbar{margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.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}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number span{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:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-cursor .fc-time-grid-event .fc-resizer{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-cursor .fc-time-grid-event .fc-resizer:after{content:"="}.fc-touch .fc-time-grid-event .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent} \ No newline at end of file + */.fc-bgevent,.fc-highlight{opacity:.3;filter:alpha(opacity=30)}.fc-icon,body .fc{font-size:1em}.fc-button-group,.fc-icon{display:inline-block}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-icon,.fc-unselectable{-khtml-user-select:none;-webkit-touch-callout:none}.fc .fc-axis,.fc button,.fc-time-grid-event .fc-time,.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}.fc th,.fc-basic-view .fc-week-number,.fc-icon,.fc-toolbar{text-align:center}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.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{background:#bce8f1}.fc-bgevent{background:#8fdf82}.fc-nonbusiness{background:#d7d7d7}.fc-icon{height:1em;line-height:1em;overflow:hidden;font-family:"Courier New",Courier,monospace;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\000AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\000BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\000D7";font-size:200%;top:6%}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close{cursor:pointer}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.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-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-row.fc-rigid,.fc-time-grid-event{overflow:hidden}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25;filter:alpha(opacity=25)}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fc-toolbar{margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.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}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number span{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:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{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-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent} \ No newline at end of file diff --git a/vendors/fullcalendar/dist/fullcalendar.min.js b/vendors/fullcalendar/dist/fullcalendar.min.js index fe0d597a..f2738022 100644 --- a/vendors/fullcalendar/dist/fullcalendar.min.js +++ b/vendors/fullcalendar/dist/fullcalendar.min.js @@ -1,2482 +1,9 @@ /*! - * FullCalendar v2.7.1 + * FullCalendar v2.7.3 * Docs & License: http://fullcalendar.io/ * (c) 2016 Adam Shaw */ -!function(a){"function"==typeof define&&define.amd?define(["jquery","moment"],a):"object"==typeof exports?// Node/CommonJS -module.exports=a(require("jquery"),require("moment")):a(jQuery,moment)}(function(a,b){ -// Merges an array of option objects into a single object -function c(a){return U(a,Va)} -// Given options specified for the calendar's constructor, massages any legacy options into a non-legacy form. -// Converts View-Option-Hashes into the View-Specific-Options format. -function d(b){var c,d={views:b.views||{}}; -// iterate through all option override properties (except `views`) -return a.each(b,function(b,e){"views"!=b&&( -// could the value be a legacy View-Option-Hash? -a.isPlainObject(e)&&!/(time|duration|interval)$/i.test(b)&&-1==a.inArray(b,Va)?(c=null,a.each(e,function(a,e){/^(month|week|day|default|basic(Week|Day)?|agenda(Week|Day)?)$/.test(a)?(d.views[a]||(d.views[a]={}),d.views[a][b]=e):(c||(c={}),c[a]=e)}),c&&(d[b]=c)):d[b]=e)}),d}/* FullCalendar-specific DOM Utilities -----------------------------------------------------------------------------------------------------------------------*/ -// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left -// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that. -function e(a,b){b.left&&a.css({"border-left-width":1,"margin-left":b.left-1}),b.right&&a.css({"border-right-width":1,"margin-right":b.right-1})} -// Undoes compensateScroll and restores all borders/margins -function f(a){a.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})} -// Make the mouse cursor express that an event is not allowed in the current area -function g(){a("body").addClass("fc-not-allowed")} -// Returns the mouse cursor to its original look -function h(){a("body").removeClass("fc-not-allowed")} -// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate. -// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering -// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and -// reduces the available height. -function i(b,c,d){ -// *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions, -// and it is better to be shorter than taller, to avoid creating unnecessary scrollbars. -var e=Math.floor(c/b.length),f=Math.floor(c-e*(b.length-1)),g=[],h=[],i=[],k=0;j(b),// give all elements their natural height -// find elements that are below the recommended height (expandable). -// important to query for heights in a single first pass (to avoid reflow oscillation). -b.each(function(c,d){var j=c===b.length-1?f:e,l=a(d).outerHeight(!0);j>l?(g.push(d),h.push(l),i.push(a(d).height())): -// this element stretches past recommended height (non-expandable). mark the space as occupied. -k+=l}), -// readjust the recommended height to only consider the height available to non-maxed-out rows. -d&&(c-=k,e=Math.floor(c/g.length),f=Math.floor(c-e*(g.length-1))), -// assign heights to all expandable elements -a(g).each(function(b,c){var d=b===g.length-1?f:e,j=h[b],k=i[b],l=d-(j-k);// subtract the margin/padding -d>j&&// we check this again because redistribution might have changed things -a(c).height(l)})} -// Undoes distrubuteHeight, restoring all els to their natural height -function j(a){a.height("")} -// Given `els`, a jQuery set of cells, find the cell with the largest natural width and set the widths of all the -// cells to be that width. -// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline -function k(b){var c=0;// sometimes not accurate of width the text needs to stay on one line. insurance -return b.find("> span").each(function(b,d){var e=a(d).outerWidth();e>c&&(c=e)}),c++,b.width(c),c} -// Given one element that resides inside another, -// Subtracts the height of the inner element from the outer element. -function l(a,b){var c,d=a.add(b);// undo hack -// effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked -// grab the dimensions -return d.css({position:"relative",// cause a reflow, which will force fresh dimension recalculation -left:-1}),c=a.outerHeight()-b.outerHeight(),d.css({position:"",left:""}),c} -// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51 -function m(b){var c=b.css("position"),d=b.parents().filter(function(){var b=a(this);return/(auto|scroll)/.test(b.css("overflow")+b.css("overflow-y")+b.css("overflow-x"))}).eq(0);return"fixed"!==c&&d.length?d:a(b[0].ownerDocument||document)} -// Queries the outer bounding area of a jQuery element. -// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive). -// Origin is optional. -function n(a,b){var c=a.offset(),d=c.left-(b?b.left:0),e=c.top-(b?b.top:0);return{left:d,right:d+a.outerWidth(),top:e,bottom:e+a.outerHeight()}} -// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding. -// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive). -// Origin is optional. -// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser. -function o(a,b){var c=a.offset(),d=q(a),e=c.left+t(a,"border-left-width")+d.left-(b?b.left:0),f=c.top+t(a,"border-top-width")+d.top-(b?b.top:0);return{left:e,right:e+a[0].clientWidth,// clientWidth includes padding but NOT scrollbars -top:f,bottom:f+a[0].clientHeight}} -// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars. -// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive). -// Origin is optional. -function p(a,b){var c=a.offset(),d=c.left+t(a,"border-left-width")+t(a,"padding-left")-(b?b.left:0),e=c.top+t(a,"border-top-width")+t(a,"padding-top")-(b?b.top:0);return{left:d,right:d+a.width(),top:e,bottom:e+a.height()}} -// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element. -// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser. -function q(a){var b=a.innerWidth()-a[0].clientWidth,c={left:0,right:0,top:0,bottom:a.innerHeight()-a[0].clientHeight};// is the scrollbar on the left side? -return r()&&"rtl"==a.css("direction")?c.left=b:c.right=b,c}function r(){// responsible for caching the computation -return null===Wa&&(Wa=s()),Wa}function s(){// creates an offscreen test element, then removes it -var b=a("
    ").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),c=b.children(),d=c.offset().left>b.offset().left;// is the inner div shifted to accommodate a left scrollbar? -return b.remove(),d} -// Retrieves a jQuery element's computed CSS value as a floating-point number. -// If the queried value is non-numeric (ex: IE can return "medium" for border width), will just return zero. -function t(a,b){return parseFloat(a.css(b))||0} -// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) -function u(a){return 1==a.which&&!a.ctrlKey}function v(a){if(void 0!==a.pageX)return a.pageX;var b=a.originalEvent.touches;return b?b[0].pageX:void 0}function w(a){if(void 0!==a.pageY)return a.pageY;var b=a.originalEvent.touches;return b?b[0].pageY:void 0}function x(a){return/^touch/.test(a.type)}function y(a){a.addClass("fc-unselectable").on("selectstart",z)} -// Stops a mouse/touch event from doing it's native browser action -function z(a){a.preventDefault()} -// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false -function A(a,b){var c={left:Math.max(a.left,b.left),right:Math.min(a.right,b.right),top:Math.max(a.top,b.top),bottom:Math.min(a.bottom,b.bottom)};return c.lefti&&j>g?(g>=i?(c=g.clone(),e=!0):(c=i.clone(),e=!1),j>=h?(d=h.clone(),f=!0):(d=j.clone(),f=!1),{start:c,end:d,isStart:e,isEnd:f}):void 0} -// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time. -// Moments will have their timezones normalized. -function J(a,c){return b.duration({days:a.clone().stripTime().diff(c.clone().stripTime(),"days"),ms:a.time()-c.time()})} -// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations. -function K(a,c){return b.duration({days:a.clone().stripTime().diff(c.clone().stripTime(),"days")})} -// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding. -function L(a,c,d){// returnFloat=true -return b.duration(Math.round(a.diff(c,d,!0)),d)} -// Computes the unit name of the largest whole-unit period of time. -// For example, 48 hours will be "days" whereas 49 hours will be "hours". -// Accepts start/end, a range object, or an original duration object. -function M(a,b){var c,d,e;for(c=0;c=1&&fa(e)));c++);return d} -// Computes the number of units (like "hours") in the given range. -// Range can be a {start,end} object, separate start/end args, or a Duration. -// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling -// of month-diffing logic (which tends to vary from version to version). -function N(a,c,d){return null!=d?d.diff(c,a,!0):b.isDuration(c)?c.as(a):c.end.diff(c.start,a,!0)} -// Intelligently divides a range (specified by a start/end params) by a duration -function O(a,b,c){var d;return R(c)?(b-a)/c:(d=c.asMonths(),Math.abs(d)>=1&&fa(d)?b.diff(a,"months",!0)/d:b.diff(a,"days",!0)/c.asDays())} -// Intelligently divides one duration by another -function P(a,b){var c,d;return R(a)||R(b)?a/b:(c=a.asMonths(),d=b.asMonths(),Math.abs(c)>=1&&fa(c)&&Math.abs(d)>=1&&fa(d)?c/d:a.asDays()/b.asDays())} -// Intelligently multiplies a duration by a number -function Q(a,c){var d;return R(a)?b.duration(a*c):(d=a.asMonths(),Math.abs(d)>=1&&fa(d)?b.duration({months:d*c}):b.duration({days:a.asDays()*c}))} -// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms) -function R(a){return Boolean(a.hours()||a.minutes()||a.seconds()||a.milliseconds())}function S(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date} -// Returns a boolean about whether the given input is a time string, like "06:40:00" or "06:00" -function T(a){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(a)} -// Merges an array of objects into a single object. -// The second argument allows for an array of property names who's object values will be merged together. -function U(a,b){var c,d,e,f,g,h,i={};if(b)for(c=0;c=0;f--)if(g=a[f][d],"object"==typeof g)e.unshift(g);else if(void 0!==g){i[d]=g;// if there were no objects, this value will be used -break} -// if the trailing values were objects, use the merged value -e.length&&(i[d]=U(e))} -// copy values into the destination, going from last to first -for(c=a.length-1;c>=0;c--){h=a[c];for(d in h)d in i||(// if already assigned by previous props or complex props, don't reassign -i[d]=h[d])}return i} -// Create an object that has the given prototype. Just like Object.create -function V(a){var b=function(){};return b.prototype=a,new b}function W(a,b){for(var c in a)Y(a,c)&&(b[c]=a[c])} -// Copies over certain methods with the same names as Object.prototype methods. Overcomes an IE<=8 bug: -// https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug -function X(a,b){var c,d,e=["constructor","toString","valueOf"];for(c=0;c/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
    ")}function ba(a){return a.replace(/&.*?;/g,"")} -// Given a hash of CSS properties, returns a string of CSS. -// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values. -function ca(b){var c=[];return a.each(b,function(a,b){null!=b&&c.push(a+":"+b)}),c.join(";")}function da(a){return a.charAt(0).toUpperCase()+a.slice(1)}function ea(a,b){// for .sort() -return a-b}function fa(a){return a%1===0} -// Returns a method bound to the given object context. -// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with -// different contexts as identical when binding/unbinding events. -function ga(a,b){var c=a[b];return function(){return c.apply(a,arguments)}} -// Returns a function, that, as long as it continues to be invoked, will not -// be triggered. The function will be called after it stops being called for -// N milliseconds. If `immediate` is passed, trigger the function on the -// leading edge, instead of the trailing. -// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 -function ha(a,b,c){var d,e,f,g,h,i=function(){var j=+new Date-g;b>j?d=setTimeout(i,b-j):(d=null,c||(h=a.apply(f,e),f=e=null))};return function(){f=this,e=arguments,g=+new Date;var j=c&&!d;return d||(d=setTimeout(i,b)),j&&(h=a.apply(f,e),f=e=null),h}} -// Builds an enhanced moment from args. When given an existing moment, it clones. When given a -// native Date, or called with no arguments (the current time), the resulting moment will be local. -// Anything else needs to be "parsed" (a string or an array), and will be affected by: -// parseAsUTC - if there is no zone information, should we parse the input in UTC? -// parseZone - if there is zone information, should we force the zone of the moment? -function ia(c,d,e){var f,g,h,i,j=c[0],k=1==c.length&&"string"==typeof j;// flag for extended functionality -// clone it -// "parsing" is required -// accept strings like '2014-05', but convert to the first of the month -// for when we pass it on to moment's constructor -// no time part? -// arrays have no timezone information, so assume ambiguous zone -// otherwise, probably a string with a format -// let's record the inputted zone somehow -return b.isMoment(j)?(i=b.apply(null,c),ka(j,i)):S(j)||void 0===j?i=b.apply(null,c):(f=!1,g=!1,k?bb.test(j)?(j+="-01",c=[j],f=!0,g=!0):(h=cb.exec(j))&&(f=!h[5],g=!0):a.isArray(j)&&(g=!0),i=d||f?b.utc.apply(b,c):b.apply(null,c),f?(i._ambigTime=!0,i._ambigZone=!0):e&&(g?i._ambigZone=!0:k&&(i.utcOffset?i.utcOffset(j):i.zone(j)))),i._fullCalendar=!0,i} -// Misc Internals -// ------------------------------------------------------------------------------------------------- -// given an array of moment-like inputs, return a parallel array w/ moments similarly ambiguated. -// for example, of one moment has ambig time, but not others, all moments will have their time stripped. -// set `preserveTime` to `true` to keep times, but only normalize zone ambiguity. -// returns the original moments if no modifications are necessary. -function ja(a,c){var d,e,f=!1,g=!1,h=a.length,i=[]; -// parse inputs into real moments and query their ambig flags -for(d=0;h>d;d++)e=a[d],b.isMoment(e)||(e=Ta.moment.parseZone(e)),f=f||e._ambigTime,g=g||e._ambigZone,i.push(e); -// strip each moment down to lowest common ambiguity -// use clones to avoid modifying the original moments -for(d=0;h>d;d++)e=i[d],c||!f||e._ambigTime?g&&!e._ambigZone&&(i[d]=e.clone().stripZone()):i[d]=e.clone().stripTime();return i} -// Transfers all the flags related to ambiguous time/zone from the `src` moment to the `dest` moment -// TODO: look into moment.momentProperties for this. -function ka(a,b){a._ambigTime?b._ambigTime=!0:b._ambigTime&&(b._ambigTime=!1),a._ambigZone?b._ambigZone=!0:b._ambigZone&&(b._ambigZone=!1)} -// Sets the year/month/date/etc values of the moment from the given array. -// Inefficient because it calls each individual setter. -function la(a,b){a.year(b[0]||0).month(b[1]||0).date(b[2]||0).hours(b[3]||0).minutes(b[4]||0).seconds(b[5]||0).milliseconds(b[6]||0)} -// Single Date Formatting -// ------------------------------------------------------------------------------------------------- -// call this if you want Moment's original format method to be used -function ma(a,b){return eb.format.call(a,b)} -// Formats `date` with a Moment formatting string, but allow our non-zero areas and -// additional token. -function na(a,b){return oa(a,ta(b))}function oa(a,b){var c,d="";for(c=0;c "MMMM D YYYY" -// BTW, this is not important for `formatDate` because it is impossible to put custom tokens -// or non-zero areas in Moment's localized format strings. -return a=Ta.moment.parseZone(a),b=Ta.moment.parseZone(b),f=(a.localeData||a.lang).call(a),c=f.longDateFormat(c)||c,d=d||" - ",ra(a,b,ta(c),d,e)}// expose -function ra(a,b,c,d,e){var f,g,h,i,j=a.clone().stripZone(),k=b.clone().stripZone(),l="",m="",n="",o="",p=""; -// Start at the leftmost side of the formatting string and continue until you hit a token -// that is not the same between dates. -for(g=0;gg&&(f=sa(a,b,j,k,c[h]),f!==!1);h--)m=f+m; -// The area in the middle is different for both of the dates. -// Collect them distinctly so we can jam them together later. -for(i=g;h>=i;i++)n+=pa(a,c[i]),o+=pa(b,c[i]);return(n||o)&&(p=e?o+d+n:n+d+o),l+p+m} -// TODO: week maybe? -// Given a formatting chunk, and given that both dates are similar in the regard the -// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`. -function sa(a,b,c,d,e){var f,g;return"string"==typeof e?e:(f=e.token)&&(g=gb[f.charAt(0)],g&&c.isSame(d,g))?ma(a,f):!1}function ta(a){return a in hb?hb[a]:hb[a]=ua(a)} -// Break the formatting string into an array of chunks -function ua(a){for(var b,c=[],d=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;b=d.exec(a);)b[1]?// a literal string inside [ ... ] -c.push(b[1]):b[2]?// non-zero formatting inside ( ... ) -c.push({maybe:ua(b[2])}):b[3]?// a formatting token -c.push({token:b[3]}):b[5]&&// an unenclosed literal string -c.push(b[5]);return c}// export -// Class that all other classes will inherit from -function va(){}function wa(a,b){var c; -// ensure a constructor for the subclass, forwarding all arguments to the super-constructor if it doesn't exist -// build the base prototype for the subclass, which is an new object chained to the superclass's prototype -// copy each member variable/method onto the the subclass's prototype -// hack for IE8 -// copy over all class variables/methods to the subclass, such as `extend` and `mixin` -return Y(b,"constructor")&&(c=b.constructor),"function"!=typeof c&&(c=b.constructor=function(){a.apply(this,arguments)}),c.prototype=V(a.prototype),W(b,c.prototype),X(b,c.prototype),W(a,c),c}function xa(a,b){W(b,a.prototype)} -// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component. -// Two null values will be considered equal, as two "out of the component" states are the same. -function ya(a,b){return a||b?a&&b?a.component===b.component&&za(a,b)&&za(b,a):!1:!0} -// Returns true if all of subHit's non-standard properties are within superHit -function za(a,b){for(var c in a)if(!/^(component|left|right|top|bottom)$/.test(c)&&a[c]!==b[c])return!1;return!0}/* Utilities -----------------------------------------------------------------------------------------------------------------------*/ -function Aa(a){// returns true if background OR inverse-background -var b=Ca(a);return"background"===b||"inverse-background"===b}// export -function Ba(a){return"inverse-background"===Ca(a)}function Ca(a){return _((a.source||{}).rendering,a.rendering)}function Da(a){var b,c,d={};for(b=0;b=a.leftCol)return!0;return!1} -// A cmp function for determining the leftmost event -function Ha(a,b){return a.leftCol-b.leftCol} -// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is -// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date. -function Ia(a){var b,c,d,e=[];for(b=0;bb.top&&a.top").prependTo(c),R=N.header=new Qa(N,O),S=R.render(),S&&c.prepend(S),i(O.defaultView),O.handleWindowResize&&(Y=ha(m,O.windowResizeDelay),a(window).resize(Y))}function g(){W&&W.removeElement(),R.removeElement(),T.remove(),c.removeClass("fc fc-touch fc-cursor fc-ltr fc-rtl fc-unthemed ui-widget"),Y&&a(window).unbind("resize",Y)}function h(){return c.is(":visible")} -// View Rendering -// ----------------------------------------------------------------------------------- -// Renders a view because of a date change, view-type change, or for the first time. -// If not given a viewType, keep the current view but render different dates. -function i(b){ca++, -// if viewType is changing, remove the old view's rendering -W&&b&&W.type!==b&&(R.deactivateButton(W.type),H(),// prevent a scroll jump when view element is removed -W.removeElement(),W=N.view=null), -// if viewType changed, or the view was never created, create a fresh view -!W&&b&&(W=N.view=ba[b]||(ba[b]=N.instantiateView(b)),W.setElement(a("
    ").appendTo(T)),R.activateButton(b)),W&&(Z=W.massageCurrentDate(Z),W.displaying&&Z.isWithin(W.intervalStart,W.intervalEnd)||h()&&(W.display(Z),I(),u(),v(),q())),I(),// undo any lone freezeContentHeight calls -ca--}function j(a){// isResize=true. will poll getSuggestedViewHeight() and isHeightAuto() -return h()?(a&&l(),ca++,W.updateSize(!0),ca--,!0):void 0}function k(){h()&&l()}function l(){// assumes elementVisible -X="number"==typeof O.contentHeight?O.contentHeight:"number"==typeof O.height?O.height-(S?S.outerHeight(!0):0):Math.round(T.width()/Math.max(O.aspectRatio,.5))}function m(a){!ca&&a.target===window&&W.start&&j(!0)&&W.trigger("windowResize",aa)}/* Event Fetching/Rendering - -----------------------------------------------------------------------------*/ -// TODO: going forward, most of this stuff should be directly handled by the view -function n(){// can be called as an API method -p(),// so that events are cleared before user starts waiting for AJAX -r()}function o(){// destroys old events if previously rendered -h()&&(H(),W.displayEvents(da),I())}function p(){H(),W.clearEvents(),I()}function q(){!O.lazyFetching||$(W.start,W.end)?r():o()}function r(){_(W.start,W.end)} -// called when event data arrives -function s(a){da=a,o()} -// called when a single event's data has been changed -function t(){o()}/* Header Updating - -----------------------------------------------------------------------------*/ -function u(){R.updateTitle(W.title)}function v(){var a=N.getNow();a.isWithin(W.intervalStart,W.intervalEnd)?R.disableButton("today"):R.enableButton("today")}/* Selection - -----------------------------------------------------------------------------*/ -// this public method receives start/end dates in any format, with any timezone -function w(a,b){W.select(N.buildSelectSpan.apply(N,arguments))}function x(){// safe to be called before renderView -W&&W.unselect()}/* Date - -----------------------------------------------------------------------------*/ -function y(){Z=W.computePrevDate(Z),i()}function z(){Z=W.computeNextDate(Z),i()}function A(){Z.add(-1,"years"),i()}function B(){Z.add(1,"years"),i()}function C(){Z=N.getNow(),i()}function D(a){Z=N.moment(a).stripZone(),i()}function E(a){Z.add(b.duration(a)),i()} -// Forces navigation to a view for the given date. -// `viewType` can be a specific view name or a generic one like "week" or "day". -function F(a,b){var c;b=b||"day",c=N.getViewSpec(b)||N.getUnitViewSpec(b),Z=a.clone(),i(c?c.type:null)} -// for external API -function G(){return N.applyTimezone(Z)}function H(){T.css({width:"100%",height:T.height(),overflow:"hidden"})}function I(){T.css({width:"",height:"",overflow:""})}/* Misc - -----------------------------------------------------------------------------*/ -function J(){return N}function K(){return W}function L(a,b){return void 0===b?O[a]:void("height"!=a&&"contentHeight"!=a&&"aspectRatio"!=a||(O[a]=b,j(!0)))}function M(a,b){// overrides the Emitter's trigger method :( -var c=Array.prototype.slice.call(arguments,2);return b=b||aa,this.triggerWith(a,b,c),O[a]?O[a].apply(b,c):void 0}var N=this;N.initOptions(d||{});var O=this.options; -// Exports -// ----------------------------------------------------------------------------------- -N.render=e,N.destroy=g,N.refetchEvents=n,N.reportEvents=s,N.reportEventChange=t,N.rerenderEvents=o,// `renderEvents` serves as a rerender. an API method -N.changeView=i,// `renderView` will switch to another view -N.select=w,N.unselect=x,N.prev=y,N.next=z,N.prevYear=A,N.nextYear=B,N.today=C,N.gotoDate=D,N.incrementDate=E,N.zoomTo=F,N.getDate=G,N.getCalendar=J,N.getView=K,N.option=L,N.trigger=M; -// Language-data Internals -// ----------------------------------------------------------------------------------- -// Apply overrides to the current language's data -var P=V(// make a cheap copy -Pa(O.lang));if(O.monthNames&&(P._months=O.monthNames),O.monthNamesShort&&(P._monthsShort=O.monthNamesShort),O.dayNames&&(P._weekdays=O.dayNames),O.dayNamesShort&&(P._weekdaysShort=O.dayNamesShort),null!=O.firstDay){var Q=V(P._week);// _week: { dow: # } -Q.dow=O.firstDay,P._week=Q} -// assign a normalized value, to be used by our .week() moment extension -P._fullCalendar_weekCalc=function(a){return"function"==typeof a?a:"local"===a?a:"iso"===a||"ISO"===a?"ISO":void 0}(O.weekNumberCalculation), -// Calendar-specific Date Utilities -// ----------------------------------------------------------------------------------- -N.defaultAllDayEventDuration=b.duration(O.defaultAllDayEventDuration),N.defaultTimedEventDuration=b.duration(O.defaultTimedEventDuration), -// Builds a moment using the settings of the current calendar: timezone and language. -// Accepts anything the vanilla moment() constructor accepts. -N.moment=function(){var a; -// Force the moment to be local, because FC.moment doesn't guarantee it. -// don't give ambiguously-timed moments a local zone -// moment 2.8 and above -// pre-moment-2.8 -return"local"===O.timezone?(a=Ta.moment.apply(null,arguments),a.hasTime()&&a.local()):a="UTC"===O.timezone?Ta.moment.utc.apply(null,arguments):Ta.moment.parseZone.apply(null,arguments),"_locale"in a?a._locale=P:a._lang=P,a}, -// Returns a boolean about whether or not the calendar knows how to calculate -// the timezone offset of arbitrary dates in the current timezone. -N.getIsAmbigTimezone=function(){return"local"!==O.timezone&&"UTC"!==O.timezone}, -// Returns a copy of the given date in the current timezone. Has no effect on dates without times. -N.applyTimezone=function(a){if(!a.hasTime())return a.clone();var b,c=N.moment(a.toArray()),d=a.time()-c.time(); -// Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396) -// is the time result different than expected? -// add milliseconds -// does it match perfectly now? -return d&&(b=c.clone().add(d),a.time()-b.time()===0&&(c=b)),c}, -// Returns a moment for the current date, as defined by the client's computer or from the `now` option. -// Will return an moment with an ambiguous timezone. -N.getNow=function(){var a=O.now;return"function"==typeof a&&(a=a()),N.moment(a).stripZone()}, -// Get an event's normalized end date. If not present, calculate it from the defaults. -N.getEventEnd=function(a){return a.end?a.end.clone():N.getDefaultEventEnd(a.allDay,a.start)}, -// Given an event's allDay status and start date, return what its fallback end date should be. -// TODO: rename to computeDefaultEventEnd -N.getDefaultEventEnd=function(a,b){var c=b.clone();return a?c.stripTime().add(N.defaultAllDayEventDuration):c.add(N.defaultTimedEventDuration),N.getIsAmbigTimezone()&&c.stripZone(),c}, -// Produces a human-readable string for the given duration. -// Side-effect: changes the locale of the given duration. -N.humanizeDuration=function(a){return(a.locale||a.lang).call(a,O.lang).humanize()}, -// Imports -// ----------------------------------------------------------------------------------- -Ra.call(N,O);var R,S,T,U,W,X,Y,Z,$=N.isFetchNeeded,_=N.fetchEvents,aa=c[0],ba={},ca=0,da=[];// unzoned -// Main Rendering -// ----------------------------------------------------------------------------------- -// compute the initial ambig-timezone date -Z=null!=O.defaultDate?N.moment(O.defaultDate).stripZone():N.getNow(),N.getSuggestedViewHeight=function(){return void 0===X&&k(),X},N.isHeightAuto=function(){return"auto"===O.contentHeight||"auto"===O.height},N.freezeContentHeight=H,N.unfreezeContentHeight=I,N.initialize()}function Oa(b){a.each(zb,function(a,c){null==b[a]&&(b[a]=c(b))})} -// Returns moment's internal locale data. If doesn't exist, returns English. -// Works with moment-pre-2.8 -function Pa(a){var c=b.localeData||b.langData;return c.call(b,a)||c.call(b,"en")}/* Top toolbar area with buttons and title -----------------------------------------------------------------------------------------------------------------------*/ -// TODO: rename all header-related things to "toolbar" -function Qa(b,c){function d(){var b=c.header;return n=c.theme?"ui":"fc",b?o=a("
    ").append(f("left")).append(f("right")).append(f("center")).append('
    '):void 0}function e(){o.remove(),o=a()}function f(d){var e=a('
    '),f=c.header[d];return f&&a.each(f.split(" "),function(d){var f,g=a(),h=!0;a.each(this.split(","),function(d,e){var f,i,j,k,l,m,o,q,r,s;// the element -"title"==e?(g=g.add(a("

     

    ")),h=!1):((f=(b.options.customButtons||{})[e])?(j=function(a){f.click&&f.click.call(s[0],a)},k="",l=f.text):(i=b.getViewSpec(e))?(j=function(){b.changeView(e)},p.push(e),k=i.buttonTextOverride,l=i.buttonTextDefault):b[e]&&(j=function(){b[e]()},k=(b.overrides.buttonText||{})[e],l=c.buttonText[e]),j&&(m=f?f.themeIcon:c.themeButtonIcons[e],o=f?f.icon:c.buttonIcons[e],q=k?aa(k):m&&c.theme?"":o&&!c.theme?"":aa(l),r=["fc-"+e+"-button",n+"-button",n+"-state-default"],s=a('").click(function(a){s.hasClass(n+"-state-disabled")||(j(a),(s.hasClass(n+"-state-active")||s.hasClass(n+"-state-disabled"))&&s.removeClass(n+"-state-hover"))}).mousedown(function(){s.not("."+n+"-state-active").not("."+n+"-state-disabled").addClass(n+"-state-down")}).mouseup(function(){s.removeClass(n+"-state-down")}).hover(function(){s.not("."+n+"-state-active").not("."+n+"-state-disabled").addClass(n+"-state-hover")},function(){s.removeClass(n+"-state-hover").removeClass(n+"-state-down")}),g=g.add(s)))}),h&&g.first().addClass(n+"-corner-left").end().last().addClass(n+"-corner-right").end(),g.length>1?(f=a("
    "),h&&f.addClass("fc-button-group"),f.append(g),e.append(f)):e.append(g)}),e}function g(a){o.find("h2").text(a)}function h(a){o.find(".fc-"+a+"-button").addClass(n+"-state-active")}function i(a){o.find(".fc-"+a+"-button").removeClass(n+"-state-active")}function j(a){o.find(".fc-"+a+"-button").attr("disabled","disabled").addClass(n+"-state-disabled")}function k(a){o.find(".fc-"+a+"-button").removeAttr("disabled").removeClass(n+"-state-disabled")}function l(){return p}var m=this; -// exports -m.render=d,m.removeElement=e,m.updateTitle=g,m.activateButton=h,m.deactivateButton=i,m.disableButton=j,m.enableButton=k,m.getViewsWithButtons=l; -// locals -var n,o=a(),p=[]}function Ra(c){/* Fetching - -----------------------------------------------------------------------------*/ -// start and end are assumed to be unzoned -function d(a,b){// nothing has been fetched yet? -return!I||I>a||b>M}function e(a,b){I=a,M=b,S=[];var c=++Q,d=P.length;R=d;for(var e=0;d>e;e++)f(P[e],c)}function f(b,c){g(b,function(d){var e,f,g,h=a.isArray(b.events);if(c==Q){if(d)for(e=0;e=c&&b.end<=d} -// Does the event's date range intersect with the given range? -// start/end already assumed to have stripped zones :( -function G(a,b){var c=a.start.clone().stripZone(),d=H.getEventEnd(a).stripZone();return b.startc}// assumed to be a calendar -var H=this; -// exports -H.isFetchNeeded=d,H.fetchEvents=e,H.addEventSource=h,H.removeEventSource=j,H.updateEvent=m,H.renderEvent=p,H.removeEvents=q,H.clientEvents=r,H.mutateEvent=x,H.normalizeEventDates=u,H.normalizeEventTimes=v; -// imports -var I,M,N=H.reportEvents,O={events:[]},P=[O],Q=0,R=0,S=[];// holds events that have already been expanded -a.each((c.events?[c.events]:[]).concat(c.eventSources||[]),function(a,b){var c=i(b);c&&P.push(c)}),/* Business Hours - -----------------------------------------------------------------------------------------*/ -H.getBusinessHoursEvents=z,/* Overlapping / Constraining - -----------------------------------------------------------------------------------------*/ -H.isEventSpanAllowed=A,H.isExternalSpanAllowed=B,H.isSelectionSpanAllowed=C,H.getEventCache=function(){return S}} -// updates the "backup" properties, which are preserved in order to compute diffs later on. -function Sa(a){a._allDay=a.allDay,a._start=a.start.clone(),a._end=a.end?a.end.clone():null}var Ta=a.fullCalendar={version:"2.7.1",internalApiVersion:3},Ua=Ta.views={};Ta.isTouch="ontouchstart"in document,a.fn.fullCalendar=function(b){var c=Array.prototype.slice.call(arguments,1),d=this;// what this function will return (this jQuery object by default) -return this.each(function(e,f){// loop each DOM element involved -var g,h=a(f),i=h.data("fullCalendar");// the returned value of this single method call -// a method call -"string"==typeof b?i&&a.isFunction(i[b])&&(g=i[b].apply(i,c),e||(d=g),"destroy"===b&&h.removeData("fullCalendar")):i||(i=new vb(h,b),h.data("fullCalendar",i),i.render())}),d};var Va=[// names of options that are objects whose properties should be combined -"header","buttonText","buttonIcons","themeButtonIcons"]; -// exports -Ta.intersectRanges=I,Ta.applyAll=$,Ta.debounce=ha,Ta.isInt=fa,Ta.htmlEscape=aa,Ta.cssToStr=ca,Ta.proxy=ga,Ta.capitaliseFirstLetter=da,/* Element Geom Utilities -----------------------------------------------------------------------------------------------------------------------*/ -Ta.getOuterRect=n,Ta.getClientRect=o,Ta.getContentRect=p,Ta.getScrollbarWidths=q; -// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side -var Wa=null;/* Mouse / Touch Utilities -----------------------------------------------------------------------------------------------------------------------*/ -Ta.preventDefault=z,/* General Geometry Utils -----------------------------------------------------------------------------------------------------------------------*/ -Ta.intersectRects=A,/* Object Ordering by Field -----------------------------------------------------------------------------------------------------------------------*/ -Ta.parseFieldSpecs=E,Ta.compareByFieldSpecs=F,Ta.compareByFieldSpec=G,Ta.flexibleCompare=H,/* Date Utilities -----------------------------------------------------------------------------------------------------------------------*/ -Ta.computeIntervalUnit=M,Ta.divideRangeByDuration=O,Ta.divideDurationByDuration=P,Ta.multiplyDuration=Q,Ta.durationHasTime=R;var Xa=["sun","mon","tue","wed","thu","fri","sat"],Ya=["year","month","week","day","hour","minute","second","millisecond"];/* Logging and Debug -----------------------------------------------------------------------------------------------------------------------*/ -Ta.log=function(){var a=window.console;return a&&a.log?a.log.apply(a,arguments):void 0},Ta.warn=function(){var a=window.console;return a&&a.warn?a.warn.apply(a,arguments):Ta.log.apply(Ta,arguments)};/* General Utilities -----------------------------------------------------------------------------------------------------------------------*/ -var Za,$a,_a,ab={}.hasOwnProperty,bb=/^\s*\d{4}-\d\d$/,cb=/^\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+)?)?)?)?)?$/,db=b.fn,eb=a.extend({},db);// function defined below -// Creating -// ------------------------------------------------------------------------------------------------- -// Creates a new moment, similar to the vanilla moment(...) constructor, but with -// extra features (ambiguous time, enhanced formatting). When given an existing moment, -// it will function as a clone (and retain the zone of the moment). Anything else will -// result in a moment in the local zone. -Ta.moment=function(){return ia(arguments)}, -// Sames as FC.moment, but forces the resulting moment to be in the UTC timezone. -Ta.moment.utc=function(){var a=ia(arguments,!0); -// Force it into UTC because makeMoment doesn't guarantee it -// (if given a pre-existing moment for example) -// don't give ambiguously-timed moments a UTC zone -return a.hasTime()&&a.utc(),a}, -// Same as FC.moment, but when given an ISO8601 string, the timezone offset is preserved. -// ISO8601 strings with no timezone offset will become ambiguously zoned. -Ta.moment.parseZone=function(){return ia(arguments,!0,!0)}, -// A clone method that works with the flags related to our enhanced functionality. -// In the future, use moment.momentProperties -db.clone=function(){var a=eb.clone.apply(this,arguments); -// these flags weren't transfered with the clone -return ka(this,a),this._fullCalendar&&(a._fullCalendar=!0),a}, -// Week Number -// ------------------------------------------------------------------------------------------------- -// Returns the week number, considering the locale's custom week number calcuation -// `weeks` is an alias for `week` -db.week=db.weeks=function(a){var b=(this._locale||this._lang)._fullCalendar_weekCalc;return null==a&&"function"==typeof b?b(this):"ISO"===b?eb.isoWeek.apply(this,arguments):eb.week.apply(this,arguments)}, -// Time-of-day -// ------------------------------------------------------------------------------------------------- -// GETTER -// Returns a Duration with the hours/minutes/seconds/ms values of the moment. -// If the moment has an ambiguous time, a duration of 00:00 will be returned. -// -// SETTER -// You can supply a Duration, a Moment, or a Duration-like argument. -// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous. -db.time=function(a){ -// Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar. -// `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins. -if(!this._fullCalendar)return eb.time.apply(this,arguments);if(null==a)// getter -return b.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});// setter -this._ambigTime=!1,// mark that the moment now has a time -b.isDuration(a)||b.isMoment(a)||(a=b.duration(a)); -// The day value should cause overflow (so 24 hours becomes 00:00:00 of next day). -// Only for Duration times, not Moment times. -var c=0; -// We need to set the individual fields. -// Can't use startOf('day') then add duration. In case of DST at start of day. -return b.isDuration(a)&&(c=24*Math.floor(a.asDays())),this.hours(c+a.hours()).minutes(a.minutes()).seconds(a.seconds()).milliseconds(a.milliseconds())}, -// Converts the moment to UTC, stripping out its time-of-day and timezone offset, -// but preserving its YMD. A moment with a stripped time will display no time -// nor timezone offset when .format() is called. -db.stripTime=function(){var a; -// get the values before any conversion happens -// array of y/m/d/h/m/s/ms -// TODO: use keepLocalTime in the future -// set the internal UTC flag (will clear the ambig flags) -// set the year/month/date. time will be zero -// Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(), -// which clears all ambig flags. Same with setUTCValues with moment-timezone. -return this._ambigTime||(a=this.toArray(),this.utc(),$a(this,a.slice(0,3)),this._ambigTime=!0,this._ambigZone=!0),this}, -// Returns if the moment has a non-ambiguous time (boolean) -db.hasTime=function(){return!this._ambigTime}, -// Timezone -// ------------------------------------------------------------------------------------------------- -// Converts the moment to UTC, stripping out its timezone offset, but preserving its -// YMD and time-of-day. A moment with a stripped timezone offset will display no -// timezone offset when .format() is called. -// TODO: look into Moment's keepLocalTime functionality -db.stripZone=function(){var a,b; -// get the values before any conversion happens -// array of y/m/d/h/m/s/ms -// set the internal UTC flag (might clear the ambig flags, depending on Moment internals) -// will set the year/month/date/hours/minutes/seconds/ms -// the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore -// Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(), -// which clears the ambig flags. Same with setUTCValues with moment-timezone. -return this._ambigZone||(a=this.toArray(),b=this._ambigTime,this.utc(),$a(this,a),this._ambigTime=b||!1,this._ambigZone=!0),this}, -// Returns of the moment has a non-ambiguous timezone offset (boolean) -db.hasZone=function(){return!this._ambigZone}, -// this method implicitly marks a zone -db.local=function(){var a=this.toArray(),b=this._ambigZone; -// ensure non-ambiguous -// this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals -// If the moment was ambiguously zoned, the date fields were stored as UTC. -// We want to preserve these, but in local time. -// TODO: look into Moment's keepLocalTime functionality -return eb.local.apply(this,arguments),this._ambigTime=!1,this._ambigZone=!1,b&&_a(this,a),this}, -// implicitly marks a zone -db.utc=function(){ -// ensure non-ambiguous -// this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals -return eb.utc.apply(this,arguments),this._ambigTime=!1,this._ambigZone=!1,this}, -// methods for arbitrarily manipulating timezone offset. -// should clear time/zone ambiguity when called. -a.each(["zone",// only in moment-pre-2.9. deprecated afterwards -"utcOffset"],function(a,b){eb[b]&&(// original method exists? -// this method implicitly marks a zone (will probably get called upon .utc() and .local()) -db[b]=function(a){// setter -// these assignments needs to happen before the original zone method is called. -// I forget why, something to do with a browser crash. -return null!=a&&(this._ambigTime=!1,this._ambigZone=!1),eb[b].apply(this,arguments)})}), -// Formatting -// ------------------------------------------------------------------------------------------------- -db.format=function(){return this._fullCalendar&&arguments[0]?na(this,arguments[0]):this._ambigTime?ma(this,"YYYY-MM-DD"):this._ambigZone?ma(this,"YYYY-MM-DD[T]HH:mm:ss"):eb.format.apply(this,arguments)},db.toISOString=function(){return this._ambigTime?ma(this,"YYYY-MM-DD"):this._ambigZone?ma(this,"YYYY-MM-DD[T]HH:mm:ss"):eb.toISOString.apply(this,arguments)}, -// Querying -// ------------------------------------------------------------------------------------------------- -// Is the moment within the specified range? `end` is exclusive. -// FYI, this method is not a standard Moment method, so always do our enhanced logic. -db.isWithin=function(a,b){var c=ja([this,a,b]);return c[0]>=c[1]&&c[0]a;a++)b=arguments[a],c-1>a&&xa(this,b);return wa(this,b||{})}, -// Adds new member variables/methods to the class's prototype. -// Can be called with another class, or a plain object hash containing new members. -va.mixin=function(a){xa(this,a)};var ib=Ta.EmitterMixin={callbackHash:null,on:function(a,b){return this.loopCallbacks(a,"add",[b]),this},off:function(a,b){return this.loopCallbacks(a,"remove",[b]),this},trigger:function(a){// args... -var b=Array.prototype.slice.call(arguments,1);return this.triggerWith(a,this,b),this},triggerWith:function(a,b,c){return this.loopCallbacks(a,"fireWith",[b,c]),this},/* - Given an event name string with possible namespaces, - call the given methodName on all the internal Callback object with the given arguments. - */ -loopCallbacks:function(a,b,c){var d,e,f,g=a.split(".");for(d=0;d').addClass(c.className||"").css({ -// position initially to the top left to avoid creating scrollbars -top:0,left:0}).append(c.content).appendTo(c.parentEl), -// when a click happens on anything inside with a 'fc-close' className, hide the popover -this.el.on("click",".fc-close",function(){b.hide()}),c.autoHide&&this.listenTo(a(document),"mousedown",this.documentMousedown)}, -// Triggered when the user clicks *anywhere* in the document, for the autoHide feature -documentMousedown:function(b){ -// only hide the popover if the click happened outside the popover -this.el&&!a(b.target).closest(this.el).length&&this.hide()}, -// Hides and unregisters any handlers -removeElement:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(a(document),"mousedown")}, -// Positions the popover optimally, using the top/left/right options -position:function(){var b,c,d,e,f,g=this.options,h=this.el.offsetParent().offset(),i=this.el.outerWidth(),j=this.el.outerHeight(),k=a(window),l=m(this.el);e=g.top||0,f=void 0!==g.left?g.left:void 0!==g.right?g.right-i:0,l.is(window)||l.is(document)?(l=k,b=0,c=0):(d=l.offset(),b=d.top,c=d.left),b+=k.scrollTop(),c+=k.scrollLeft(),g.viewportConstrain!==!1&&(e=Math.min(e,b+l.outerHeight()-j-this.margin),e=Math.max(e,b+this.margin),f=Math.min(f,c+l.outerWidth()-i-this.margin),f=Math.max(f,c+this.margin)),this.el.css({top:e-h.top,left:f-h.left})}, -// Triggers a callback. Calls a function in the option hash of the same name. -// Arguments beyond the first `name` are forwarded on. -// TODO: better code reuse for this. Repeat code -trigger:function(a){this.options[a]&&this.options[a].apply(this,Array.prototype.slice.call(arguments,1))}}),lb=Ta.CoordCache=va.extend({els:null,// jQuery set (assumed to be siblings) -forcedOffsetParentEl:null,// options can override the natural offsetParent -origin:null,// {left,top} position of offsetParent of els -boundingRect:null,// constrain cordinates to this rectangle. {left,right,top,bottom} or null -isHorizontal:!1,// whether to query for left/right/width -isVertical:!1,// whether to query for top/bottom/height -// arrays of coordinates (offsets from topleft of document) -lefts:null,rights:null,tops:null,bottoms:null,constructor:function(b){this.els=a(b.els),this.isHorizontal=b.isHorizontal,this.isVertical=b.isVertical,this.forcedOffsetParentEl=b.offsetParent?a(b.offsetParent):null}, -// Queries the els for coordinates and stores them. -// Call this method before using and of the get* methods below. -build:function(){var a=this.forcedOffsetParentEl||this.els.eq(0).offsetParent();this.origin=a.offset(),this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()}, -// Destroys all internal data about coordinates, freeing memory -clear:function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null}, -// When called, if coord caches aren't built, builds them -ensureBuilt:function(){this.origin||this.build()}, -// Compute and return what the elements' bounding rectangle is, from the user's perspective. -// Right now, only returns a rectangle if constrained by an overflow:scroll element. -queryBoundingRect:function(){var a=m(this.els.eq(0));return a.is(document)?void 0:o(a)}, -// Populates the left/right internal coordinate arrays -buildElHorizontals:function(){var b=[],c=[];this.els.each(function(d,e){var f=a(e),g=f.offset().left,h=f.outerWidth();b.push(g),c.push(g+h)}),this.lefts=b,this.rights=c}, -// Populates the top/bottom internal coordinate arrays -buildElVerticals:function(){var b=[],c=[];this.els.each(function(d,e){var f=a(e),g=f.offset().top,h=f.outerHeight();b.push(g),c.push(g+h)}),this.tops=b,this.bottoms=c}, -// Given a left offset (from document left), returns the index of the el that it horizontally intersects. -// If no intersection is made, or outside of the boundingRect, returns undefined. -getHorizontalIndex:function(a){this.ensureBuilt();var b,c=this.boundingRect,d=this.lefts,e=this.rights,f=d.length;if(!c||a>=c.left&&ab;b++)if(a>=d[b]&&a=c.top&&ab;b++)if(a>=d[b]&&a=e*e&&this.handleDistanceSurpassed(a)),this.isDragging&&this.handleDrag(c,d,a)}, -// Called while the mouse is being moved and when we know a legitimate drag is taking place -handleDrag:function(a,b,c){this.trigger("drag",a,b,c),this.updateAutoScroll(c)},endDrag:function(a){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(a))},handleDragEnd:function(a){this.trigger("dragEnd",a),this.destroyHrefHack()}, -// Delay -// ----------------------------------------------------------------------------------------------------------------- -startDelay:function(a){var b=this;this.delay?this.delayTimeoutId=setTimeout(function(){b.handleDelayEnd(a)},this.delay):this.handleDelayEnd(a)},handleDelayEnd:function(a){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(a)}, -// Distance -// ----------------------------------------------------------------------------------------------------------------- -handleDistanceSurpassed:function(a){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(a)}, -// Mouse / Touch -// ----------------------------------------------------------------------------------------------------------------- -handleTouchMove:function(a){ -// prevent inertia and touchmove-scrolling while dragging -this.isDragging&&a.preventDefault(),this.handleMove(a)},handleMouseMove:function(a){this.handleMove(a)}, -// Scrolling (unrelated to auto-scroll) -// ----------------------------------------------------------------------------------------------------------------- -handleTouchScroll:function(a){ -// if the drag is being initiated by touch, but a scroll happens before -// the drag-initiating delay is over, cancel the drag -this.isDragging||this.endInteraction(a)}, -// HREF Hack -// ----------------------------------------------------------------------------------------------------------------- -initHrefHack:function(){var a=this.subjectEl; -// remove a mousedown'd 's href so it is not visited (IE8 bug) -(this.subjectHref=a?a.attr("href"):null)&&a.removeAttr("href")},destroyHrefHack:function(){var a=this.subjectEl,b=this.subjectHref; -// restore a mousedown'd 's href (for IE8 bug) -setTimeout(function(){// must be outside of the click's execution -b&&a.attr("href",b)},0)}, -// Utils -// ----------------------------------------------------------------------------------------------------------------- -// Triggers a callback. Calls a function in the option hash of the same name. -// Arguments beyond the first `name` are forwarded on. -trigger:function(a){this.options[a]&&this.options[a].apply(this,Array.prototype.slice.call(arguments,1)), -// makes _methods callable by event name. TODO: kill this -this["_"+a]&&this["_"+a].apply(this,Array.prototype.slice.call(arguments,1))}});/* -this.scrollEl is set in DragListener -*/ -mb.mixin({isAutoScroll:!1,scrollBounds:null,// { top, bottom, left, right } -scrollTopVel:null,// pixels per second -scrollLeftVel:null,// pixels per second -scrollIntervalId:null,// ID of setTimeout for scrolling animation loop -// defaults -scrollSensitivity:30,// pixels from edge for scrolling to start -scrollSpeed:200,// pixels per second, at maximum speed -scrollIntervalMs:50,// millisecond wait between scroll increment -initAutoScroll:function(){var a=this.scrollEl;this.isAutoScroll=this.options.scroll&&a&&!a.is(window)&&!a.is(document),this.isAutoScroll&& -// debounce makes sure rapid calls don't happen -this.listenTo(a,"scroll",ha(this.handleDebouncedScroll,100))},destroyAutoScroll:function(){this.endAutoScroll(),// kill any animation loop -// remove the scroll handler if there is a scrollEl -this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")}, -// Computes and stores the bounding rectangle of scrollEl -computeScrollBounds:function(){this.isAutoScroll&&(this.scrollBounds=n(this.scrollEl))}, -// Called when the dragging is in progress and scrolling should be updated -updateAutoScroll:function(a){var b,c,d,e,f=this.scrollSensitivity,g=this.scrollBounds,h=0,i=0;g&&(b=(f-(w(a)-g.top))/f,c=(f-(g.bottom-w(a)))/f,d=(f-(v(a)-g.left))/f,e=(f-(g.right-v(a)))/f,b>=0&&1>=b?h=b*this.scrollSpeed*-1:c>=0&&1>=c&&(h=c*this.scrollSpeed),d>=0&&1>=d?i=d*this.scrollSpeed*-1:e>=0&&1>=e&&(i=e*this.scrollSpeed)),this.setScrollVel(h,i)}, -// Sets the speed-of-scrolling for the scrollEl -setScrollVel:function(a,b){this.scrollTopVel=a,this.scrollLeftVel=b,this.constrainScrollVel(),// massages into realistic values -// if there is non-zero velocity, and an animation loop hasn't already started, then START -!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(ga(this,"scrollIntervalFunc"),// scope to `this` -this.scrollIntervalMs))}, -// Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way -constrainScrollVel:function(){var a=this.scrollEl;this.scrollTopVel<0?// scrolling up? -a.scrollTop()<=0&&(// already scrolled all the way up? -this.scrollTopVel=0):this.scrollTopVel>0&&a.scrollTop()+a[0].clientHeight>=a[0].scrollHeight&&(// already scrolled all the way down? -this.scrollTopVel=0),this.scrollLeftVel<0?// scrolling left? -a.scrollLeft()<=0&&(// already scrolled all the left? -this.scrollLeftVel=0):this.scrollLeftVel>0&&a.scrollLeft()+a[0].clientWidth>=a[0].scrollWidth&&(// already scrolled all the way right? -this.scrollLeftVel=0)}, -// This function gets called during every iteration of the scrolling animation loop -scrollIntervalFunc:function(){var a=this.scrollEl,b=this.scrollIntervalMs/1e3;// considering animation frequency, what the vel should be mult'd by -// change the value of scrollEl's scroll -this.scrollTopVel&&a.scrollTop(a.scrollTop()+this.scrollTopVel*b),this.scrollLeftVel&&a.scrollLeft(a.scrollLeft()+this.scrollLeftVel*b),this.constrainScrollVel(),// since the scroll values changed, recompute the velocities -// if scrolled all the way, which causes the vels to be zero, stop the animation loop -this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()}, -// Kills any existing scrolling animation loop -endAutoScroll:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())}, -// Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce) -handleDebouncedScroll:function(){ -// recompute all coordinates, but *only* if this is *not* part of our scrolling animation -this.scrollIntervalId||this.handleScrollEnd()}, -// Called when scrolling has stopped, whether through auto scroll, or the user scrolling -handleScrollEnd:function(){}});/* Tracks mouse movements over a component and raises events about which hit the mouse is over. ------------------------------------------------------------------------------------------------------------------------- -options: -- subjectEl -- subjectCenter -*/ -var nb=mb.extend({component:null,// converts coordinates to hits -// methods: prepareHits, releaseHits, queryHit -origHit:null,// the hit the mouse was over when listening started -hit:null,// the hit the mouse is over -coordAdjust:null,// delta that will be added to the mouse coordinates when computing collisions -constructor:function(a,b){mb.call(this,b),// call the super-constructor -this.component=a}, -// Called when drag listening starts (but a real drag has not necessarily began). -// ev might be undefined if dragging was started manually. -handleInteractionStart:function(a){var b,c,d,e=this.subjectEl;this.computeCoords(),a?(c={left:v(a),top:w(a)},d=c,e&&(b=n(e),d=B(d,b)),this.origHit=this.queryHit(d.left,d.top),e&&this.options.subjectCenter&&(this.origHit&&(b=A(this.origHit,b)||b),d=C(b)),this.coordAdjust=D(d,c)):(this.origHit=null,this.coordAdjust=null), -// call the super-method. do it after origHit has been computed -mb.prototype.handleInteractionStart.apply(this,arguments)}, -// Recomputes the drag-critical positions of elements -computeCoords:function(){this.component.prepareHits(),this.computeScrollBounds()}, -// Called when the actual drag has started -handleDragStart:function(a){var b;mb.prototype.handleDragStart.apply(this,arguments),b=this.queryHit(v(a),w(a)),b&&this.handleHitOver(b)}, -// Called when the drag moves -handleDrag:function(a,b,c){var d;mb.prototype.handleDrag.apply(this,arguments),d=this.queryHit(v(c),w(c)),ya(d,this.hit)||(this.hit&&this.handleHitOut(),d&&this.handleHitOver(d))}, -// Called when dragging has been stopped -handleDragEnd:function(){this.handleHitDone(),mb.prototype.handleDragEnd.apply(this,arguments)}, -// Called when a the mouse has just moved over a new hit -handleHitOver:function(a){var b=ya(a,this.origHit);this.hit=a,this.trigger("hitOver",this.hit,b,this.origHit)}, -// Called when the mouse has just moved out of a hit -handleHitOut:function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)}, -// Called after a hitOut. Also called before a dragStop -handleHitDone:function(){this.hit&&this.trigger("hitDone",this.hit)}, -// Called when the interaction ends, whether there was a real drag or not -handleInteractionEnd:function(){mb.prototype.handleInteractionEnd.apply(this,arguments),// call the super-method -this.origHit=null,this.hit=null,this.component.releaseHits()}, -// Called when scrolling has stopped, whether through auto scroll, or the user scrolling -handleScrollEnd:function(){mb.prototype.handleScrollEnd.apply(this,arguments),// call the super-method -this.computeCoords()}, -// Gets the hit underneath the coordinates for the given mouse event -queryHit:function(a,b){return this.coordAdjust&&(a+=this.coordAdjust.left,b+=this.coordAdjust.top),this.component.queryHit(a,b)}}),ob=va.extend(jb,{options:null,sourceEl:null,// the element that will be cloned and made to look like it is dragging -el:null,// the clone of `sourceEl` that will track the mouse -parentEl:null,// the element that `el` (the clone) will be attached to -// the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl -top0:null,left0:null, -// the absolute coordinates of the initiating touch/mouse action -y0:null,x0:null, -// the number of pixels the mouse has moved from its initial position -topDelta:null,leftDelta:null,isFollowing:!1,isHidden:!1,isAnimating:!1,// doing the revert animation? -constructor:function(b,c){this.options=c=c||{},this.sourceEl=b,this.parentEl=c.parentEl?a(c.parentEl):b.parent()}, -// Causes the element to start following the mouse -start:function(b){this.isFollowing||(this.isFollowing=!0,this.y0=w(b),this.x0=v(b),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),x(b)?this.listenTo(a(document),"touchmove",this.handleMove):this.listenTo(a(document),"mousemove",this.handleMove))}, -// Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position. -// `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately. -stop:function(b,c){function d(){this.isAnimating=!1,e.removeElement(),this.top0=this.left0=null,// reset state for future updatePosition calls -c&&c()}var e=this,f=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(// disallow more than one stop animation at a time -this.isFollowing=!1,this.stopListeningTo(a(document)),b&&f&&!this.isHidden?(// do a revert animation? -this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:f,complete:d})):d())}, -// Gets the tracking element. Create it if necessary -getEl:function(){var a=this.el;// hack to force IE8 to compute correct bounding box -// we don't want long taps or any mouse interaction causing selection/menus. -// would use preventSelection(), but that prevents selectstart, causing problems. -return a||(this.sourceEl.width(),a=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",// in case original element was hidden (commonly through hideEvents()) -display:this.isHidden?"none":"",// for when initially hidden -margin:0,right:"auto",// erase and set width instead -bottom:"auto",// erase and set height instead -width:this.sourceEl.width(),// explicit height in case there was a 'right' value -height:this.sourceEl.height(),// explicit width in case there was a 'bottom' value -opacity:this.options.opacity||"",zIndex:this.options.zIndex}),a.addClass("fc-unselectable"),a.appendTo(this.parentEl)),a}, -// Removes the tracking element if it has already been created -removeElement:function(){this.el&&(this.el.remove(),this.el=null)}, -// Update the CSS position of the tracking element -updatePosition:function(){var a,b;this.getEl(),// ensure this.el -// make sure origin info was computed -null===this.top0&&(this.sourceEl.width(),a=this.sourceEl.offset(),b=this.el.offsetParent().offset(),this.top0=a.top-b.top,this.left0=a.left-b.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})}, -// Gets called when the user moves the mouse -handleMove:function(a){this.topDelta=w(a)-this.y0,this.leftDelta=v(a)-this.x0,this.isHidden||this.updatePosition()}, -// Temporarily makes the tracking element invisible. Can be called before following starts -hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())}, -// Show the tracking element after it has been temporarily hidden -show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),pb=Ta.Grid=va.extend(jb,{view:null,// a View object -isRTL:null,// shortcut to the view's isRTL option -start:null,end:null,el:null,// the containing element -elsByFill:null,// a hash of jQuery element sets used for rendering each fill. Keyed by fill name. -// derived from options -eventTimeFormat:null,displayEventTime:null,displayEventEnd:null,minResizeDuration:null,// TODO: hack. set by subclasses. minumum event resize duration -// if defined, holds the unit identified (ex: "year" or "month") that determines the level of granularity -// of the date areas. if not defined, assumes to be day and time granularity. -// TODO: port isTimeScale into same system? -largeUnit:null,dayDragListener:null,segDragListener:null,segResizeListener:null,externalDragListener:null,constructor:function(a){this.view=a,this.isRTL=a.opt("isRTL"),this.elsByFill={}},/* Options - ------------------------------------------------------------------------------------------------------------------*/ -// Generates the format string used for event time text, if not explicitly defined by 'timeFormat' -computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")}, -// Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventTime'. -// Only applies to non-all-day events. -computeDisplayEventTime:function(){return!0}, -// Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventEnd' -computeDisplayEventEnd:function(){return!0},/* Dates - ------------------------------------------------------------------------------------------------------------------*/ -// Tells the grid about what period of time to display. -// Any date-related internal data should be generated. -setRange:function(a){this.start=a.start.clone(),this.end=a.end.clone(),this.rangeUpdated(),this.processRangeOptions()}, -// Called when internal variables that rely on the range should be updated -rangeUpdated:function(){}, -// Updates values that rely on options and also relate to range -processRangeOptions:function(){var a,b,c=this.view;this.eventTimeFormat=c.opt("eventTimeFormat")||c.opt("timeFormat")||// deprecated -this.computeEventTimeFormat(),a=c.opt("displayEventTime"),null==a&&(a=this.computeDisplayEventTime()),b=c.opt("displayEventEnd"),null==b&&(b=this.computeDisplayEventEnd()),this.displayEventTime=a,this.displayEventEnd=b}, -// Converts a span (has unzoned start/end and any other grid-specific location information) -// into an array of segments (pieces of events whose format is decided by the grid). -spanToSegs:function(a){}, -// Diffs the two dates, returning a duration, based on granularity of the grid -// TODO: port isTimeScale into this system? -diffDates:function(a,b){return this.largeUnit?L(a,b,this.largeUnit):J(a,b)},/* Hit Area - ------------------------------------------------------------------------------------------------------------------*/ -// Called before one or more queryHit calls might happen. Should prepare any cached coordinates for queryHit -prepareHits:function(){}, -// Called when queryHit calls have subsided. Good place to clear any coordinate caches. -releaseHits:function(){}, -// Given coordinates from the topleft of the document, return data about the date-related area underneath. -// Can return an object with arbitrary properties (although top/right/left/bottom are encouraged). -// Must have a `grid` property, a reference to this current grid. TODO: avoid this -// The returned object will be processed by getHitSpan and getHitEl. -queryHit:function(a,b){}, -// Given position-level information about a date-related area within the grid, -// should return an object with at least a start/end date. Can provide other information as well. -getHitSpan:function(a){}, -// Given position-level information about a date-related area within the grid, -// should return a jQuery element that best represents it. passed to dayClick callback. -getHitEl:function(a){},/* Rendering - ------------------------------------------------------------------------------------------------------------------*/ -// Sets the container element that the grid should render inside of. -// Does other DOM-related initializations. -setElement:function(a){this.el=a,y(a),this.view.calendar.isTouch?this.bindDayHandler("touchstart",this.dayTouchStart):this.bindDayHandler("mousedown",this.dayMousedown), -// attach event-element-related handlers. in Grid.events -// same garbage collection note as above. -this.bindSegHandlers(),this.bindGlobalHandlers()},bindDayHandler:function(b,c){var d=this; -// attach a handler to the grid's root element. -// jQuery will take care of unregistering them when removeElement gets called. -this.el.on(b,function(b){return a(b.target).is(".fc-event-container *, .fc-more")||a(b.target).closest(".fc-popover").length?void 0:c.call(d,b)})}, -// Removes the grid's container element from the DOM. Undoes any other DOM-related attachments. -// DOES NOT remove any content beforehand (doesn't clear events or call unrenderDates), unlike View -removeElement:function(){this.unbindGlobalHandlers(),this.clearDragListeners(),this.el.remove()}, -// Renders the basic structure of grid view before any content is rendered -renderSkeleton:function(){}, -// Renders the grid's date-related content (like areas that represent days/times). -// Assumes setRange has already been called and the skeleton has already been rendered. -renderDates:function(){}, -// Unrenders the grid's date-related content -unrenderDates:function(){},/* Handlers - ------------------------------------------------------------------------------------------------------------------*/ -// Binds DOM handlers to elements that reside outside the grid, such as the document -bindGlobalHandlers:function(){this.listenTo(a(document),{dragstart:this.externalDragStart,// jqui -sortstart:this.externalDragStart})}, -// Unbinds DOM handlers from elements that reside outside the grid -unbindGlobalHandlers:function(){this.stopListeningTo(a(document))}, -// Process a mousedown on an element that represents a day. For day clicking and selecting. -dayMousedown:function(a){this.clearDragListeners(),this.buildDayDragListener().startInteraction(a,{})},dayTouchStart:function(a){this.clearDragListeners(),this.buildDayDragListener().startInteraction(a,{delay:this.view.opt("longPressDelay")})}, -// Creates a listener that tracks the user's drag across day elements. -// For day clicking and selecting. -buildDayDragListener:function(){var a,b,c=this,d=this.view,e=d.opt("selectable"),f=this.dayDragListener=new nb(this,{scroll:d.opt("dragScroll"),interactionStart:function(){a=f.origHit},dragStart:function(){d.unselect()},hitOver:function(d,f,h){h&&(// click needs to have started on a hit -// if user dragged to another cell at any point, it can no longer be a dayClick -f||(a=null),e&&(b=c.computeSelection(c.getHitSpan(h),c.getHitSpan(d)),b?c.renderSelection(b):b===!1&&g()))},hitOut:function(){a=null,b=null,c.unrenderSelection(),h()},interactionEnd:function(e){a&&d.triggerDayClick(c.getHitSpan(a),c.getHitEl(a),e),b&& -// the selection will already have been rendered. just report it -d.reportSelection(b,e),h(),c.dayDragListener=null}});return f}, -// Kills all in-progress dragging. -// Useful for when public API methods that result in re-rendering are invoked during a drag. -// Also useful for when touch devices misbehave and don't fire their touchend. -clearDragListeners:function(){this.dayDragListener&&this.dayDragListener.endInteraction(),this.segDragListener&&this.segDragListener.endInteraction(),this.segResizeListener&&this.segResizeListener.endInteraction(),this.externalDragListener&&this.externalDragListener.endInteraction()},/* Event Helper - ------------------------------------------------------------------------------------------------------------------*/ -// TODO: should probably move this to Grid.events, like we did event dragging / resizing -// Renders a mock event at the given event location, which contains zoned start/end properties. -// Returns all mock event elements. -renderEventLocationHelper:function(a,b){var c=this.fabricateHelperEvent(a,b);return this.renderHelper(c,b)}, -// Builds a fake event given zoned event date properties and a segment is should be inspired from. -// The range's end can be null, in which case the mock event that is rendered will have a null end time. -// `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging. -fabricateHelperEvent:function(a,b){var c=b?V(b.event):{};// mask the original event object if possible -// force it to be freshly computed by normalizeEventDates -// this extra className will be useful for differentiating real events from mock events in CSS -// if something external is being dragged in, don't render a resizer -return c.start=a.start.clone(),c.end=a.end?a.end.clone():null,c.allDay=null,this.view.calendar.normalizeEventDates(c),c.className=(c.className||[]).concat("fc-helper"),b||(c.editable=!1),c}, -// Renders a mock event. Given zoned event date properties. -// Must return all mock event elements. -renderHelper:function(a,b){}, -// Unrenders a mock event -unrenderHelper:function(){},/* Selection - ------------------------------------------------------------------------------------------------------------------*/ -// Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses. -// Given a span (unzoned start/end and other misc data) -renderSelection:function(a){this.renderHighlight(a)}, -// Unrenders any visual indications of a selection. Will unrender a highlight by default. -unrenderSelection:function(){this.unrenderHighlight()}, -// Given the first and last date-spans of a selection, returns another date-span object. -// Subclasses can override and provide additional data in the span object. Will be passed to renderSelection(). -// Will return false if the selection is invalid and this should be indicated to the user. -// Will return null/undefined if a selection invalid but no error should be reported. -computeSelection:function(a,b){var c=this.computeSelectionSpan(a,b);return c&&!this.view.calendar.isSelectionSpanAllowed(c)?!1:c}, -// Given two spans, must return the combination of the two. -// TODO: do this separation of concerns (combining VS validation) for event dnd/resize too. -computeSelectionSpan:function(a,b){var c=[a.start,a.end,b.start,b.end];// sorts chronologically. works with Moments -return c.sort(ea),{start:c[0].clone(),end:c[3].clone()}},/* Highlight - ------------------------------------------------------------------------------------------------------------------*/ -// Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data) -renderHighlight:function(a){this.renderFill("highlight",this.spanToSegs(a))}, -// Unrenders the emphasis on a date range -unrenderHighlight:function(){this.unrenderFill("highlight")}, -// Generates an array of classNames for rendering the highlight. Used by the fill system. -highlightSegClasses:function(){return["fc-highlight"]},/* Business Hours - ------------------------------------------------------------------------------------------------------------------*/ -renderBusinessHours:function(){},unrenderBusinessHours:function(){},/* Now Indicator - ------------------------------------------------------------------------------------------------------------------*/ -getNowIndicatorUnit:function(){},renderNowIndicator:function(a){},unrenderNowIndicator:function(){},/* Fill System (highlight, background events, business hours) - -------------------------------------------------------------------------------------------------------------------- - TODO: remove this system. like we did in TimeGrid - */ -// Renders a set of rectangles over the given segments of time. -// MUST RETURN a subset of segs, the segs that were actually rendered. -// Responsible for populating this.elsByFill. TODO: better API for expressing this requirement -renderFill:function(a,b){}, -// Unrenders a specific type of fill that is currently rendered on the grid -unrenderFill:function(a){var b=this.elsByFill[a];b&&(b.remove(),delete this.elsByFill[a])}, -// Renders and assigns an `el` property for each fill segment. Generic enough to work with different types. -// Only returns segments that successfully rendered. -// To be harnessed by renderFill (implemented by subclasses). -// Analagous to renderFgSegEls. -renderFillSegEls:function(b,c){var d,e=this,f=this[b+"SegEl"],g="",h=[];if(c.length){ -// build a large concatenation of segment HTML -for(d=0;d"},/* Generic rendering utilities for subclasses - ------------------------------------------------------------------------------------------------------------------*/ -// Computes HTML classNames for a single-day element -getDayClasses:function(a){var b=this.view,c=b.calendar.getNow(),d=["fc-"+Xa[a.day()]];return 1==b.intervalDuration.as("months")&&a.month()!=b.intervalStart.month()&&d.push("fc-other-month"),a.isSame(c,"day")?d.push("fc-today",b.highlightStateClass):c>a?d.push("fc-past"):d.push("fc-future"),d}});/* Event-rendering and event-interaction methods for the abstract Grid class -----------------------------------------------------------------------------------------------------------------------*/ -pb.mixin({mousedOverSeg:null,// the segment object the user's mouse is over. null if over nothing -isDraggingSeg:!1,// is a segment being dragged? boolean -isResizingSeg:!1,// is a segment being resized? boolean -isDraggingExternal:!1,// jqui-dragging an external element? boolean -segs:null,// the *event* segments currently rendered in the grid. TODO: rename to `eventSegs` -// Renders the given events onto the grid -renderEvents:function(a){var b,c=[],d=[];for(b=0;b *",function(b){var e=a(this).data("fc-seg");// grab segment data. put there by View::renderEvents -// only call the handlers if there is not a drag/resize in progress -// grab segment data. put there by View::renderEvents -// only call the handlers if there is not a drag/resize in progress -return!e||d.isDraggingSeg||d.isResizingSeg?void 0:c.call(d,e,b)})},handleSegClick:function(a,b){return this.view.trigger("eventClick",a.el[0],a.event,b)}, -// Updates internal state and triggers handlers for when an event element is moused over -handleSegMouseover:function(a,b){this.mousedOverSeg||(this.mousedOverSeg=a,this.view.trigger("eventMouseover",a.el[0],a.event,b))}, -// Updates internal state and triggers handlers for when an event element is moused out. -// Can be given no arguments, in which case it will mouseout the segment that was previously moused over. -handleSegMouseout:function(a,b){b=b||{},this.mousedOverSeg&&(a=a||this.mousedOverSeg,this.mousedOverSeg=null,this.view.trigger("eventMouseout",a.el[0],a.event,b))},handleSegTouchStart:function(a,b){var c,d=this.view,e=a.event,f=d.isEventSelected(e),g=d.isEventDraggable(e),h=d.isEventResizable(e),i=!1;f&&h&&( -// only allow resizing of the event is selected -i=this.startSegResize(a,b)),i||!g&&!h||(// allowed to be selected? -this.clearDragListeners(),c=g?this.buildSegDragListener(a):new mb,c._dragStart=function(){f||d.selectEvent(e)},c.startInteraction(b,{delay:f?0:this.view.opt("longPressDelay")}))},handleSegMousedown:function(a,b){var c=this.startSegResize(a,b,{distance:5});!c&&this.view.isEventDraggable(a.event)&&(this.clearDragListeners(),this.buildSegDragListener(a).startInteraction(b,{distance:5}))}, -// returns boolean whether resizing actually started or not. -// assumes the seg allows resizing. -// `dragOptions` are optional. -startSegResize:function(b,c,d){return a(c.target).is(".fc-resizer")?(this.clearDragListeners(),this.buildSegResizeListener(b,a(c.target).is(".fc-start-resizer")).startInteraction(c,d),!0):!1},/* Event Dragging - ------------------------------------------------------------------------------------------------------------------*/ -// Builds a listener that will track user-dragging on an event segment. -// Generic enough to work with any type of Grid. -buildSegDragListener:function(a){var b,c,d,e=this,f=this.view,i=f.calendar,j=a.el,k=a.event,l=this.segDragListener=new nb(f,{scroll:f.opt("dragScroll"),subjectEl:j,subjectCenter:!0,interactionStart:function(d){b=!1,c=new ob(a.el,{additionalClass:"fc-dragging",parentEl:f.el,opacity:l.isTouch?null:f.opt("dragOpacity"),revertDuration:f.opt("dragRevertDuration"),zIndex:2}),c.hide(),c.start(d)},dragStart:function(c){b=!0,e.handleSegMouseout(a,c),e.segDragStart(a,c),f.hideEvent(k)},hitOver:function(b,h,j){var m; -// starting hit could be forced (DayGrid.limit) -a.hit&&(j=a.hit),d=e.computeEventDrop(j.component.getHitSpan(j),b.component.getHitSpan(b),k),d&&!i.isEventSpanAllowed(e.eventToSpan(d),k)&&(g(),d=null),d&&(m=f.renderDrag(d,a))?(m.addClass("fc-dragging"),l.isTouch||e.applyDragOpacity(m),c.hide()):c.show(),h&&(d=null)},hitOut:function(){// called before mouse moves to a different hit OR moved out of all hits -f.unrenderDrag(),// unrender whatever was done in renderDrag -c.show(),// show in case we are moving out of all hits -d=null},hitDone:function(){// Called after a hitOut OR before a dragEnd -h()},interactionEnd:function(g){ -// do revert animation if hasn't changed. calls a callback when finished (whether animation or not) -c.stop(!d,function(){b&&(f.unrenderDrag(),f.showEvent(k),e.segDragStop(a,g)),d&&f.reportEventDrop(k,d,this.largeUnit,j,g)}),e.segDragListener=null}});return l}, -// Called before event segment dragging starts -segDragStart:function(a,b){this.isDraggingSeg=!0,this.view.trigger("eventDragStart",a.el[0],a.event,b,{})}, -// Called after event segment dragging stops -segDragStop:function(a,b){this.isDraggingSeg=!1,this.view.trigger("eventDragStop",a.el[0],a.event,b,{})}, -// Given the spans an event drag began, and the span event was dropped, calculates the new zoned start/end/allDay -// values for the event. Subclasses may override and set additional properties to be used by renderDrag. -// A falsy returned value indicates an invalid drop. -// DOES NOT consider overlap/constraint. -computeEventDrop:function(a,b,c){var d,e,f=this.view.calendar,g=a.start,h=b.start;// zoned event date properties -// if an all-day event was in a timed area and it was dragged to a different time, -// guarantee an end and adjust start/end to have times -// if switching from day <-> timed, start should be reset to the dropped date, and the end cleared -return g.hasTime()===h.hasTime()?(d=this.diffDates(h,g),c.allDay&&R(d)?(e={start:c.start.clone(),end:f.getEventEnd(c),allDay:!1},f.normalizeEventTimes(e)):e={start:c.start.clone(),end:c.end?c.end.clone():null,allDay:c.allDay},e.start.add(d),e.end&&e.end.add(d)):e={start:h.clone(),end:null,// end should be cleared -allDay:!h.hasTime()},e}, -// Utility for apply dragOpacity to a jQuery set -applyDragOpacity:function(a){var b=this.view.opt("dragOpacity");null!=b&&a.each(function(a,c){ -// Don't use jQuery (will set an IE filter), do it the old fashioned way. -// In IE8, a helper element will disappears if there's a filter. -c.style.opacity=b})},/* External Element Dragging - ------------------------------------------------------------------------------------------------------------------*/ -// Called when a jQuery UI drag is initiated anywhere in the DOM -externalDragStart:function(b,c){var d,e,f=this.view;f.opt("droppable")&&(d=a((c?c.item:null)||b.target),e=f.opt("dropAccept"),(a.isFunction(e)?e.call(d[0],d):d.is(e))&&(this.isDraggingExternal||this.listenToExternalDrag(d,b,c)))}, -// Called when a jQuery UI drag starts and it needs to be monitored for dropping -listenToExternalDrag:function(a,b,c){var d,e=this,f=this.view.calendar,i=Fa(a),j=e.externalDragListener=new nb(this,{interactionStart:function(){e.isDraggingExternal=!0},hitOver:function(a){d=e.computeExternalDrop(a.component.getHitSpan(a),// since we are querying the parent view, might not belong to this grid -i),d&&!f.isExternalSpanAllowed(e.eventToSpan(d),d,i.eventProps)&&(g(),d=null),d&&e.renderDrag(d)},hitOut:function(){d=null},hitDone:function(){// Called after a hitOut OR before a dragEnd -h(),e.unrenderDrag()},interactionEnd:function(b){d&&// element was dropped on a valid hit -e.view.reportExternalDrop(i,d,a,b,c),e.isDraggingExternal=!1,e.externalDragListener=null}});j.startDrag(b)}, -// Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object), -// returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null. -// Returning a null value signals an invalid drop hit. -// DOES NOT consider overlap/constraint. -computeExternalDrop:function(a,b){var c=this.view.calendar,d={start:c.applyTimezone(a.start),// simulate a zoned event start date -end:null}; -// if dropped on an all-day span, and element's metadata specified a time, set it -return b.startTime&&!d.start.hasTime()&&d.start.time(b.startTime),b.duration&&(d.end=d.start.clone().add(b.duration)),d},/* Drag Rendering (for both events and an external elements) - ------------------------------------------------------------------------------------------------------------------*/ -// Renders a visual indication of an event or external element being dragged. -// `dropLocation` contains hypothetical start/end/allDay values the event would have if dropped. end can be null. -// `seg` is the internal segment object that is being dragged. If dragging an external element, `seg` is null. -// A truthy returned value indicates this method has rendered a helper element. -// Must return elements used for any mock events. -renderDrag:function(a,b){}, -// Unrenders a visual indication of an event or external element being dragged -unrenderDrag:function(){},/* Resizing - ------------------------------------------------------------------------------------------------------------------*/ -// Creates a listener that tracks the user as they resize an event segment. -// Generic enough to work with any type of Grid. -buildSegResizeListener:function(a,b){var c,d,e=this,f=this.view,i=f.calendar,j=a.el,k=a.event,l=i.getEventEnd(k),m=this.segResizeListener=new nb(this,{scroll:f.opt("dragScroll"),subjectEl:j,interactionStart:function(){c=!1},dragStart:function(b){c=!0,e.handleSegMouseout(a,b),e.segResizeStart(a,b)},hitOver:function(c,h,j){var m=e.getHitSpan(j),n=e.getHitSpan(c);d=b?e.computeEventStartResize(m,n,k):e.computeEventEndResize(m,n,k),d&&(i.isEventSpanAllowed(e.eventToSpan(d),k)?d.start.isSame(k.start)&&d.end.isSame(l)&&(d=null):(g(),d=null)),d&&(f.hideEvent(k),e.renderEventResize(d,a))},hitOut:function(){// called before mouse moves to a different hit OR moved out of all hits -d=null},hitDone:function(){// resets the rendering to show the original event -e.unrenderEventResize(),f.showEvent(k),h()},interactionEnd:function(b){c&&e.segResizeStop(a,b),d&&// valid date to resize to? -f.reportEventResize(k,d,this.largeUnit,j,b),e.segResizeListener=null}});return m}, -// Called before event segment resizing starts -segResizeStart:function(a,b){this.isResizingSeg=!0,this.view.trigger("eventResizeStart",a.el[0],a.event,b,{})}, -// Called after event segment resizing stops -segResizeStop:function(a,b){this.isResizingSeg=!1,this.view.trigger("eventResizeStop",a.el[0],a.event,b,{})}, -// Returns new date-information for an event segment being resized from its start -computeEventStartResize:function(a,b,c){return this.computeEventResize("start",a,b,c)}, -// Returns new date-information for an event segment being resized from its end -computeEventEndResize:function(a,b,c){return this.computeEventResize("end",a,b,c)}, -// Returns new zoned date information for an event segment being resized from its start OR end -// `type` is either 'start' or 'end'. -// DOES NOT consider overlap/constraint. -computeEventResize:function(a,b,c,d){var e,f,g=this.view.calendar,h=this.diffDates(c[a],b[a]); -// build original values to work from, guaranteeing a start and end -// if an all-day event was in a timed area and was resized to a time, adjust start/end to have times -// apply delta to start or end -// if the event was compressed too small, find a new reasonable duration for it -// TODO: hack -// resizing the start? -// resizing the end? -return e={start:d.start.clone(),end:g.getEventEnd(d),allDay:d.allDay},e.allDay&&R(h)&&(e.allDay=!1,g.normalizeEventTimes(e)),e[a].add(h),e.start.isBefore(e.end)||(f=this.minResizeDuration||(d.allDay?g.defaultAllDayEventDuration:g.defaultTimedEventDuration),"start"==a?e.start=e.end.clone().subtract(f):e.end=e.start.clone().add(f)),e}, -// Renders a visual indication of an event being resized. -// `range` has the updated dates of the event. `seg` is the original segment object involved in the drag. -// Must return elements used for any mock events. -renderEventResize:function(a,b){}, -// Unrenders a visual indication of an event being resized. -unrenderEventResize:function(){},/* Rendering Utils - ------------------------------------------------------------------------------------------------------------------*/ -// Compute the text that should be displayed on an event's element. -// `range` can be the Event object itself, or something range-like, with at least a `start`. -// If event times are disabled, or the event has no time, will return a blank string. -// If not specified, formatStr will default to the eventTimeFormat setting, -// and displayEnd will default to the displayEventEnd setting. -getEventTimeText:function(a,b,c){return null==b&&(b=this.eventTimeFormat),null==c&&(c=this.displayEventEnd),this.displayEventTime&&a.start.hasTime()?c&&a.end?this.view.formatRange(a,b):a.start.format(b):""}, -// Generic utility for generating the HTML classNames for an event segment's element -getSegClasses:function(a,b,c){var d=this.view,e=a.event,f=["fc-event",a.isStart?"fc-start":"fc-not-start",a.isEnd?"fc-end":"fc-not-end"].concat(e.className,e.source?e.source.className:[]); -// event is currently selected? attach a className. -return b&&f.push("fc-draggable"),c&&f.push("fc-resizable"),d.isEventSelected(e)&&f.push("fc-selected"),f}, -// Utility for generating event skin-related CSS properties -getSegSkinCss:function(a){var b=a.event,c=this.view,d=b.source||{},e=b.color,f=d.color,g=c.opt("eventColor");return{"background-color":b.backgroundColor||e||d.backgroundColor||f||c.opt("eventBackgroundColor")||g,"border-color":b.borderColor||e||d.borderColor||f||c.opt("eventBorderColor")||g,color:b.textColor||d.textColor||c.opt("eventTextColor")}},/* Converting events -> eventRange -> eventSpan -> eventSegs - ------------------------------------------------------------------------------------------------------------------*/ -// Generates an array of segments for the given single event -// Can accept an event "location" as well (which only has start/end and no allDay) -eventToSegs:function(a){return this.eventsToSegs([a])},eventToSpan:function(a){return this.eventToSpans(a)[0]}, -// Generates spans (always unzoned) for the given event. -// Does not do any inverting for inverse-background events. -// Can accept an event "location" as well (which only has start/end and no allDay) -eventToSpans:function(a){var b=this.eventToRange(a);return this.eventRangeToSpans(b,a)}, -// Converts an array of event objects into an array of event segment objects. -// A custom `segSliceFunc` may be given for arbitrarily slicing up events. -// Doesn't guarantee an order for the resulting array. -eventsToSegs:function(b,c){var d=this,e=Da(b),f=[];return a.each(e,function(a,b){var e,g=[];for(e=0;eh&&g.push({start:h,end:c.start}),h=c.end; -// add the span of time after the last event (if there is any) -// compare millisecond time (skip any ambig logic) -return f>h&&g.push({start:h,end:f}),g},sortEventSegs:function(a){a.sort(ga(this,"compareEventSegs"))}, -// A cmp function for determining which segments should take visual priority -compareEventSegs:function(a,b){// earlier events go first -// tie? longer events go first -// tie? put all-day events first (booleans cast to 0/1) -return a.eventStartMS-b.eventStartMS||b.eventDurationMS-a.eventDurationMS||b.event.allDay-a.event.allDay||F(a.event,b.event,this.view.eventOrderSpecs)}}),Ta.isBgEvent=Aa,/* External-Dragging-Element Data -----------------------------------------------------------------------------------------------------------------------*/ -// Require all HTML5 data-* attributes used by FullCalendar to have this prefix. -// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event. -Ta.dataAttrPrefix="";/* -A set of rendering and date-related methods for a visual component comprised of one or more rows of day columns. -Prerequisite: the object being mixed into needs to be a *Grid* -*/ -var qb=Ta.DayTableMixin={breakOnWeeks:!1,// should create a new row for each week? -dayDates:null,// whole-day dates for each column. left to right -dayIndices:null,// for each day from start, the offset -daysPerRow:null,rowCnt:null,colCnt:null,colHeadFormat:null, -// Populates internal variables used for date calculation and rendering -updateDayTable:function(){for(var a,b,c,d=this.view,e=this.start.clone(),f=-1,g=[],h=[];e.isBefore(this.end);)// loop each day from start to end -d.isHiddenDay(e)?g.push(f+.5):(f++,g.push(f),h.push(e.clone())),e.add(1,"days");if(this.breakOnWeeks){for(b=h[0].day(),a=1;ac?b[0]-1:c>=b.length?b[b.length-1]+1:b[c]},/* Options - ------------------------------------------------------------------------------------------------------------------*/ -// Computes a default column header formatting string if `colFormat` is not explicitly defined -computeColHeadFormat:function(){ -// if more than one week row, or if there are a lot of columns with not much space, -// put just the day numbers will be in each cell -// if more than one week row, or if there are a lot of columns with not much space, -// put just the day numbers will be in each cell -return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},/* Slicing - ------------------------------------------------------------------------------------------------------------------*/ -// Slices up a date range into a segment for every week-row it intersects with -sliceRangeByRow:function(a){var b,c,d,e,f,g=this.daysPerRow,h=this.view.computeDayRange(a),i=this.getDateDayIndex(h.start),j=this.getDateDayIndex(h.end.clone().subtract(1,"days")),k=[];// inclusive day-index range for segment -for(b=0;b=e&&k.push({row:b,firstRowDayIndex:e-c,lastRowDayIndex:f-c,isStart:e===i,isEnd:f===j});return k}, -// Slices up a date range into a segment for every day-cell it intersects with. -// TODO: make more DRY with sliceRangeByRow somehow. -sliceRangeByDay:function(a){var b,c,d,e,f,g,h=this.daysPerRow,i=this.view.computeDayRange(a),j=this.getDateDayIndex(i.start),k=this.getDateDayIndex(i.end.clone().subtract(1,"days")),l=[];// inclusive day-index range for segment -for(b=0;b=e;e++)f=Math.max(j,e),g=Math.min(k,e),f=Math.ceil(f),g=Math.floor(g),g>=f&&l.push({row:b,firstRowDayIndex:f-c,lastRowDayIndex:g-c,isStart:f===j,isEnd:g===k});return l},/* Header Rendering - ------------------------------------------------------------------------------------------------------------------*/ -renderHeadHtml:function(){var a=this.view;return'
    '+this.renderHeadTrHtml()+"
    "},renderHeadIntroHtml:function(){return this.renderIntroHtml()},renderHeadTrHtml:function(){return""+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+""},renderHeadDateCellsHtml:function(){var a,b,c=[];for(a=0;a1?' colspan="'+b+'"':"")+(c?" "+c:"")+">"+aa(a.format(this.colHeadFormat))+""},/* Background Rendering - ------------------------------------------------------------------------------------------------------------------*/ -renderBgTrHtml:function(a){return""+(this.isRTL?"":this.renderBgIntroHtml(a))+this.renderBgCellsHtml(a)+(this.isRTL?this.renderBgIntroHtml(a):"")+""},renderBgIntroHtml:function(a){return this.renderIntroHtml()},renderBgCellsHtml:function(a){var b,c,d=[];for(b=0;b"},/* Generic - ------------------------------------------------------------------------------------------------------------------*/ -// Generates the default HTML intro for any row. User classes should override -renderIntroHtml:function(){}, -// TODO: a generic method for dealing with , RTL, intro -// when increment internalApiVersion -// wrapTr (scheduler) -/* Utils - ------------------------------------------------------------------------------------------------------------------*/ -// Applies the generic "intro" and "outro" HTML to the given cells. -// Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro. -bookendCells:function(a){var b=this.renderIntroHtml();b&&(this.isRTL?a.append(b):a.prepend(b))}},rb=Ta.DayGrid=pb.extend(qb,{numbersVisible:!1,// should render a row for day/week numbers? set by outside view. TODO: make internal -bottomCoordPadding:0,// hack for extending the hit area for the last row of the coordinate grid -rowEls:null,// set of fake row elements -cellEls:null,// set of whole-day elements comprising the row's background -helperEls:null,// set of cell skeleton elements for rendering the mock event "helper" -rowCoordCache:null,colCoordCache:null, -// Renders the rows and columns into the component's `this.el`, which should already be assigned. -// isRigid determins whether the individual rows should ignore the contents and be a constant height. -// Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient. -renderDates:function(a){var b,c,d=this.view,e=this.rowCnt,f=this.colCnt,g="";for(b=0;e>b;b++)g+=this.renderDayRowHtml(b,a); -// trigger dayRender with each cell's element -for(this.el.html(g),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day"),this.rowCoordCache=new lb({els:this.rowEls,isVertical:!0}),this.colCoordCache=new lb({els:this.cellEls.slice(0,this.colCnt),// only the first row -isHorizontal:!0}),b=0;e>b;b++)for(c=0;f>c;c++)d.trigger("dayRender",null,this.getCellDate(b,c),this.getCellEl(b,c))},unrenderDates:function(){this.removeSegPopover()},renderBusinessHours:function(){var a=this.view.calendar.getBusinessHoursEvents(!0),b=this.eventsToSegs(a);this.renderFill("businessHours",b,"bgevent")}, -// Generates the HTML for a single row, which is a div that wraps a table. -// `row` is the row number. -renderDayRowHtml:function(a,b){var c=this.view,d=["fc-row","fc-week",c.widgetContentClass];return b&&d.push("fc-rigid"),'
    '+this.renderBgTrHtml(a)+'
    '+(this.numbersVisible?""+this.renderNumberTrHtml(a)+"":"")+"
    "},/* Grid Number Rendering - ------------------------------------------------------------------------------------------------------------------*/ -renderNumberTrHtml:function(a){return""+(this.isRTL?"":this.renderNumberIntroHtml(a))+this.renderNumberCellsHtml(a)+(this.isRTL?this.renderNumberIntroHtml(a):"")+""},renderNumberIntroHtml:function(a){return this.renderIntroHtml()},renderNumberCellsHtml:function(a){var b,c,d=[];for(b=0;bs of the "number" row in the DayGrid's content skeleton. -// The number row will only exist if either day numbers or week numbers are turned on. -renderNumberCellHtml:function(a){var b;return this.view.dayNumbersVisible?(b=this.getDayClasses(a),b.unshift("fc-day-number"),''+a.date()+""):""},/* Options - ------------------------------------------------------------------------------------------------------------------*/ -// Computes a default event time formatting string if `timeFormat` is not explicitly defined -computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")}, -// Computes a default `displayEventEnd` value if one is not expliclty defined -computeDisplayEventEnd:function(){return 1==this.colCnt},/* Dates - ------------------------------------------------------------------------------------------------------------------*/ -rangeUpdated:function(){this.updateDayTable()}, -// Slices up the given span (unzoned start/end with other misc data) into an array of segments -spanToSegs:function(a){var b,c,d=this.sliceRangeByRow(a);for(b=0;b');g=c&&c.row===b?c.el.position().top:h.find(".fc-content-skeleton tbody").position().top,i.css("top",g).find("table").append(d[b].tbodyEl),h.append(i),e.push(i[0])}),this.helperEls=a(e)}, -// Unrenders any visual indication of a mock helper event -unrenderHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},/* Fill System (highlight, background events, business hours) - ------------------------------------------------------------------------------------------------------------------*/ -fillSegTag:"td",// override the default tag name -// Renders a set of rectangles over the given segments of days. -// Only returns segments that successfully rendered. -renderFill:function(b,c,d){var e,f,g,h=[];// assignes `.el` to each seg. returns successfully rendered segs -for(c=this.renderFillSegEls(b,c),e=0;e
    '),f=e.find("tr"),h>0&&f.append(''),f.append(c.el.attr("colspan",i-h)),g>i&&f.append(''),this.bookendCells(f),e}});/* Event-rendering methods for the DayGrid class -----------------------------------------------------------------------------------------------------------------------*/ -rb.mixin({rowStructs:null,// an array of objects, each holding information about a row's foreground event-rendering -// Unrenders all events currently rendered on the grid -unrenderEvents:function(){this.removeSegPopover(),// removes the "more.." events popover -pb.prototype.unrenderEvents.apply(this,arguments)}, -// Retrieves all rendered segment objects currently rendered on the grid -getEventSegs:function(){return pb.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])}, -// Renders the given background event segments onto the grid -renderBgSegs:function(b){ -// don't render timed background events -var c=a.grep(b,function(a){return a.event.allDay});return pb.prototype.renderBgSegs.call(this,c)}, -// Renders the given foreground event segments onto the grid -renderFgSegs:function(b){var c; -// render an `.el` on each seg -// returns a subset of the segs. segs that were actually rendered -// append to each row's content skeleton -return b=this.renderFgSegEls(b),c=this.rowStructs=this.renderSegRows(b),this.rowEls.each(function(b,d){a(d).find(".fc-content-skeleton > table").append(c[b].tbodyEl)}),b}, -// Unrenders all currently rendered foreground event segments -unrenderFgSegs:function(){for(var a,b=this.rowStructs||[];a=b.pop();)a.tbodyEl.remove();this.rowStructs=null}, -// Uses the given events array to generate elements that should be appended to each row's content skeleton. -// Returns an array of rowStruct objects (see the bottom of `renderSegRow`). -// PRECONDITION: each segment shoud already have a rendered and assigned `.el` -renderSegRows:function(a){var b,c,d=[];// group into nested arrays -// iterate each row of segment groupings -for(b=this.groupSegRows(a),c=0;c'+aa(c)+"")),d=''+(aa(f.title||"")||" ")+"",'
    '+(this.isRTL?d+" "+l:l+" "+d)+"
    "+(h?'
    ':"")+(i?'
    ':"")+""}, -// Given a row # and an array of segments all in the same row, render a element, a skeleton that contains -// the segments. Returns object with a bunch of internal data about how the render was calculated. -// NOTE: modifies rowSegs -renderSegRow:function(b,c){ -// populates empty cells from the current column (`col`) to `endCol` -function d(b){for(;b>g;)k=(r[e-1]||[])[g],k?k.attr("rowspan",parseInt(k.attr("rowspan")||1,10)+1):(k=a(""),h.append(k)),q[e][g]=k,r[e][g]=k,g++}var e,f,g,h,i,j,k,l=this.colCnt,m=this.buildSegLevels(c),n=Math.max(1,m.length),o=a(""),p=[],q=[],r=[];for(e=0;n>e;e++){ -// levelCnt might be 1 even though there are no actual levels. protect against this. -// this single empty row is useful for styling. -if(f=m[e],g=0,h=a(""),p.push([]),q.push([]),r.push([]),f)for(i=0;i').append(j.el),j.leftCol!=j.rightCol?k.attr("colspan",j.rightCol-j.leftCol+1):// a single-column segment -r[e][g]=k;g<=j.rightCol;)q[e][g]=k,p[e][g]=j,g++;h.append(k)}d(l),// finish off the row -this.bookendCells(h),o.append(h)}return{// a "rowStruct" -row:b,// the row number -tbodyEl:o,cellMatrix:q,segMatrix:p,segLevels:m,segs:c}}, -// Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. -// NOTE: modifies segs -buildSegLevels:function(a){var b,c,d,e=[];for( -// Give preference to elements with certain criteria, so they have -// a chance to be closer to the top. -this.sortEventSegs(a),b=0;b at a time and stop when we find one out of bounds -for(d=0;d td > :first-child").each(c),e.position().top+f>h)return d;return!1}, -// Limits the given grid row to the maximum number of levels and injects "more" links if necessary. -// `row` is the row number. -// `levelLimit` is a number for the maximum (inclusive) number of levels allowed. -limitRow:function(b,c){ -// Iterates through empty level cells and places "more" links inside if need be -function d(d){// goes from current `col` to `endCol` -for(;d>w;)j=t.getCellSegs(b,w,c),j.length&&(m=f[c-1][w],s=t.renderMoreLink(b,w,j),r=a("
    ").append(s),m.append(r),v.push(r[0])),w++}var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t=this,u=this.rowStructs[b],v=[],w=0;if(c&&c for each column the segment occupies. will be one for each colspan -for(m=f[c-1][i.leftCol],n=m.attr("rowspan")||1,o=[],p=0;p').attr("rowspan",n),j=l[p],s=this.renderMoreLink(b,i.leftCol+p,[i].concat(j)),r=a("
    ").append(s),q.append(r),o.push(q[0]),v.push(q[0]);m.addClass("fc-limited").after(a(o)),// hide original and inject replacements -g.push(m[0])}}d(this.colCnt),// finish off the level -u.moreEls=a(v),// for easy undoing later -u.limitedEls=a(g)}}, -// Reveals all levels and removes all "more"-related elements for a grid's row. -// `row` is a row number. -unlimitRow:function(a){var b=this.rowStructs[a];b.moreEls&&(b.moreEls.remove(),b.moreEls=null),b.limitedEls&&(b.limitedEls.removeClass("fc-limited"),b.limitedEls=null)}, -// Renders an element that represents hidden event element for a cell. -// Responsible for attaching click handler as well. -renderMoreLink:function(b,c,d){var e=this,f=this.view;return a('').text(this.getMoreLinkText(d.length)).on("click",function(g){var h=f.opt("eventLimitClick"),i=e.getCellDate(b,c),j=a(this),k=e.getCellEl(b,c),l=e.getCellSegs(b,c),m=e.resliceDaySegs(l,i),n=e.resliceDaySegs(d,i);"function"==typeof h&&( -// the returned value can be an atomic option -h=f.trigger("eventLimitClick",null,{date:i,dayEl:k,moreEl:j,segs:m,hiddenSegs:n},g)),"popover"===h?e.showSegPopover(b,c,j,m):"string"==typeof h&&// a view name -f.calendar.zoomTo(i,h)})}, -// Reveals the popover that displays all events within a cell -showSegPopover:function(a,b,c,d){var e,f,g=this,h=this.view,i=c.parent();e=1==this.rowCnt?h.el:this.rowEls.eq(a),f={className:"fc-more-popover",content:this.renderSegPopoverContent(a,b,d),parentEl:this.el,top:e.offset().top,autoHide:!0,viewportConstrain:h.opt("popoverViewportConstrain"),hide:function(){g.segPopover.removeElement(),g.segPopover=null,g.popoverSegs=null}},this.isRTL?f.right=i.offset().left+i.outerWidth()+1:f.left=i.offset().left-1,this.segPopover=new kb(f),this.segPopover.show()}, -// Builds the inner DOM contents of the segment popover -renderSegPopoverContent:function(b,c,d){var e,f=this.view,g=f.opt("theme"),h=this.getCellDate(b,c).format(f.opt("dayPopoverFormat")),i=a('
    '+aa(h)+'
    '),j=i.find(".fc-event-container");for(d=this.renderFgSegEls(d,!0),this.popoverSegs=d,e=0;e'+this.renderBgTrHtml(0)+'
    '+this.renderSlatRowHtml()+"
    "}, -// Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. -renderSlatRowHtml:function(){ -// Calculate the time for each slot -for(var a,c,d,e=this.view,f=this.isRTL,g="",h=b.duration(+this.minTime);h"+(c?""+aa(a.format(this.labelFormat))+"":"")+"",g+='"+(f?"":d)+''+(f?d:"")+"",h.add(this.slotDuration);return g},/* Options - ------------------------------------------------------------------------------------------------------------------*/ -// Parses various options into properties of this object -processOptions:function(){var c,d=this.view,e=d.opt("slotDuration"),f=d.opt("snapDuration");e=b.duration(e),f=f?b.duration(f):e,this.slotDuration=e,this.snapDuration=f,this.snapsPerSlot=e/f,this.minResizeDuration=f,this.minTime=b.duration(d.opt("minTime")),this.maxTime=b.duration(d.opt("maxTime")),c=d.opt("slotLabelFormat"),a.isArray(c)&&(c=c[c.length-1]),this.labelFormat=c||d.opt("axisFormat")||d.opt("smallTimeFormat"),c=d.opt("slotLabelInterval"),this.labelInterval=c?b.duration(c):this.computeLabelInterval(e)}, -// Computes an automatic value for slotLabelInterval -computeLabelInterval:function(a){var c,d,e; -// find the smallest stock label interval that results in more than one slots-per-label -for(c=Jb.length-1;c>=0;c--)if(d=b.duration(Jb[c]),e=P(d,a),fa(e)&&e>1)return d;return b.duration(a)}, -// Computes a default event time formatting string if `timeFormat` is not explicitly defined -computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")}, -// Computes a default `displayEventEnd` value if one is not expliclty defined -computeDisplayEventEnd:function(){return!0},/* Hit System - ------------------------------------------------------------------------------------------------------------------*/ -prepareHits:function(){this.colCoordCache.build(),this.slatCoordCache.build()},releaseHits:function(){this.colCoordCache.clear()},queryHit:function(a,b){var c=this.snapsPerSlot,d=this.colCoordCache,e=this.slatCoordCache,f=d.getHorizontalIndex(a),g=e.getVerticalIndex(b);if(null!=f&&null!=g){var h=e.getTopOffset(g),i=e.getHeight(g),j=(b-h)/i,k=Math.floor(j*c),l=g*c+k,m=h+k/c*i,n=h+(k+1)/c*i;return{col:f,snap:l,component:this,// needed unfortunately :( -left:d.getLeftOffset(f),right:d.getRightOffset(f),top:m,bottom:n}}},getHitSpan:function(a){var b,c=this.getCellDate(0,a.col),d=this.computeSnapTime(a.snap);return c.time(d),b=c.clone().add(this.snapDuration),{start:c,end:b}},getHitEl:function(a){return this.colEls.eq(a.col)},/* Dates - ------------------------------------------------------------------------------------------------------------------*/ -rangeUpdated:function(){this.updateDayTable()}, -// Given a row number of the grid, representing a "snap", returns a time (Duration) from its start-of-day -computeSnapTime:function(a){return b.duration(this.minTime+this.snapDuration*a)}, -// Slices up the given span (unzoned start/end with other misc data) into an array of segments -spanToSegs:function(a){var b,c=this.sliceRangeByTimes(a);for(b=0;b
    ').css("top",e).appendTo(this.colContainerEls.eq(d[c].col))[0]); -// render an arrow over the axis -d.length>0&&// is the current time in view? -f.push(a('
    ').css("top",e).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=a(f)},unrenderNowIndicator:function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},/* Selection - ------------------------------------------------------------------------------------------------------------------*/ -// Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight. -renderSelection:function(a){this.view.opt("selectHelper")?// this setting signals that a mock helper event should be rendered -// normally acceps an eventLocation, span has a start/end, which is good enough -this.renderEventLocationHelper(a):this.renderHighlight(a)}, -// Unrenders any visual indication of a selection -unrenderSelection:function(){this.unrenderHelper(),this.unrenderHighlight()},/* Highlight - ------------------------------------------------------------------------------------------------------------------*/ -renderHighlight:function(a){this.renderHighlightSegs(this.spanToSegs(a))},unrenderHighlight:function(){this.unrenderHighlightSegs()}});/* Methods for rendering SEGMENTS, pieces of content that live on the view - ( this file is no longer just for events ) -----------------------------------------------------------------------------------------------------------------------*/ -sb.mixin({colContainerEls:null,// containers for each column -// inner-containers for each column where different types of segs live -fgContainerEls:null,bgContainerEls:null,helperContainerEls:null,highlightContainerEls:null,businessContainerEls:null, -// arrays of different types of displayed segments -fgSegs:null,bgSegs:null,helperSegs:null,highlightSegs:null,businessSegs:null, -// Renders the DOM that the view's content will live in -renderContentSkeleton:function(){var b,c,d="";for(b=0;b
    ';c=a('
    '+d+"
    "),this.colContainerEls=c.find(".fc-content-col"),this.helperContainerEls=c.find(".fc-helper-container"),this.fgContainerEls=c.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=c.find(".fc-bgevent-container"),this.highlightContainerEls=c.find(".fc-highlight-container"),this.businessContainerEls=c.find(".fc-business-container"),this.bookendCells(c.find("tr")),this.el.append(c)},/* Foreground Events - ------------------------------------------------------------------------------------------------------------------*/ -renderFgSegs:function(a){return a=this.renderFgSegsIntoContainers(a,this.fgContainerEls),this.fgSegs=a,a},unrenderFgSegs:function(){this.unrenderNamedSegs("fgSegs")},/* Foreground Helper Events - ------------------------------------------------------------------------------------------------------------------*/ -renderHelperSegs:function(b,c){var d,e,f,g=[]; -// Try to make the segment that is in the same row as sourceSeg look the same -for(b=this.renderFgSegsIntoContainers(b,this.helperContainerEls),d=0;d' : - '' - ) + - */ -return k.unshift("fc-time-grid-event","fc-v-event"),f.isMultiDayEvent(g)?(a.isStart||a.isEnd)&&(c=this.getEventTimeText(a),d=this.getEventTimeText(a,"LT"),e=this.getEventTimeText(a,null,!1)):(c=this.getEventTimeText(g),d=this.getEventTimeText(g,"LT"),e=this.getEventTimeText(g,null,!1)),'
    '+(c?'
    '+aa(c)+"
    ":"")+(g.title?'
    '+aa(g.title)+"
    ":"")+'
    '+(j?'
    ':"")+""},/* Seg Position Utils - ------------------------------------------------------------------------------------------------------------------*/ -// Refreshes the CSS top/bottom coordinates for each segment element. -// Works when called after initial render, after a window resize/zoom for example. -updateSegVerticals:function(a){this.computeSegVerticals(a),this.assignSegVerticals(a)}, -// For each segment in an array, computes and assigns its top and bottom properties -computeSegVerticals:function(a){var b,c;for(b=0;b1?"ll":"LL"}, -// Utility for formatting a range. Accepts a range object, formatting string, and optional separator. -// Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account. -// The timezones of the dates within `range` will be respected. -formatRange:function(a,b,c){var d=a.end;// all-day? -return d.hasTime()||(d=d.clone().subtract(1)),qa(a.start,d,b,c,this.opt("isRTL"))},/* Rendering - ------------------------------------------------------------------------------------------------------------------*/ -// Sets the container element that the view should render inside of. -// Does other DOM-related initializations. -setElement:function(a){this.el=a,this.bindGlobalHandlers()}, -// Removes the view's container element from the DOM, clearing any content beforehand. -// Undoes any other DOM-related attachments. -removeElement:function(){this.clear(),// clears all content -// clean up the skeleton -this.isSkeletonRendered&&(this.unrenderSkeleton(),this.isSkeletonRendered=!1),this.unbindGlobalHandlers(),this.el.remove()}, -// Does everything necessary to display the view centered around the given unzoned date. -// Does every type of rendering EXCEPT rendering events. -// Is asychronous and returns a promise. -display:function(b){var c=this,d=null;return this.displaying&&(d=this.queryScroll()),this.calendar.freezeContentHeight(),this.clear().then(function(){// clear the content first (async) -return c.displaying=a.when(c.displayView(b)).then(function(){c.forceScroll(c.computeInitialScroll(d)),c.calendar.unfreezeContentHeight(),c.triggerRender()})})}, -// Does everything necessary to clear the content of the view. -// Clears dates and events. Does not clear the skeleton. -// Is asychronous and returns a promise. -clear:function(){var b=this,c=this.displaying;return c?c.then(function(){// wait for the display to finish -return b.displaying=null,b.clearEvents(),b.clearView()}):a.when()}, -// Displays the view's non-event content, such as date-related content or anything required by events. -// Renders the view's non-content skeleton if necessary. -// Can be asynchronous and return a promise. -displayView:function(a){this.isSkeletonRendered||(this.renderSkeleton(),this.isSkeletonRendered=!0),a&&this.setDate(a),this.render&&this.render(),this.renderDates(),this.updateSize(),this.renderBusinessHours(),// might need coordinates, so should go after updateSize() -this.startNowIndicator()}, -// Unrenders the view content that was rendered in displayView. -// Can be asynchronous and return a promise. -clearView:function(){this.unselect(),this.stopNowIndicator(),this.triggerUnrender(),this.unrenderBusinessHours(),this.unrenderDates(),this.destroy&&this.destroy()}, -// Renders the basic structure of the view before any content is rendered -renderSkeleton:function(){}, -// Unrenders the basic structure of the view -unrenderSkeleton:function(){}, -// Renders the view's date-related content. -// Assumes setRange has already been called and the skeleton has already been rendered. -renderDates:function(){}, -// Unrenders the view's date-related content -unrenderDates:function(){}, -// Signals that the view's content has been rendered -triggerRender:function(){this.trigger("viewRender",this,this,this.el)}, -// Signals that the view's content is about to be unrendered -triggerUnrender:function(){this.trigger("viewDestroy",this,this,this.el)}, -// Binds DOM handlers to elements that reside outside the view container, such as the document -bindGlobalHandlers:function(){this.listenTo(a(document),"mousedown",this.handleDocumentMousedown),this.listenTo(a(document),"touchstart",this.handleDocumentTouchStart),this.listenTo(a(document),"touchend",this.handleDocumentTouchEnd)}, -// Unbinds DOM handlers from elements that reside outside the view container -unbindGlobalHandlers:function(){this.stopListeningTo(a(document))}, -// Initializes internal variables related to theming -initThemingProps:function(){var a=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=a+"-widget-header",this.widgetContentClass=a+"-widget-content",this.highlightStateClass=a+"-state-highlight"},/* Business Hours - ------------------------------------------------------------------------------------------------------------------*/ -// Renders business-hours onto the view. Assumes updateSize has already been called. -renderBusinessHours:function(){}, -// Unrenders previously-rendered business-hours -unrenderBusinessHours:function(){},/* Now Indicator - ------------------------------------------------------------------------------------------------------------------*/ -// Immediately render the current time indicator and begins re-rendering it at an interval, -// which is defined by this.getNowIndicatorUnit(). -// TODO: somehow do this for the current whole day's background too -startNowIndicator:function(){var a,c,d,e=this;// ms wait value -this.opt("nowIndicator")&&(a=this.getNowIndicatorUnit(),a&&(c=ga(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=+new Date,this.renderNowIndicator(this.initialNowDate),this.isNowIndicatorRendered=!0,d=this.initialNowDate.clone().startOf(a).add(1,a)-this.initialNowDate,this.nowIndicatorTimeoutID=setTimeout(function(){e.nowIndicatorTimeoutID=null,c(),d=+b.duration(1,a),d=Math.max(100,d),e.nowIndicatorIntervalID=setInterval(c,d)},d)))}, -// rerenders the now indicator, computing the new current time from the amount of time that has passed -// since the initial getNow call. -updateNowIndicator:function(){this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add(new Date-this.initialNowQueriedMs)))}, -// Immediately unrenders the view's current time indicator and stops any re-rendering timers. -// Won't cause side effects if indicator isn't rendered. -stopNowIndicator:function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearTimeout(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)}, -// Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator -// should be refreshed. If something falsy is returned, no time indicator is rendered at all. -getNowIndicatorUnit:function(){}, -// Renders a current time indicator at the given datetime -renderNowIndicator:function(a){}, -// Undoes the rendering actions from renderNowIndicator -unrenderNowIndicator:function(){},/* Dimensions - ------------------------------------------------------------------------------------------------------------------*/ -// Refreshes anything dependant upon sizing of the container element of the grid -updateSize:function(a){var b;a&&(b=this.queryScroll()),this.updateHeight(a),this.updateWidth(a),this.updateNowIndicator(),a&&this.setScroll(b)}, -// Refreshes the horizontal dimensions of the calendar -updateWidth:function(a){}, -// Refreshes the vertical dimensions of the calendar -updateHeight:function(a){var b=this.calendar;// we poll the calendar for height information -this.setHeight(b.getSuggestedViewHeight(),b.isHeightAuto())}, -// Updates the vertical dimensions of the calendar to the specified height. -// if `isAuto` is set to true, height becomes merely a suggestion and the view should use its "natural" height. -setHeight:function(a,b){},/* Scroller - ------------------------------------------------------------------------------------------------------------------*/ -// Computes the initial pre-configured scroll state prior to allowing the user to change it. -// Given the scroll state from the previous rendering. If first time rendering, given null. -computeInitialScroll:function(a){return 0}, -// Retrieves the view's current natural scroll state. Can return an arbitrary format. -queryScroll:function(){}, -// Sets the view's scroll state. Will accept the same format computeInitialScroll and queryScroll produce. -setScroll:function(a){}, -// Sets the scroll state, making sure to overcome any predefined scroll value the browser has in mind -forceScroll:function(a){var b=this;this.setScroll(a),setTimeout(function(){b.setScroll(a)},0)},/* Event Elements / Segments - ------------------------------------------------------------------------------------------------------------------*/ -// Does everything necessary to display the given events onto the current view -displayEvents:function(a){var b=this.queryScroll();this.clearEvents(),this.renderEvents(a),this.isEventsRendered=!0,this.setScroll(b),this.triggerEventRender()}, -// Does everything necessary to clear the view's currently-rendered events -clearEvents:function(){var a;this.isEventsRendered&&(a=this.queryScroll(),this.triggerEventUnrender(),this.destroyEvents&&this.destroyEvents(),this.unrenderEvents(),this.setScroll(a),this.isEventsRendered=!1)}, -// Renders the events onto the view. -renderEvents:function(a){}, -// Removes event elements from the view. -unrenderEvents:function(){}, -// Signals that all events have been rendered -triggerEventRender:function(){this.renderedEventSegEach(function(a){this.trigger("eventAfterRender",a.event,a.event,a.el)}),this.trigger("eventAfterAllRender")}, -// Signals that all event elements are about to be removed -triggerEventUnrender:function(){this.renderedEventSegEach(function(a){this.trigger("eventDestroy",a.event,a.event,a.el)})}, -// Given an event and the default element used for rendering, returns the element that should actually be used. -// Basically runs events and elements through the eventRender hook. -resolveEventEl:function(b,c){var d=this.trigger("eventRender",b,b,c);// means don't render at all -return d===!1?c=null:d&&d!==!0&&(c=a(d)),c}, -// Hides all rendered event segments linked to the given event -showEvent:function(a){this.renderedEventSegEach(function(a){a.el.css("visibility","")},a)}, -// Shows all rendered event segments linked to the given event -hideEvent:function(a){this.renderedEventSegEach(function(a){a.el.css("visibility","hidden")},a)}, -// Iterates through event segments that have been rendered (have an el). Goes through all by default. -// If the optional `event` argument is specified, only iterates through segments linked to that event. -// The `this` value of the callback function will be the view. -renderedEventSegEach:function(a,b){var c,d=this.getEventSegs();for(c=0;c