diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 8a6c48e0..00000000 --- a/CHANGELOG +++ /dev/null @@ -1,81 +0,0 @@ -CHANGELOG -========= - -2014-11-26, v1.1.4 ------------------- - -* Bugfix: renamed sort field fixed -* Bugfix: nullable relation fix - -2014-11-17, v1.1.3 ------------------- - -* Bugfix: Unique validation rule fixed - -2014-11-08, v1.1.2 ------------------- - -* Custom column now can be subclass of \SleepingOwl\Admin\Columns\Column\BaseColumn - -2014-11-08, v1.1.1 ------------------- - -* Demo file User.php updated to support php 5.4 - -2014-11-04, v1.1.0 ------------------- - -* New column type: action. Use it to add custom buttons to the tableview. See documentation for details - -2014-10-29, v1.0.10 ------------------- - -* Bugfix: Administrator username maximum length reduced to 190 to support utf8mb4 charset. Fix issue #1 - -2014-10-20, v1.0.9 ------------------- - -* Bugfix: Fixed bug with wrong date format - -2014-10-20, v1.0.8 ------------------- - -* New way to add validation rules to form elements and combine it with old method - -2014-10-16, v1.0.7 ------------------- - -* New exception when "intl" extension not installed - -2014-10-16, v1.0.6 ------------------- - -* Bugfix: Default admin credentials seeding fixed - -2014-10-16, v1.0.5 ------------------- - -* PHP 5.4 support added - -2014-10-16, v1.0.4 ------------------- - -* ValidationException handler moved to service provider -* Bugfix: Menu with subitems icon problem solved - -2014-10-15, v1.0.3 ------------------- - -* Image info speed improvements -* Model compiler template update -* Added user-friendly error message for missing getList method - -2014-10-15, v1.0.2 ------------------- - -* Global validation exception handler added - -2014-10-13, v1.0.0 ------------------- - -* Initial Version diff --git a/README.md b/README.md index 06e40c21..cde6792a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Latest Stable Version](https://poser.pugx.org/sleeping-owl/admin/v/stable.svg)](https://packagist.org/packages/sleeping-owl/admin) [![License](https://poser.pugx.org/sleeping-owl/admin/license.svg)](https://packagist.org/packages/sleeping-owl/admin) -*Note: if you are looking for the version for Laravel 4.2 check out [laravel-4.2 branch](https://github.com/sleeping-owl/admin/tree/laravel-4.2).* +*Note: this is development version. If you are looking for stable version check out [master branch](https://github.com/sleeping-owl/admin).* SleepingOwl Admin is administrative interface builder for Laravel. @@ -12,8 +12,9 @@ It includes: - [sb-admin-2 template](http://startbootstrap.com/template-overviews/sb-admin-2/) - [jQuery 1.11.0](http://jquery.org) - [Bootstrap v3.2.0](http://getbootstrap.com) - - [Bootstrap Multiselect v0.9.8](https://github.com/davidstutz/bootstrap-multiselect) + - [Chosen v1.4.2](http://harvesthq.github.io/chosen/) - [DataTables 1.10.0-dev](http://www.sprymedia.co.uk) + - [Nestable jQuery Plugin](http://dbushell.github.io/Nestable/) - [Lightbox for Bootstrap 3](https://github.com/ashleydw/lightbox) - [Font Awesome 4.1.0](http://fontawesome.io) - [Metismenu 1.0.3](https://github.com/onokumus/metisMenu) @@ -21,30 +22,29 @@ It includes: - [bootbox.js v4.3.0](http://bootboxjs.com) - [Bootstrap datetimepicker](http://eonasdan.github.io/bootstrap-datetimepicker/) - [CKEditor](http://ckeditor.com) + - [flow.js](https://github.com/flowjs/flow.js) ## Installation - 1. Require this package in your composer.json and run composer update (or run `composer require sleeping-owl/admin:dev-laravel-5` directly): + 1. Require this package in your composer.json and run composer update: - "sleeping-owl/admin": "2.*" + "sleeping-owl/admin": "dev-development" 2. After composer update, add service providers to the `config/app.php` 'SleepingOwl\Admin\AdminServiceProvider', - 'Illuminate\Html\HtmlServiceProvider', 3. Add this to the facades in `config/app.php`: - 'Admin' => 'SleepingOwl\Admin\Admin', - 'AdminAuth' => 'SleepingOwl\AdminAuth\Facades\AdminAuth', - 'AdminRouter' => 'SleepingOwl\Admin\Facades\AdminRouter', - 'AssetManager' => 'SleepingOwl\Admin\AssetManager\AssetManager', - 'Column' => 'SleepingOwl\Admin\Columns\Column', - 'FormItem' => 'SleepingOwl\Admin\Models\Form\FormItem', - 'ModelItem' => 'SleepingOwl\Admin\Models\ModelItem', - - 'Form' => 'Illuminate\Html\FormFacade', - 'Html' => 'Illuminate\Html\HtmlFacade', + 'Admin' => 'SleepingOwl\Admin\Admin', + 'AdminAuth' => 'SleepingOwl\AdminAuth\Facades\AdminAuth', + 'Column' => 'SleepingOwl\Admin\Columns\Column', + 'ColumnFilter' => 'SleepingOwl\Admin\ColumnFilters\ColumnFilter', + 'Filter' => 'SleepingOwl\Admin\Filter\Filter', + 'AdminDisplay' => 'SleepingOwl\Admin\Display\AdminDisplay', + 'AdminForm' => 'SleepingOwl\Admin\Form\AdminForm', + 'AdminTemplate' => 'SleepingOwl\Admin\Templates\Facade\AdminTemplate', + 'FormItem' => 'SleepingOwl\Admin\FormItems\FormItem', 4. Run this command in terminal (if you want to know what exactly this command makes, see [install command documentation](http://sleeping-owl.github.io/en/Commands/Install.html)): @@ -52,17 +52,16 @@ It includes: ## Documentation -Documentation can be found at [sleeping owl documentation](http://sleeping-owl.github.io). -You can also find it in the `/src/docs` directory. +Documentation can be found at [sleeping owl documentation](http://sleeping-owl.github.io/v3). ## Demo Application -View [live demo](http://sleepingowladmindemo.cloudcontrolled.com). +View [live demo](http://sleepingowladmindemo2.cloudcontrolled.com). ## Support Library -You can donate via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=AXJMWMRPCBGVA) or in BTC: 13k36pym383rEmsBSLyWfT3TxCQMN2Lekd +You can donate via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=AXJMWMRPCBGVA), Yandex money (410012943296949) or in BTC: 13k36pym383rEmsBSLyWfT3TxCQMN2Lekd ## Copyright and License -Admin was written by Sleeping Owl for the Laravel framework and is released under the MIT License. See the LICENSE file for details. +Admin was written by Sleeping Owl for the Laravel framework and is released under the MIT License. See the LICENSE file for details. \ No newline at end of file diff --git a/composer.json b/composer.json index af2a7aa9..51204afb 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,12 @@ "name": "sleeping-owl/admin", "description": "Aministrative interface builder for Laravel.", "homepage": "http://sleeping-owl.github.io", - "keywords": ["laravel", "admin", "administrator"], + "keywords": [ + "laravel", + "admin", + "administrator", + "crud" + ], "license": "MIT", "authors": [ { @@ -13,23 +18,21 @@ "require": { "php": ">=5.4.0", "illuminate/support": "5.*", - "intervention/image": "2.*", - "intervention/imagecache": "2.*", - "doctrine/dbal": "~2.3", - "sleeping-owl/with-join": "1.*", - "illuminate/html": "~5.0" + "doctrine/dbal": "~2.3" }, "require-dev": { "phpunit/phpunit": "4.*", - "mockery/mockery": "0.9.*" + "orchestra/testbench": "3.*" }, "autoload": { "psr-0": { - "SleepingOwl\\Admin": "src/", - "SleepingOwl\\DateFormatter": "src/", - "SleepingOwl\\Html": "src/", - "SleepingOwl\\Models": "src/", - "SleepingOwl\\RandomFilenamer": "src/" + "SleepingOwl\\Admin": "src/" } + }, + "autoload-dev": { + "classmap": [ + "tests/TestBase.php", + "tests/models" + ] } } diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index fc3d971d..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,30 +0,0 @@ -var gulp = require('gulp'); -var concat = require('gulp-concat'); -var uglify = require('gulp-uglify'); -var concatCSS = require('gulp-concat-css'); -var minifyCSS = require('gulp-minify-css'); -var notify = require('gulp-notify'); - -var src = './resources/'; -var dest = './public/'; -gulp.task('css', function () { - gulp.src(src + 'css/*.css') - .pipe(concatCSS('all.min.css')) - .pipe(minifyCSS({keepSpecialComments:0})) - .pipe(gulp.dest(dest)) - .pipe(notify('Minified CSS created.')); -}); - -gulp.task('js', function () { - gulp.src([src + 'js/jquery-1.11.0.js', src + 'js/plugins/**/*.js', src + 'js/*.js']) - .pipe(concat('all.min.js')) - .pipe(uglify()) - .pipe(gulp.dest(dest)) - .pipe(notify('Minified JS created.')); -}); - -gulp.task('default', function () { - gulp.run(['js', 'css']); - gulp.watch(src + 'js/*.js', ['js']); - gulp.watch(src + 'css/*.css', ['css']); -}); \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index d0104307..3347b75b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,9 +15,4 @@ ./tests/ - - - diff --git a/public/all.min.css b/public/all.min.css deleted file mode 100755 index 8ab0cd91..00000000 --- a/public/all.min.css +++ /dev/null @@ -1 +0,0 @@ -.inline-block{display:inline-block}#imageBrowser{max-height:300px;overflow-y:scroll}#imageBrowser .thumbnail{opacity:.7}#imageBrowser .thumbnail:hover{border-color:#428bca!important;opacity:1}.file-info{display:inline-block!important}.input-group-addon .fa-calendar,.input-group-addon .fa-clock-o{cursor:pointer}.form-group.datepicker,.form-group.timepicker{width:250px}#map{margin-bottom:15px}#map *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}#map ul{font-size:9px;line-height:12px}.dataTables_processing{position:absolute;left:50%;top:140px;margin-left:-35px}.img-container a{float:left}.img-container a+a{margin-left:20px}.img-container a.img-delete{color:#d9534f}.bootstrap-datetimepicker-widget{top:0;left:0;width:250px;padding:4px;margin-top:1px;z-index:99999!important;border-radius:4px}.bootstrap-datetimepicker-widget.timepicker-sbs{width:600px}.bootstrap-datetimepicker-widget.bottom:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:7px}.bootstrap-datetimepicker-widget.bottom:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:8px}.bootstrap-datetimepicker-widget.top:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.top:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;position:absolute;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget .dow{width:14.2857%}.bootstrap-datetimepicker-widget.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget>ul{list-style-type:none;margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget td.cw{font-size:10px;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget td.new,.bootstrap-datetimepicker-widget td.old{color:#777}.bootstrap-datetimepicker-widget td.today{position:relative}.bootstrap-datetimepicker-widget td.today:before{content:'';display:inline-block;border-left:7px solid transparent;border-bottom:7px solid #428bca;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget td span.old{color:#777}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget th.picker-switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-group.date .input-group-addon span{display:block;cursor:pointer;width:16px;height:16px}.bootstrap-datetimepicker-widget.left-oriented:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.left-oriented:after{left:auto;right:7px}.bootstrap-datetimepicker-widget ul.list-unstyled li div.timepicker div.timepicker-picker table.table-condensed tbody>tr>td{padding:0!important}@media screen and (max-width:767px){.bootstrap-datetimepicker-widget.timepicker-sbs{width:283px}}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li>label.multiselect-group{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}cite{font-style:normal}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-horizontal .form-group-sm .form-control,.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-horizontal .form-group-lg .form-control,.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active:focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin:8px -15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-print,.visible-print-block,.visible-print-inline,.visible-print-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}@media print{.visible-print-block{display:block!important}}@media print{.visible-print-inline{display:inline!important}}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}div.dataTables_length label{float:left;text-align:left;font-weight:400}div.dataTables_length select{width:75px}div.dataTables_filter label{float:right;font-weight:400}div.dataTables_filter input{width:16em}div.dataTables_info{padding-top:8px}div.dataTables_paginate{float:right;margin:0}div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}table.dataTable,table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable{clear:both;margin-top:6px!important;margin-bottom:6px!important;max-width:none!important}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer}table.dataTable th:active{outline:0}div.dataTables_scrollHead table{margin-bottom:0!important;border-bottom-left-radius:0;border-bottom-right-radius:0}div.dataTables_scrollHead table thead tr:last-child td:first-child,div.dataTables_scrollHead table thead tr:last-child th:first-child{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}div.dataTables_scrollBody table{margin-top:0!important;margin-bottom:0!important;border-top:none}div.dataTables_scrollBody tbody tr:first-child td,div.dataTables_scrollBody tbody tr:first-child th{border-top:none}div.dataTables_scrollFoot table{margin-top:0!important;border-top:none}.table tbody tr.active td,.table tbody tr.active th{color:#fff;background-color:#08C}.table tbody tr.active:hover td,.table tbody tr.active:hover th{background-color:#0075b0!important}.table tbody tr.active a{color:#fff}.table-striped tbody tr.active:nth-child(odd) td,.table-striped tbody tr.active:nth-child(odd) th{background-color:#017ebc}table.DTTT_selectable tbody tr{cursor:pointer}div.DTTT .btn{font-size:12px;color:#333!important}div.DTTT .btn:hover{text-decoration:none!important}ul.DTTT_dropdown.dropdown-menu{z-index:2003}ul.DTTT_dropdown.dropdown-menu a{color:#333!important}ul.DTTT_dropdown.dropdown-menu li{position:relative}ul.DTTT_dropdown.dropdown-menu li:hover a{color:#fff!important;background-color:#08c}div.DTTT_collection_background{z-index:2002}div.DTTT_print_info.modal{height:150px;margin-top:-75px;text-align:center}div.DTTT_print_info h6{margin:1em;font-size:28px;font-weight:400;line-height:28px}div.DTTT_print_info p{font-size:14px;line-height:20px}div.DTFC_LeftFootWrapper table,div.DTFC_LeftHeadWrapper table,div.DTFC_RightFootWrapper table,div.DTFC_RightHeadWrapper table,table.DTFC_Cloned tr.even{background-color:#fff}div.DTFC_LeftHeadWrapper table,div.DTFC_RightHeadWrapper table{margin-bottom:0!important;border-top-right-radius:0!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child,div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}div.DTFC_LeftBodyWrapper table,div.DTFC_RightBodyWrapper table{margin-bottom:0!important;border-top:none}div.DTFC_LeftBodyWrapper tbody tr:first-child td,div.DTFC_LeftBodyWrapper tbody tr:first-child th,div.DTFC_LeftFootWrapper table,div.DTFC_RightBodyWrapper tbody tr:first-child td,div.DTFC_RightBodyWrapper tbody tr:first-child th,div.DTFC_RightFootWrapper table{border-top:none}.ekko-lightbox-container{position:relative}.ekko-lightbox-nav-overlay{position:absolute;top:0;left:0;z-index:100;width:100%;height:100%}.ekko-lightbox-nav-overlay a{z-index:100;display:block;width:49%;height:100%;padding-top:45%;font-size:30px;color:#fff;text-shadow:2px 2px 4px #000;opacity:0;filter:dropshadow(color=#000000,offx=2,offy=2);-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.ekko-lightbox-nav-overlay a:empty{width:49%}.ekko-lightbox a:hover{text-decoration:none;opacity:1}.ekko-lightbox .glyphicon-chevron-left{left:0;float:left;padding-left:15px;text-align:left}.ekko-lightbox .glyphicon-chevron-right{right:0;float:right;padding-right:15px;text-align:right}.ekko-lightbox .modal-footer{text-align:left}@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?v=4.1.0);src:url(fonts/fontawesome-webfont.eot?#iefix&v=4.1.0) format('embedded-opentype'),url(fonts/fontawesome-webfont.woff?v=4.1.0) format('woff'),url(fonts/fontawesome-webfont.ttf?v=4.1.0) format('truetype'),url(fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1;-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:.08em solid #eee;border-radius:.1em}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.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-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-cog:before,.fa-gear: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-repeat:before,.fa-rotate-right: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-image:before,.fa-photo: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-exclamation-triangle:before,.fa-warning: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{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-cogs:before,.fa-gears: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:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.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-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder: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-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste: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-chain-broken:before,.fa-unlink: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-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won: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{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-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira: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-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board: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-square:before,.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-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-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-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.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-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-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"}.arrow{float:right}.glyphicon.arrow:before{content:"\e079"}.active>a>.glyphicon.arrow:before{content:"\e114"}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.plus-times{float:right}.fa.plus-times:before{content:"\f067"}.active>a>.fa.plus-times{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.plus-minus{float:right}.fa.plus-minus:before{content:"\f067"}.active>a>.fa.plus-minus:before{content:"\f068"}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,.8);border:2px solid rgba(230,230,230,.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:700;margin:.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:.1em 0}body{background-color:#f8f8f8}#wrapper{width:100%}#page-wrapper{padding:0 15px;min-height:568px;background-color:#fff}@media (min-width:768px){#page-wrapper{position:inherit;margin:0 0 0 250px;padding:0 30px;border-left:1px solid #e7e7e7}}.navbar-top-links li{display:inline-block}.navbar-top-links li:last-child{margin-right:15px}.navbar-top-links li a{padding:15px;min-height:50px}.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.sidebar .sidebar-nav.navbar-collapse{padding-right:0;padding-left:0}.sidebar .sidebar-search{padding:15px}.sidebar ul li{border-bottom:1px solid #e7e7e7}.sidebar ul li a.active{background-color:#eee}.sidebar .arrow{float:right}.sidebar .fa.arrow:before{content:"\f104"}.sidebar .active>a>.fa.arrow:before{content:"\f107"}.sidebar .nav-second-level li,.sidebar .nav-third-level li{border-bottom:0!important}.sidebar .nav-second-level li a{padding-left:37px}.sidebar .nav-third-level li a{padding-left:52px}@media (min-width:768px){.sidebar{z-index:1;position:absolute;width:250px;margin-top:51px}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{margin-left:auto}}.btn-outline{color:inherit;background-color:transparent;transition:all .5s}.btn-primary.btn-outline{color:#428bca}.btn-success.btn-outline{color:#5cb85c}.btn-info.btn-outline{color:#5bc0de}.btn-warning.btn-outline{color:#f0ad4e}.btn-danger.btn-outline{color:#d9534f}.btn-danger.btn-outline:hover,.btn-info.btn-outline:hover,.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-warning.btn-outline:hover{color:#fff}.chat{margin:0;padding:0;list-style:none}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #999}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0}.chat .glyphicon,.panel .slidedown .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}.login-panel{margin-top:25%}.flot-chart{display:block;height:400px}.flot-chart-content{width:100%;height:100%}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{background:0 0}table.dataTable thead .sorting_asc:after{content:"\f0de";float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,.5)}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.huge{font-size:40px}.panel-green{border-color:#5cb85c}.panel-green .panel-heading{border-color:#5cb85c;color:#fff;background-color:#5cb85c}.panel-green a{color:#5cb85c}.panel-green a:hover{color:#3d8b3d}.panel-red{border-color:#d9534f}.panel-red .panel-heading{border-color:#d9534f;color:#fff;background-color:#d9534f}.panel-red a{color:#d9534f}.panel-red a:hover{color:#b52b27}.panel-yellow{border-color:#f0ad4e}.panel-yellow .panel-heading{border-color:#f0ad4e;color:#fff;background-color:#f0ad4e}.panel-yellow a{color:#f0ad4e}.panel-yellow a:hover{color:#df8a13} \ No newline at end of file diff --git a/public/all.min.js b/public/all.min.js deleted file mode 100755 index 0e7a171b..00000000 --- a/public/all.min.js +++ /dev/null @@ -1,17 +0,0 @@ -if(!function(t,e){"object"==typeof module&&"object"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return e(t)}:e(t)}("undefined"!=typeof window?window:this,function(t,e){function n(t){var e=t.length,n=re.type(t);return"function"===n||re.isWindow(t)?!1:1===t.nodeType&&e?!0:"array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t}function i(t,e,n){if(re.isFunction(e))return re.grep(t,function(t,i){return!!e.call(t,i,t)!==n});if(e.nodeType)return re.grep(t,function(t){return t===e!==n});if("string"==typeof e){if(pe.test(e))return re.filter(e,t,n);e=re.filter(e,t)}return re.grep(t,function(t){return re.inArray(t,e)>=0!==n})}function a(t,e){do t=t[e];while(t&&1!==t.nodeType);return t}function r(t){var e=we[t]={};return re.each(t.match(be)||[],function(t,n){e[n]=!0}),e}function s(){me.addEventListener?(me.removeEventListener("DOMContentLoaded",o,!1),t.removeEventListener("load",o,!1)):(me.detachEvent("onreadystatechange",o),t.detachEvent("onload",o))}function o(){(me.addEventListener||"load"===event.type||"complete"===me.readyState)&&(s(),re.ready())}function l(t,e,n){if(void 0===n&&1===t.nodeType){var i="data-"+e.replace(Te,"-$1").toLowerCase();if(n=t.getAttribute(i),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:De.test(n)?re.parseJSON(n):n}catch(a){}re.data(t,e,n)}else n=void 0}return n}function d(t){var e;for(e in t)if(("data"!==e||!re.isEmptyObject(t[e]))&&"toJSON"!==e)return!1;return!0}function u(t,e,n,i){if(re.acceptData(t)){var a,r,s=re.expando,o=t.nodeType,l=o?re.cache:t,d=o?t[s]:t[s]&&s;if(d&&l[d]&&(i||l[d].data)||void 0!==n||"string"!=typeof e)return d||(d=o?t[s]=G.pop()||re.guid++:s),l[d]||(l[d]=o?{}:{toJSON:re.noop}),("object"==typeof e||"function"==typeof e)&&(i?l[d]=re.extend(l[d],e):l[d].data=re.extend(l[d].data,e)),r=l[d],i||(r.data||(r.data={}),r=r.data),void 0!==n&&(r[re.camelCase(e)]=n),"string"==typeof e?(a=r[e],null==a&&(a=r[re.camelCase(e)])):a=r,a}}function c(t,e,n){if(re.acceptData(t)){var i,a,r=t.nodeType,s=r?re.cache:t,o=r?t[re.expando]:re.expando;if(s[o]){if(e&&(i=n?s[o]:s[o].data)){re.isArray(e)?e=e.concat(re.map(e,re.camelCase)):e in i?e=[e]:(e=re.camelCase(e),e=e in i?[e]:e.split(" ")),a=e.length;for(;a--;)delete i[e[a]];if(n?!d(i):!re.isEmptyObject(i))return}(n||(delete s[o].data,d(s[o])))&&(r?re.cleanData([t],!0):ie.deleteExpando||s!=s.window?delete s[o]:s[o]=null)}}}function h(){return!0}function p(){return!1}function f(){try{return me.activeElement}catch(t){}}function m(t){var e=He.split("|"),n=t.createDocumentFragment();if(n.createElement)for(;e.length;)n.createElement(e.pop());return n}function _(t,e){var n,i,a=0,r=typeof t.getElementsByTagName!==xe?t.getElementsByTagName(e||"*"):typeof t.querySelectorAll!==xe?t.querySelectorAll(e||"*"):void 0;if(!r)for(r=[],n=t.childNodes||t;null!=(i=n[a]);a++)!e||re.nodeName(i,e)?r.push(i):re.merge(r,_(i,e));return void 0===e||e&&re.nodeName(t,e)?re.merge([t],r):r}function g(t){Ae.test(t.type)&&(t.defaultChecked=t.checked)}function y(t,e){return re.nodeName(t,"table")&&re.nodeName(11!==e.nodeType?e:e.firstChild,"tr")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}function v(t){return t.type=(null!==re.find.attr(t,"type"))+"/"+t.type,t}function b(t){var e=Ge.exec(t.type);return e?t.type=e[1]:t.removeAttribute("type"),t}function w(t,e){for(var n,i=0;null!=(n=t[i]);i++)re._data(n,"globalEval",!e||re._data(e[i],"globalEval"))}function M(t,e){if(1===e.nodeType&&re.hasData(t)){var n,i,a,r=re._data(t),s=re._data(e,r),o=r.events;if(o){delete s.handle,s.events={};for(n in o)for(i=0,a=o[n].length;a>i;i++)re.event.add(e,n,o[n][i])}s.data&&(s.data=re.extend({},s.data))}}function L(t,e){var n,i,a;if(1===e.nodeType){if(n=e.nodeName.toLowerCase(),!ie.noCloneEvent&&e[re.expando]){a=re._data(e);for(i in a.events)re.removeEvent(e,i,a.handle);e.removeAttribute(re.expando)}"script"===n&&e.text!==t.text?(v(e).text=t.text,b(e)):"object"===n?(e.parentNode&&(e.outerHTML=t.outerHTML),ie.html5Clone&&t.innerHTML&&!re.trim(e.innerHTML)&&(e.innerHTML=t.innerHTML)):"input"===n&&Ae.test(t.type)?(e.defaultChecked=e.checked=t.checked,e.value!==t.value&&(e.value=t.value)):"option"===n?e.defaultSelected=e.selected=t.defaultSelected:("input"===n||"textarea"===n)&&(e.defaultValue=t.defaultValue)}}function x(e,n){var i=re(n.createElement(e)).appendTo(n.body),a=t.getDefaultComputedStyle?t.getDefaultComputedStyle(i[0]).display:re.css(i[0],"display");return i.detach(),a}function D(t){var e=me,n=tn[t];return n||(n=x(t,e),"none"!==n&&n||(Ze=(Ze||re("'),this.modal_arrows?this.modal_arrows.css("display","none"):void 0},showVimeoVideo:function(t){var e,n,i;return e=500/281,i=this.$element.data("width")||560,i=this.checkDimensions(i),n=i/e,this.resize(i),this.lightbox_body.html(''),this.modal_arrows?this.modal_arrows.css("display","none"):void 0},showInstagramVideo:function(t){var e,n;return n=this.$element.data("width")||612,n=this.checkDimensions(n),e=n,this.resize(n),this.lightbox_body.html(''),this.modal_arrows?this.modal_arrows.css("display","none"):void 0},error:function(t){return this.lightbox_body.html(t),this},preloadImage:function(e,n){var i,a=this;return i=new Image,(null==n||n===!0)&&(i.onload=function(){var e;return e=t(""),e.attr("src",i.src),e.addClass("img-responsive"),a.lightbox_body.html(e),a.modal_arrows&&a.modal_arrows.css("display","block"),a.resize(i.width)},i.onerror=function(){return a.error("Failed to load image: "+e)}),i.src=e,i},resize:function(e){var n;return n=e+this.border.left+this.padding.left+this.padding.right+this.border.right,this.modal_dialog.css("width","auto").css("max-width",n),this.lightbox_container.find("a").css("padding-top",function(){return t(this).parent().height()/2}),this},checkDimensions:function(t){var e,n;return n=t+this.border.left+this.padding.left+this.padding.right+this.border.right,e=document.body.clientWidth,n>e&&(t=this.modal_body.width()),t},close:function(){return this.modal.modal("hide")},addTrailingSlash:function(t){return"/"!==t.substr(-1)&&(t+="/"),t}},t.fn.ekkoLightbox=function(n){return this.each(function(){var i;return i=t(this),n=t.extend({remote:i.attr("data-remote")||i.attr("href"),gallery_parent_selector:i.attr("data-parent"),type:i.attr("data-type")},n,i.data()),new e(this,n),this})},t.fn.ekkoLightbox.defaults={gallery_parent_selector:"*:not(.row)",left_arrow_class:".glyphicon .glyphicon-chevron-left",right_arrow_class:".glyphicon .glyphicon-chevron-right",directional_arrows:!0,type:null,always_show_close:!0,onShow:function(){},onShown:function(){},onHide:function(){},onHidden:function(){}}}.call(this),function(t){function e(t,e,n){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:n;default:throw new Error("Implement me")}}function n(t,e){return De.call(t,e)}function i(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function a(t){ve.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function r(t,e){var n=!0;return h(function(){return n&&(a(t),n=!1),e.apply(this,arguments)},e)}function s(t,e){gn[t]||(a(e),gn[t]=!0)}function o(t,e){return function(n){return m(t.call(this,n),e)}}function l(t,e){return function(n){return this.localeData().ordinal(t.call(this,n),e)}}function d(){}function u(t,e){e!==!1&&A(t),p(this,t),this._d=new Date(+t._d)}function c(t){var e=x(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||0,s=e.day||0,o=e.hour||0,l=e.minute||0,d=e.second||0,u=e.millisecond||0;this._milliseconds=+u+1e3*d+6e4*l+36e5*o,this._days=+s+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=ve.localeData(),this._bubble()}function h(t,e){for(var i in e)n(e,i)&&(t[i]=e[i]);return n(e,"toString")&&(t.toString=e.toString),n(e,"valueOf")&&(t.valueOf=e.valueOf),t}function p(t,e){var n,i,a;if("undefined"!=typeof e._isAMomentObject&&(t._isAMomentObject=e._isAMomentObject),"undefined"!=typeof e._i&&(t._i=e._i),"undefined"!=typeof e._f&&(t._f=e._f),"undefined"!=typeof e._l&&(t._l=e._l),"undefined"!=typeof e._strict&&(t._strict=e._strict),"undefined"!=typeof e._tzm&&(t._tzm=e._tzm),"undefined"!=typeof e._isUTC&&(t._isUTC=e._isUTC),"undefined"!=typeof e._offset&&(t._offset=e._offset),"undefined"!=typeof e._pf&&(t._pf=e._pf),"undefined"!=typeof e._locale&&(t._locale=e._locale),je.length>0)for(n in je)i=je[n],a=e[i],"undefined"!=typeof a&&(t[i]=a);return t}function f(t){return 0>t?Math.ceil(t):Math.floor(t)}function m(t,e,n){for(var i=""+Math.abs(t),a=t>=0;i.lengthi;i++)(n&&t[i]!==e[i]||!n&&T(t[i])!==T(e[i]))&&s++;return s+r}function L(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=un[t]||cn[e]||e}return t}function x(t){var e,i,a={};for(i in t)n(t,i)&&(e=L(i),e&&(a[e]=t[i]));return a}function D(e){var n,i;if(0===e.indexOf("week"))n=7,i="day";else{if(0!==e.indexOf("month"))return;n=12,i="month"}ve[e]=function(a,r){var s,o,l=ve._locale[e],d=[];if("number"==typeof a&&(r=a,a=t),o=function(t){var e=ve().utc().set(i,t);return l.call(ve._locale,e,a||"")},null!=r)return o(r);for(s=0;n>s;s++)d.push(o(s));return d}}function T(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=e>=0?Math.floor(e):Math.ceil(e)),n}function k(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function Y(t,e,n){return oe(ve([t,11,31+e-n]),e,n).week}function S(t){return C(t)?366:365}function C(t){return t%4===0&&t%100!==0||t%400===0}function A(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[ke]<0||t._a[ke]>11?ke:t._a[Ye]<1||t._a[Ye]>k(t._a[Te],t._a[ke])?Ye:t._a[Se]<0||t._a[Se]>23?Se:t._a[Ce]<0||t._a[Ce]>59?Ce:t._a[Ae]<0||t._a[Ae]>59?Ae:t._a[Fe]<0||t._a[Fe]>999?Fe:-1,t._pf._overflowDayOfYear&&(Te>e||e>Ye)&&(e=Ye),t._pf.overflow=e)}function F(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function E(t){return t?t.toLowerCase().replace("_","-"):t}function j(t){for(var e,n,i,a,r=0;r0;){if(i=N(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&M(a,n,!0)>=e-1)break;e--}r++}return null}function N(t){var e=null;if(!Ee[t]&&Ne)try{e=ve.locale(),require("./locale/"+t),ve.locale(e)}catch(n){}return Ee[t]}function I(t,e){return e._isUTC?ve(t).zone(e._offset||0):ve(t).local()}function H(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function P(t){var e,n,i=t.match(We);for(e=0,n=i.length;n>e;e++)i[e]=_n[i[e]]?_n[i[e]]:H(i[e]);return function(a){var r="";for(e=0;n>e;e++)r+=i[e]instanceof Function?i[e].call(a,t):i[e];return r}}function W(t,e){return t.isValid()?(e=O(e,t.localeData()),hn[e]||(hn[e]=P(e)),hn[e](t)):t.localeData().invalidDate()}function O(t,e){function n(t){return e.longDateFormat(t)||t}var i=5;for(Oe.lastIndex=0;i>=0&&Oe.test(t);)t=t.replace(Oe,n),Oe.lastIndex=0,i-=1;return t}function $(t,e){var n,i=e._strict;switch(t){case"Q":return Ke;case"DDDD":return Ze;case"YYYY":case"GGGG":case"gggg":return i?tn:ze;case"Y":case"G":case"g":return nn;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return i?en:Re;case"S":if(i)return Ke;case"SS":if(i)return Qe;case"SSS":if(i)return Ze;case"DDD":return Be;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ue;case"a":case"A":return e._locale._meridiemParse;case"X":return Je;case"Z":case"ZZ":return Ve;case"T":return Ge;case"SSSS":return qe;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return i?Qe:$e;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return $e;case"Do":return Xe;default:return n=new RegExp(X(J(t.replace("\\","")),"i"))}}function B(t){t=t||"";var e=t.match(Ve)||[],n=e[e.length-1]||[],i=(n+"").match(ln)||["-",0,0],a=+(60*i[1])+T(i[2]);return"+"===i[0]?-a:a}function z(t,e,n){var i,a=n._a;switch(t){case"Q":null!=e&&(a[ke]=3*(T(e)-1));break;case"M":case"MM":null!=e&&(a[ke]=T(e)-1);break;case"MMM":case"MMMM":i=n._locale.monthsParse(e),null!=i?a[ke]=i:n._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(a[Ye]=T(e));break;case"Do":null!=e&&(a[Ye]=T(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(n._dayOfYear=T(e));break;case"YY":a[Te]=ve.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":a[Te]=T(e);break;case"a":case"A":n._isPm=n._locale.isPM(e);break;case"H":case"HH":case"h":case"hh":a[Se]=T(e);break;case"m":case"mm":a[Ce]=T(e);break;case"s":case"ss":a[Ae]=T(e);break;case"S":case"SS":case"SSS":case"SSSS":a[Fe]=T(1e3*("0."+e));break;case"X":n._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":n._useUTC=!0,n._tzm=B(e);break;case"dd":case"ddd":case"dddd":i=n._locale.weekdaysParse(e),null!=i?(n._w=n._w||{},n._w.d=i):n._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(n._w=n._w||{},n._w[t]=T(e));break;case"gg":case"GG":n._w=n._w||{},n._w[t]=ve.parseTwoDigitYear(e)}}function R(t){var n,i,a,r,s,o,l;n=t._w,null!=n.GG||null!=n.W||null!=n.E?(s=1,o=4,i=e(n.GG,t._a[Te],oe(ve(),1,4).year),a=e(n.W,1),r=e(n.E,1)):(s=t._locale._week.dow,o=t._locale._week.doy,i=e(n.gg,t._a[Te],oe(ve(),s,o).year),a=e(n.w,1),null!=n.d?(r=n.d,s>r&&++a):r=null!=n.e?n.e+s:s),l=le(i,a,r,o,s),t._a[Te]=l.year,t._dayOfYear=l.dayOfYear}function q(t){var n,i,a,r,s=[];if(!t._d){for(a=V(t),t._w&&null==t._a[Ye]&&null==t._a[ke]&&R(t),t._dayOfYear&&(r=e(t._a[Te],a[Te]),t._dayOfYear>S(r)&&(t._pf._overflowDayOfYear=!0),i=ie(r,0,t._dayOfYear),t._a[ke]=i.getUTCMonth(),t._a[Ye]=i.getUTCDate()),n=0;3>n&&null==t._a[n];++n)t._a[n]=s[n]=a[n];for(;7>n;n++)t._a[n]=s[n]=null==t._a[n]?2===n?1:0:t._a[n];t._d=(t._useUTC?ie:ne).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function U(t){var e;t._d||(e=x(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],q(t))}function V(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function G(t){if(t._f===ve.ISO_8601)return void Q(t);t._a=[],t._pf.empty=!0;var e,n,i,a,r,s=""+t._i,o=s.length,l=0;for(i=O(t._f,t._locale).match(We)||[],e=0;e0&&t._pf.unusedInput.push(r),s=s.slice(s.indexOf(n)+n.length),l+=n.length),_n[a]?(n?t._pf.empty=!1:t._pf.unusedTokens.push(a),z(a,n,t)):t._strict&&!n&&t._pf.unusedTokens.push(a);t._pf.charsLeftOver=o-l,s.length>0&&t._pf.unusedInput.push(s),t._isPm&&t._a[Se]<12&&(t._a[Se]+=12),t._isPm===!1&&12===t._a[Se]&&(t._a[Se]=0),q(t),A(t)}function J(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,a){return e||n||i||a})}function X(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t){var e,n,a,r,s;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(r=0;rs)&&(a=s,n=e));h(t,n||e)}function Q(t){var e,n,i=t._i,a=an.exec(i);if(a){for(t._pf.iso=!0,e=0,n=sn.length;n>e;e++)if(sn[e][1].exec(i)){t._f=sn[e][0]+(a[6]||" ");break}for(e=0,n=on.length;n>e;e++)if(on[e][1].exec(i)){t._f+=on[e][0];break}i.match(Ve)&&(t._f+="Z"),G(t)}else t._isValid=!1}function Z(t){Q(t),t._isValid===!1&&(delete t._isValid,ve.createFromInputFallback(t))}function te(t,e){var n,i=[];for(n=0;nt&&o.setFullYear(t),o}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function ae(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function re(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function se(t,e,n){var i=ve.duration(t).abs(),a=xe(i.as("s")),r=xe(i.as("m")),s=xe(i.as("h")),o=xe(i.as("d")),l=xe(i.as("M")),d=xe(i.as("y")),u=a0,u[4]=n,re.apply({},u)}function oe(t,e,n){var i,a=n-e,r=n-t.day();return r>a&&(r-=7),a-7>r&&(r+=7),i=ve(t).add(r,"d"),{week:Math.ceil(i.dayOfYear()/7),year:i.year()}}function le(t,e,n,i,a){var r,s,o=ie(t,0,1).getUTCDay();return o=0===o?7:o,n=null!=n?n:a,r=a-o+(o>i?7:0)-(a>o?7:0),s=7*(e-1)+(n-a)+r+1,{year:s>0?t:t-1,dayOfYear:s>0?s:S(t-1)+s}}function de(e){var n=e._i,i=e._f;return e._locale=e._locale||ve.localeData(e._l),null===n||i===t&&""===n?ve.invalid({nullInput:!0}):("string"==typeof n&&(e._i=n=e._locale.preparse(n)),ve.isMoment(n)?new u(n,!0):(i?b(i)?K(e):G(e):ee(e),new u(e)))}function ue(t,e){var n,i;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)return ve();for(n=e[0],i=1;i=0?"+":"-";return e+m(Math.abs(t),6)},gg:function(){return m(this.weekYear()%100,2)},gggg:function(){return m(this.weekYear(),4)},ggggg:function(){return m(this.weekYear(),5)},GG:function(){return m(this.isoWeekYear()%100,2)},GGGG:function(){return m(this.isoWeekYear(),4)},GGGGG:function(){return m(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return T(this.milliseconds()/100)},SS:function(){return m(T(this.milliseconds()/10),2)},SSS:function(){return m(this.milliseconds(),3)},SSSS:function(){return m(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+m(T(t/60),2)+":"+m(T(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+m(T(t/60),2)+m(T(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},gn={},yn=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];fn.length;)we=fn.pop(),_n[we+"o"]=l(_n[we],we);for(;mn.length;)we=mn.pop(),_n[we+we]=o(_n[we],2);_n.DDDD=o(_n.DDD,3),h(d.prototype,{set:function(t){var e,n;for(n in t)e=t[n],"function"==typeof e?this[n]=e:this["_"+n]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,n,i;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(n=ve.utc([2e3,e]),i="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[e]=new RegExp(i.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,n,i;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(n=ve([2e3,1]).day(e),i="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[e]=new RegExp(i.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var n=this._calendar[t];return"function"==typeof n?n.apply(e):n},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,n,i){var a=this._relativeTime[n];return"function"==typeof a?a(t,e,n,i):a.replace(/%d/i,t)},pastFuture:function(t,e){var n=this._relativeTime[t>0?"future":"past"];return"function"==typeof n?n(e):n.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return oe(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ve=function(e,n,a,r){var s;return"boolean"==typeof a&&(r=a,a=t),s={},s._isAMomentObject=!0,s._i=e,s._f=n,s._l=a,s._strict=r,s._isUTC=!1,s._pf=i(),de(s)},ve.suppressDeprecationWarnings=!1,ve.createFromInputFallback=r("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ve.min=function(){var t=[].slice.call(arguments,0);return ue("isBefore",t)},ve.max=function(){var t=[].slice.call(arguments,0);return ue("isAfter",t)},ve.utc=function(e,n,a,r){var s;return"boolean"==typeof a&&(r=a,a=t),s={},s._isAMomentObject=!0,s._useUTC=!0,s._isUTC=!0,s._l=a,s._i=e,s._f=n,s._strict=r,s._pf=i(),de(s).utc()},ve.unix=function(t){return ve(1e3*t)},ve.duration=function(t,e){var i,a,r,s,o=t,l=null;return ve.isDuration(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(o={},e?o[e]=t:o.milliseconds=t):(l=He.exec(t))?(i="-"===l[1]?-1:1,o={y:0,d:T(l[Ye])*i,h:T(l[Se])*i,m:T(l[Ce])*i,s:T(l[Ae])*i,ms:T(l[Fe])*i}):(l=Pe.exec(t))?(i="-"===l[1]?-1:1,r=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},o={y:r(l[2]),M:r(l[3]),d:r(l[4]),h:r(l[5]),m:r(l[6]),s:r(l[7]),w:r(l[8])}):"object"==typeof o&&("from"in o||"to"in o)&&(s=g(ve(o.from),ve(o.to)),o={},o.ms=s.milliseconds,o.M=s.months),a=new c(o),ve.isDuration(t)&&n(t,"_locale")&&(a._locale=t._locale),a},ve.version=Me,ve.defaultFormat=rn,ve.ISO_8601=function(){},ve.momentProperties=je,ve.updateOffset=function(){},ve.relativeTimeThreshold=function(e,n){return pn[e]===t?!1:n===t?pn[e]:(pn[e]=n,!0)},ve.lang=r("moment.lang is deprecated. Use moment.locale instead.",function(t,e){return ve.locale(t,e)}),ve.locale=function(t,e){var n;return t&&(n="undefined"!=typeof e?ve.defineLocale(t,e):ve.localeData(t),n&&(ve.duration._locale=ve._locale=n)),ve._locale._abbr},ve.defineLocale=function(t,e){return null!==e?(e.abbr=t,Ee[t]||(Ee[t]=new d),Ee[t].set(e),ve.locale(t),Ee[t]):(delete Ee[t],null)},ve.langData=r("moment.langData is deprecated. Use moment.localeData instead.",function(t){return ve.localeData(t)}),ve.localeData=function(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return ve._locale;if(!b(t)){if(e=N(t))return e;t=[t]}return j(t)},ve.isMoment=function(t){return t instanceof u||null!=t&&n(t,"_isAMomentObject")},ve.isDuration=function(t){return t instanceof c};for(we=yn.length-1;we>=0;--we)D(yn[we]);ve.normalizeUnits=function(t){return L(t)},ve.invalid=function(t){var e=ve.utc(0/0);return null!=t?h(e._pf,t):e._pf.userInvalidated=!0,e},ve.parseZone=function(){return ve.apply(null,arguments).parseZone()},ve.parseTwoDigitYear=function(t){return T(t)+(T(t)>68?1900:2e3)},h(ve.fn=u.prototype,{clone:function(){return ve(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ve(this).utc();return 00:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(t){return this.zone(0,t)},local:function(t){return this._isUTC&&(this.zone(0,t),this._isUTC=!1,t&&this.add(this._dateTzOffset(),"m")),this},format:function(t){var e=W(this,t||ve.defaultFormat);return this.localeData().postformat(e)},add:y(1,"add"),subtract:y(-1,"subtract"),diff:function(t,e,n){var i,a,r,s=I(t,this),o=6e4*(this.zone()-s.zone());return e=L(e),"year"===e||"month"===e?(i=432e5*(this.daysInMonth()+s.daysInMonth()),a=12*(this.year()-s.year())+(this.month()-s.month()),r=this-ve(this).startOf("month")-(s-ve(s).startOf("month")),r-=6e4*(this.zone()-ve(this).startOf("month").zone()-(s.zone()-ve(s).startOf("month").zone())),a+=r/i,"year"===e&&(a/=12)):(i=this-s,a="second"===e?i/1e3:"minute"===e?i/6e4:"hour"===e?i/36e5:"day"===e?(i-o)/864e5:"week"===e?(i-o)/6048e5:i),n?a:f(a)},from:function(t,e){return ve.duration({to:this,from:t}).locale(this.locale()).humanize(!e)},fromNow:function(t){return this.from(ve(),t)},calendar:function(t){var e=t||ve(),n=I(e,this).startOf("day"),i=this.diff(n,"days",!0),a=-6>i?"sameElse":-1>i?"lastWeek":0>i?"lastDay":1>i?"sameDay":2>i?"nextDay":7>i?"nextWeek":"sameElse";return this.format(this.localeData().calendar(a,this))},isLeapYear:function(){return C(this.year())},isDST:function(){return this.zone()+t):+this.clone().startOf(e)>+ve(t).startOf(e)},isBefore:function(t,e){return e=L("undefined"!=typeof e?e:"millisecond"),"millisecond"===e?(t=ve.isMoment(t)?t:ve(t),+t>+this):+this.clone().startOf(e)<+ve(t).startOf(e)},isSame:function(t,e){return e=L(e||"millisecond"),"millisecond"===e?(t=ve.isMoment(t)?t:ve(t),+this===+t):+this.clone().startOf(e)===+I(t,this).startOf(e)},min:r("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),this>t?this:t}),max:r("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ve.apply(null,arguments),t>this?this:t}),zone:function(t,e){var n,i=this._offset||0;return null==t?this._isUTC?i:this._dateTzOffset():("string"==typeof t&&(t=B(t)),Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(n=this._dateTzOffset()),this._offset=t,this._isUTC=!0,null!=n&&this.subtract(n,"m"),i!==t&&(!e||this._changeInProgress?v(this,ve.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ve.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ve(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return k(this.year(),this.month())},dayOfYear:function(t){var e=xe((ve(this).startOf("day")-ve(this).startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=oe(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==t?e:this.add(t-e,"y")},isoWeekYear:function(t){var e=oe(this,1,4).year;return null==t?e:this.add(t-e,"y")},week:function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},isoWeek:function(t){var e=oe(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},weekday:function(t){var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return Y(this.year(),1,4)},weeksInYear:function(){var t=this.localeData()._week;return Y(this.year(),t.dow,t.doy)},get:function(t){return t=L(t),this[t]()},set:function(t,e){return t=L(t),"function"==typeof this[t]&&this[t](e),this},locale:function(e){var n;return e===t?this._locale._abbr:(n=ve.localeData(e),null!=n&&(this._locale=n),this)},lang:r("moment().lang() is deprecated. Use moment().localeData() instead.",function(e){return e===t?this.localeData():this.locale(e)}),localeData:function(){return this._locale},_dateTzOffset:function(){return 15*Math.round(this._d.getTimezoneOffset()/15)}}),ve.fn.millisecond=ve.fn.milliseconds=fe("Milliseconds",!1),ve.fn.second=ve.fn.seconds=fe("Seconds",!1),ve.fn.minute=ve.fn.minutes=fe("Minutes",!1),ve.fn.hour=ve.fn.hours=fe("Hours",!0),ve.fn.date=fe("Date",!0),ve.fn.dates=r("dates accessor is deprecated. Use date instead.",fe("Date",!0)),ve.fn.year=fe("FullYear",!0),ve.fn.years=r("years accessor is deprecated. Use year instead.",fe("FullYear",!0)),ve.fn.days=ve.fn.day,ve.fn.months=ve.fn.month,ve.fn.weeks=ve.fn.week,ve.fn.isoWeeks=ve.fn.isoWeek,ve.fn.quarters=ve.fn.quarter,ve.fn.toJSON=ve.fn.toISOString,h(ve.duration.fn=c.prototype,{_bubble:function(){var t,e,n,i=this._milliseconds,a=this._days,r=this._months,s=this._data,o=0;s.milliseconds=i%1e3,t=f(i/1e3),s.seconds=t%60,e=f(t/60),s.minutes=e%60,n=f(e/60),s.hours=n%24,a+=f(n/24),o=f(me(a)),a-=f(_e(o)),r+=f(a/30),a%=30,o+=f(r/12),r%=12,s.days=a,s.months=r,s.years=o},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return f(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*T(this._months/12)},humanize:function(t){var e=se(this,!t,this.localeData());return t&&(e=this.localeData().pastFuture(+this,e)),this.localeData().postformat(e)},add:function(t,e){var n=ve.duration(t,e);return this._milliseconds+=n._milliseconds,this._days+=n._days,this._months+=n._months,this._bubble(),this},subtract:function(t,e){var n=ve.duration(t,e);return this._milliseconds-=n._milliseconds,this._days-=n._days,this._months-=n._months,this._bubble(),this},get:function(t){return t=L(t),this[t.toLowerCase()+"s"]()},as:function(t){var e,n;if(t=L(t),"month"===t||"year"===t)return e=this._days+this._milliseconds/864e5,n=this._months+12*me(e),"month"===t?n:n/12;switch(e=this._days+_e(this._months/12),t){case"week":return e/7+this._milliseconds/6048e5;case"day":return e+this._milliseconds/864e5;case"hour":return 24*e+this._milliseconds/36e5;case"minute":return 24*e*60+this._milliseconds/6e4;case"second":return 24*e*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*e*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+t)}},lang:ve.fn.lang,locale:ve.fn.locale,toIsoString:r("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),n=Math.abs(this.days()),i=Math.abs(this.hours()),a=Math.abs(this.minutes()),r=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(n?n+"D":"")+(i||a||r?"T":"")+(i?i+"H":"")+(a?a+"M":"")+(r?r+"S":""):"P0D"},localeData:function(){return this._locale}}),ve.duration.fn.toString=ve.duration.fn.toISOString;for(we in dn)n(dn,we)&&ge(we.toLowerCase());ve.duration.fn.asMilliseconds=function(){return this.as("ms")},ve.duration.fn.asSeconds=function(){return this.as("s")},ve.duration.fn.asMinutes=function(){return this.as("m")},ve.duration.fn.asHours=function(){return this.as("h")},ve.duration.fn.asDays=function(){return this.as("d")},ve.duration.fn.asWeeks=function(){return this.as("weeks")},ve.duration.fn.asMonths=function(){return this.as("M")},ve.duration.fn.asYears=function(){return this.as("y")},ve.locale("en",{ordinal:function(t){var e=t%10,n=1===T(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),function(t){t(ve)}(function(t){return t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiem:function(t,e,n){return 12>t?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(t){t(ve)}(function(t){var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};return t.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}),function(t){t(ve)}(function(t){var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},n={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},i=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&10>=t%100?3:t%100>=11?4:5},a={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},r=function(t){return function(e,n){var r=i(e),s=a[t][i(e)];return 2===r&&(s=s[n?0:1]),s.replace(/%d/i,e)}},s=["كانون الثاني يناير","شباط فبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوفمبر","كانون الأول ديسمبر"];return t.defineLocale("ar",{months:s,monthsShort:s,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})}),function(t){t(ve)}(function(t){var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return t.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiem:function(t){return 4>t?"gecə":12>t?"səhər":17>t?"gündüz":"axşam"},ordinal:function(t){if(0===t)return t+"-ıncı";var n=t%10,i=t%100-n,a=t>=100?100:null;return t+(e[n]||e[i]||e[a])},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){function e(t,e){var n=t.split("_");return e%10===1&&e%100!==11?n[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?n[1]:n[2]}function n(t,n,i){var a={mm:n?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_хвілін",hh:n?"гадзіна_гадзіны_гадзін":"гадзіну_гадзіны_гадзін",dd:"дзень_дні_дзён",MM:"месяц_месяцы_месяцаў",yy:"год_гады_гадоў"};return"m"===i?n?"хвіліна":"хвіліну":"h"===i?n?"гадзіна":"гадзіну":t+" "+e(a[i],+t)}function i(t,e){var n={nominative:"студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань".split("_"),accusative:"студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return n[i][t.month()]}function a(t,e){var n={nominative:"нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота".split("_"),accusative:"нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу".split("_")},i=/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/.test(e)?"accusative":"nominative";return n[i][t.day()]}return t.defineLocale("be",{months:i,monthsShort:"студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж".split("_"),weekdays:a,weekdaysShort:"нд_пн_ат_ср_чц_пт_сб".split("_"),weekdaysMin:"нд_пн_ат_ср_чц_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сёння ў] LT",nextDay:"[Заўтра ў] LT",lastDay:"[Учора ў] LT",nextWeek:function(){return"[У] dddd [ў] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[У мінулую] dddd [ў] LT";case 1:case 2:case 4:return"[У мінулы] dddd [ў] LT"}},sameElse:"L"},relativeTime:{future:"праз %s",past:"%s таму",s:"некалькі секунд",m:n,mm:n,h:n,hh:n,d:"дзень",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiem:function(t){return 4>t?"ночы":12>t?"раніцы":17>t?"дня":"вечара"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!==2&&t%10!==3||t%100===12||t%100===13?t+"-ы":t+"-і";case"D":return t+"-га";default:return t}},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-ев":0===n?t+"-ен":n>10&&20>n?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){var e={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},n={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return t.defineLocale("bn",{months:"জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্রু_শনি".split("_"),weekdaysMin:"রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কএক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(t){return t.replace(/[১২৩৪৫৬৭৮৯০]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"রাত":10>t?"শকাল":17>t?"দুপুর":20>t?"বিকেল":"রাত"},week:{dow:0,doy:6}})}),function(t){t(ve)}(function(t){var e={1:"༡",2:"༢",3:"༣",4:"༤",5:"༥",6:"༦",7:"༧",8:"༨",9:"༩",0:"༠"},n={"༡":"1","༢":"2","༣":"3","༤":"4","༥":"5","༦":"6","༧":"7","༨":"8","༩":"9","༠":"0"};return t.defineLocale("bo",{months:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),monthsShort:"ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ".split("_"),weekdays:"གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་".split("_"),weekdaysShort:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),weekdaysMin:"ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་".split("_"),longDateFormat:{LT:"A h:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[དི་རིང] LT",nextDay:"[སང་ཉིན] LT",nextWeek:"[བདུན་ཕྲག་རྗེས་མ], LT",lastDay:"[ཁ་སང] LT",lastWeek:"[བདུན་ཕྲག་མཐའ་མ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s ལ་",past:"%s སྔན་ལ",s:"ལམ་སང",m:"སྐར་མ་གཅིག",mm:"%d སྐར་མ",h:"ཆུ་ཚོད་གཅིག",hh:"%d ཆུ་ཚོད",d:"ཉིན་གཅིག",dd:"%d ཉིན་",M:"ཟླ་བ་གཅིག",MM:"%d ཟླ་བ",y:"ལོ་གཅིག",yy:"%d ལོ"},preparse:function(t){return t.replace(/[༡༢༣༤༥༦༧༨༩༠]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"མཚན་མོ":10>t?"ཞོགས་ཀས":17>t?"ཉིན་གུང":20>t?"དགོང་དག":"མཚན་མོ"},week:{dow:0,doy:6}})}),function(t){t(ve)}(function(e){function n(t,e,n){var i={mm:"munutenn",MM:"miz",dd:"devezh"};return t+" "+r(i[n],t)}function i(t){switch(a(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}function a(t){return t>9?a(t%10):t}function r(t,e){return 2===e?s(t):t}function s(e){var n={m:"v",b:"v",d:"z"};return n[e.charAt(0)]===t?e:n[e.charAt(0)]+e.substring(1)}return e.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:n,h:"un eur",hh:"%d eur",d:"un devezh",dd:n,M:"ur miz",MM:n,y:"ur bloaz",yy:i},ordinal:function(t){var e=1===t?"añ":"vet";return t+e},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i=t+" ";switch(n){case"m":return e?"jedna minuta":"jedne minute";case"mm":return i+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return i+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return i+=1===t?"dan":"dana";case"MM":return i+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return i+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}return t.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT"; -case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t){return t>1&&5>t&&1!==~~(t/10)}function n(t,n,i,a){var r=t+" ";switch(i){case"s":return n||a?"pár sekund":"pár sekundami";case"m":return n?"minuta":a?"minutu":"minutou";case"mm":return n||a?r+(e(t)?"minuty":"minut"):r+"minutami";case"h":return n?"hodina":a?"hodinu":"hodinou";case"hh":return n||a?r+(e(t)?"hodiny":"hodin"):r+"hodinami";case"d":return n||a?"den":"dnem";case"dd":return n||a?r+(e(t)?"dny":"dní"):r+"dny";case"M":return n||a?"měsíc":"měsícem";case"MM":return n||a?r+(e(t)?"měsíce":"měsíců"):r+"měsíci";case"y":return n||a?"rok":"rokem";case"yy":return n||a?r+(e(t)?"roky":"let"):r+"lety"}}var i="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),a="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");return t.defineLocale("cs",{months:i,monthsShort:a,monthsParse:function(t,e){var n,i=[];for(n=0;12>n;n++)i[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return i}(i,a),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("cv",{months:"кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кç_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ĕнер] LT [сехетре]",nextWeek:"[Çитес] dddd LT [сехетре]",lastWeek:"[Иртнĕ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(t){var e=/сехет$/i.exec(t)?"рен":/çул$/i.exec(t)?"тан":"ран";return t+e},past:"%s каялла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр сехет",hh:"%d сехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinal:function(t){var e=t,n="",i=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return e>20?n=40===e||50===e||60===e||80===e||100===e?"fed":"ain":e>0&&(n=i[e]),t+n},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}return t.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}return t.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(t,e){return/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(t,e,n){return t>11?n?"μμ":"ΜΜ":n?"πμ":"ΠΜ"},isPM:function(t){return"μ"===(t+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n=this._calendarEl[t],i=e&&e.hours();return"function"==typeof n&&(n=n.apply(e)),n.replace("{}",i%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(t){return t+"η"},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,n=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,n=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}})}),function(t){t(ve)}(function(t){return t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,n=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiem:function(t,e,n){return t>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaŭ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinal:"%da",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,i){return/-MMM-/.test(i)?n[t.month()]:e[t.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n,i){var a={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[t+" minuti",t+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[t+" tunni",t+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[t+" kuu",t+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[t+" aasta",t+" aastat"]};return e?a[n][2]?a[n][2]:a[n][1]:i?a[n][0]:a[n][1]}return t.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:"%d päeva",M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){var e={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},n={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};return t.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(t){return 12>t?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return n[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}})}),function(t){t(ve)}(function(t){function e(t,e,i,a){var r="";switch(i){case"s":return a?"muutaman sekunnin":"muutama sekunti";case"m":return a?"minuutin":"minuutti";case"mm":r=a?"minuutin":"minuuttia";break;case"h":return a?"tunnin":"tunti";case"hh":r=a?"tunnin":"tuntia";break;case"d":return a?"päivän":"päivä";case"dd":r=a?"päivän":"päivää";break;case"M":return a?"kuukauden":"kuukausi";case"MM":r=a?"kuukauden":"kuukautta";break;case"y":return a?"vuoden":"vuosi";case"yy":r=a?"vuoden":"vuotta"}return r=n(t,a)+" "+r}function n(t,e){return 10>t?e?a[t]:i[t]:t}var i="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),a=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",i[7],i[8],i[9]];return t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(t){return t+(1===t?"er":"")}})}),function(t){t(ve)}(function(t){return t.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(t){return t+(1===t?"er":"")},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return"uns segundos"===t?"nuns segundos":"en "+t},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(t){return 2===t?"שעתיים":t+" שעות"},d:"יום",dd:function(t){return 2===t?"יומיים":t+" ימים"},M:"חודש",MM:function(t){return 2===t?"חודשיים":t+" חודשים"},y:"שנה",yy:function(t){return 2===t?"שנתיים":t+" שנים"}}})}),function(t){t(ve)}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"रात":10>t?"सुबह":17>t?"दोपहर":20>t?"शाम":"रात"},week:{dow:0,doy:6}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i=t+" ";switch(n){case"m":return e?"jedna minuta":"jedne minute";case"mm":return i+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return i+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return i+=1===t?"dan":"dana";case"MM":return i+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return i+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}return t.defineLocale("hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){function e(t,e,n,i){var a=t;switch(n){case"s":return i||e?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(i||e?" perc":" perce");case"mm":return a+(i||e?" perc":" perce");case"h":return"egy"+(i||e?" óra":" órája");case"hh":return a+(i||e?" óra":" órája");case"d":return"egy"+(i||e?" nap":" napja");case"dd":return a+(i||e?" nap":" napja");case"M":return"egy"+(i||e?" hónap":" hónapja");case"MM":return a+(i||e?" hónap":" hónapja");case"y":return"egy"+(i||e?" év":" éve");case"yy":return a+(i||e?" év":" éve")}return""}function n(t){return(t?"":"[múlt] ")+"["+i[this.day()]+"] LT[-kor]"}var i="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");return t.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(t,e,n){return 12>t?n===!0?"de":"DE":n===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return n.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return n.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){function e(t,e){var n={nominative:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_"),accusative:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return n[i][t.month()]}function n(t){var e="հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_");return e[t.month()]}function i(t){var e="կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_");return e[t.day()]}return t.defineLocale("hy-am",{months:e,monthsShort:n,weekdays:i,weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., LT",LLLL:"dddd, D MMMM YYYY թ., LT"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT" -},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiem:function(t){return 4>t?"գիշերվա":12>t?"առավոտվա":17>t?"ցերեկվա":"երեկոյան"},ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-ին":t+"-րդ";default:return t}},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(t){return 11>t?"pagi":15>t?"siang":19>t?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){function e(t){return t%100===11?!0:t%10===1?!1:!0}function n(t,n,i,a){var r=t+" ";switch(i){case"s":return n||a?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return n?"mínúta":"mínútu";case"mm":return e(t)?r+(n||a?"mínútur":"mínútum"):n?r+"mínúta":r+"mínútu";case"hh":return e(t)?r+(n||a?"klukkustundir":"klukkustundum"):r+"klukkustund";case"d":return n?"dagur":a?"dag":"degi";case"dd":return e(t)?n?r+"dagar":r+(a?"daga":"dögum"):n?r+"dagur":r+(a?"dag":"degi");case"M":return n?"mánuður":a?"mánuð":"mánuði";case"MM":return e(t)?n?r+"mánuðir":r+(a?"mánuði":"mánuðum"):n?r+"mánuður":r+(a?"mánuð":"mánuði");case"y":return n||a?"ár":"ári";case"yy":return e(t)?r+(n||a?"ár":"árum"):r+(n||a?"ár":"ári")}}return t.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(t){return 12>t?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})}),function(t){t(ve)}(function(t){function e(t,e){var n={nominative:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),accusative:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},i=/D[oD] *MMMM?/.test(e)?"accusative":"nominative";return n[i][t.month()]}function n(t,e){var n={nominative:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),accusative:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_")},i=/(წინა|შემდეგ)/.test(e)?"accusative":"nominative";return n[i][t.day()]}return t.defineLocale("ka",{months:e,monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:n,weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(t){return/(წამი|წუთი|საათი|წელი)/.test(t)?t.replace(/ი$/,"ში"):t+"ში"},past:function(t){return/(წამი|წუთი|საათი|დღე|თვე)/.test(t)?t.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(t)?t.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinal:function(t){return 0===t?t:1===t?t+"-ლი":20>t||100>=t&&t%20===0||t%100===0?"მე-"+t:t+"-ე"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("km",{months:"មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysMin:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ថ្ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 m분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(t){return 12>t?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(t){return"오후"===t}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?i[n][0]:i[n][1]}function n(t){var e=t.substr(0,t.indexOf(" "));return a(e)?"a "+t:"an "+t}function i(t){var e=t.substr(0,t.indexOf(" "));return a(e)?"viru "+t:"virun "+t}function a(t){if(t=parseInt(t,10),isNaN(t))return!1;if(0>t)return!0;if(10>t)return t>=4&&7>=t?!0:!1;if(100>t){var e=t%10,n=t/10;return a(0===e?n:e)}if(1e4>t){for(;t>=10;)t/=10;return a(t)}return t/=1e3,a(t)}return t.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:n,past:i,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d Méint",y:e,yy:"%d Joer"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n,i){return e?"kelios sekundės":i?"kelių sekundžių":"kelias sekundes"}function n(t,e,n,i){return e?a(n)[0]:i?a(n)[1]:a(n)[2]}function i(t){return t%10===0||t>10&&20>t}function a(t){return o[t].split("_")}function r(t,e,r,s){var o=t+" ";return 1===t?o+n(t,e,r[0],s):e?o+(i(t)?a(r)[1]:a(r)[0]):s?o+a(r)[1]:o+(i(t)?a(r)[1]:a(r)[2])}function s(t,e){var n=-1===e.indexOf("dddd HH:mm"),i=l[t.day()];return n?i:i.substring(0,i.length-2)+"į"}var o={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},l="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");return t.defineLocale("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:s,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:e,m:n,mm:r,h:n,hh:r,d:n,dd:r,M:n,MM:r,y:n,yy:r},ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i=t.split("_");return n?e%10===1&&11!==e?i[2]:i[3]:e%10===1&&11!==e?i[0]:i[1]}function n(t,n,a){return t+" "+e(i[a],t,n)}var i={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};return t.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:n,h:"stundu",hh:n,d:"dienu",dd:n,M:"mēnesi",MM:n,y:"gadu",yy:n},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-ев":0===n?t+"-ен":n>10&&20>n?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiem:function(t){return 4>t?"രാത്രി":12>t?"രാവിലെ":17>t?"ഉച്ച കഴിഞ്ഞ്":20>t?"വൈകുന്നേരം":"രാത്രി"}})}),function(t){t(ve)}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.defineLocale("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूर्वी",s:"सेकंद",m:"एक मिनिट",mm:"%d मिनिटे",h:"एक तास",hh:"%d तास",d:"एक दिवस",dd:"%d दिवस",M:"एक महिना",MM:"%d महिने",y:"एक वर्ष",yy:"%d वर्षे"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"रात्री":10>t?"सकाळी":17>t?"दुपारी":20>t?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})}),function(t){t(ve)}(function(t){return t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(t){return 11>t?"pagi":15>t?"tengahari":19>t?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){var e={1:"၁",2:"၂",3:"၃",4:"၄",5:"၅",6:"၆",7:"၇",8:"၈",9:"၉",0:"၀"},n={"၁":"1","၂":"2","၃":"3","၄":"4","၅":"5","၆":"6","၇":"7","၈":"8","၉":"9","၀":"0"};return t.defineLocale("my",{months:"ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ".split("_"),monthsShort:"ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ".split("_"),weekdays:"တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ".split("_"),weekdaysShort:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),weekdaysMin:"နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ယနေ.] LT [မှာ]",nextDay:"[မနက်ဖြန်] LT [မှာ]",nextWeek:"dddd LT [မှာ]",lastDay:"[မနေ.က] LT [မှာ]",lastWeek:"[ပြီးခဲ့သော] dddd LT [မှာ]",sameElse:"L"},relativeTime:{future:"လာမည့် %s မှာ",past:"လွန်ခဲ့သော %s က",s:"စက္ကန်.အနည်းငယ်",m:"တစ်မိနစ်",mm:"%d မိနစ်",h:"တစ်နာရီ",hh:"%d နာရီ",d:"တစ်ရက်",dd:"%d ရက်",M:"တစ်လ",MM:"%d လ",y:"တစ်နှစ်",yy:"%d နှစ်"},preparse:function(t){return t.replace(/[၁၂၃၄၅၆၇၈၉၀]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},n={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.defineLocale("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आइ._सो._मङ्_बु._बि._शु._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 3>t?"राती":10>t?"बिहान":15>t?"दिउँसो":18>t?"बेलुका":20>t?"साँझ":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return t.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,i){return/-MMM-/.test(i)?n[t.month()]:e[t.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t){return 5>t%10&&t%10>1&&~~(t/10)%10!==1}function n(t,n,i){var a=t+" ";switch(i){case"m":return n?"minuta":"minutę";case"mm":return a+(e(t)?"minuty":"minut");case"h":return n?"godzina":"godzinę";case"hh":return a+(e(t)?"godziny":"godzin");case"MM":return a+(e(t)?"miesiące":"miesięcy");case"yy":return a+(e(t)?"lata":"lat")}}var i="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),a="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");return t.defineLocale("pl",{months:function(t,e){return/D MMMM/.test(e)?a[t.month()]:i[t.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:n,mm:n,h:n,hh:n,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:n,y:"rok",yy:n},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"})}),function(t){t(ve)}(function(t){return t.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},a=" ";return(t%100>=20||t>=100&&t%100===0)&&(a=" de "),t+a+i[n]}return t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){function e(t,e){var n=t.split("_");return e%10===1&&e%100!==11?n[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?n[1]:n[2]}function n(t,n,i){var a={mm:n?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===i?n?"минута":"минуту":t+" "+e(a[i],+t)}function i(t,e){var n={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return n[i][t.month()]}function a(t,e){var n={nominative:"янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return n[i][t.month()]}function r(t,e){var n={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},i=/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/.test(e)?"accusative":"nominative";return n[i][t.day()]}return t.defineLocale("ru",{months:i,monthsShort:a,weekdays:r,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:n,mm:n,h:"час",hh:n,d:"день",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(t){return/^(дня|вечера)$/.test(t)},meridiem:function(t){return 4>t?"ночи":12>t?"утра":17>t?"дня":"вечера"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-й";case"D":return t+"-го";case"w":case"W":return t+"-я";default:return t}},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){function e(t){return t>1&&5>t}function n(t,n,i,a){var r=t+" ";switch(i){case"s":return n||a?"pár sekúnd":"pár sekundami";case"m":return n?"minúta":a?"minútu":"minútou";case"mm":return n||a?r+(e(t)?"minúty":"minút"):r+"minútami";case"h":return n?"hodina":a?"hodinu":"hodinou";case"hh":return n||a?r+(e(t)?"hodiny":"hodín"):r+"hodinami";case"d":return n||a?"deň":"dňom";case"dd":return n||a?r+(e(t)?"dni":"dní"):r+"dňami";case"M":return n||a?"mesiac":"mesiacom";case"MM":return n||a?r+(e(t)?"mesiace":"mesiacov"):r+"mesiacmi";case"y":return n||a?"rok":"rokom";case"yy":return n||a?r+(e(t)?"roky":"rokov"):r+"rokmi"}}var i="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),a="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return t.defineLocale("sk",{months:i,monthsShort:a,monthsParse:function(t,e){var n,i=[];for(n=0;12>n;n++)i[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return i}(i,a),weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){function e(t,e,n){var i=t+" ";switch(n){case"m":return e?"ena minuta":"eno minuto";case"mm":return i+=1===t?"minuta":2===t?"minuti":3===t||4===t?"minute":"minut";case"h":return e?"ena ura":"eno uro";case"hh":return i+=1===t?"ura":2===t?"uri":3===t||4===t?"ure":"ur"; -case"dd":return i+=1===t?"dan":"dni";case"MM":return i+=1===t?"mesec":2===t?"meseca":3===t||4===t?"mesece":"mesecev";case"yy":return i+=1===t?"leto":2===t?"leti":3===t||4===t?"leta":"let"}}return t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejšnja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"%s nazaj",s:"nekaj sekund",m:e,mm:e,h:e,hh:e,d:"en dan",dd:e,M:"en mesec",MM:e,y:"eno leto",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiem:function(t){return 12>t?"PD":"MD"},longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&4>=t?e[1]:e[2]},translate:function(t,n,i){var a=e.words[i];return 1===i.length?n?a[0]:a[1]:t+" "+e.correctGrammaticalCase(t,a)}};return t.defineLocale("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var t=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return t[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"месец",MM:e.translate,y:"годину",yy:e.translate},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&4>=t?e[1]:e[2]},translate:function(t,n,i){var a=e.words[i];return 1===i.length?n?a[0]:a[1]:t+" "+e.correctGrammaticalCase(t,a)}};return t.defineLocale("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var t=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return t[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinal:"%d.",week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinal:function(t){var e=t%10,n=1===~~(t%100/10)?"e":1===e?"a":2===e?"a":3===e?"e":"e";return t+n},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},ordinal:function(t){return t+"வது"},meridiem:function(t){return t>=6&&10>=t?" காலை":t>=10&&14>=t?" நண்பகல்":t>=14&&18>=t?" எற்பாடு":t>=18&&20>=t?" மாலை":t>=20&&24>=t?" இரவு":t>=0&&6>=t?" வைகறை":void 0},week:{dow:0,doy:6}})}),function(t){t(ve)}(function(t){return t.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(t){return 12>t?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(t){t(ve)}(function(t){return t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinal:function(t){return t},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return t.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(t){if(0===t)return t+"'ıncı";var n=t%10,i=t%100-n,a=t>=100?100:null;return t+(e[n]||e[i]||e[a])},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(t){t(ve)}(function(t){return t.defineLocale("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})}),function(t){t(ve)}(function(t){function e(t,e){var n=t.split("_");return e%10===1&&e%100!==11?n[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?n[1]:n[2]}function n(t,n,i){var a={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===i?n?"хвилина":"хвилину":"h"===i?n?"година":"годину":t+" "+e(a[i],+t)}function i(t,e){var n={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},i=/D[oD]? *MMMM?/.test(e)?"accusative":"nominative";return n[i][t.month()]}function a(t,e){var n={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},i=/(\[[ВвУу]\]) ?dddd/.test(e)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(e)?"genitive":"nominative";return n[i][t.day()]}function r(t){return function(){return t+"о"+(11===this.hours()?"б":"")+"] LT"}}return t.defineLocale("uk",{months:i,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:a,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., LT",LLLL:"dddd, D MMMM YYYY р., LT"},calendar:{sameDay:r("[Сьогодні "),nextDay:r("[Завтра "),lastDay:r("[Вчора "),nextWeek:r("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[Минулої] dddd [").call(this);case 1:case 2:case 4:return r("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:n,mm:n,h:"годину",hh:n,d:"день",dd:n,M:"місяць",MM:n,y:"рік",yy:n},meridiem:function(t){return 4>t?"ночі":12>t?"ранку":17>t?"дня":"вечора"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-й";case"D":return t+"-го";default:return t}},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("uz",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(t){t(ve)}(function(t){return t.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinal:function(t){return t},week:{dow:1,doy:4}})}),function(t){t(ve)}(function(t){return t.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiem:function(t,e){var n=100*t+e;return 600>n?"凌晨":900>n?"早上":1130>n?"上午":1230>n?"中午":1800>n?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,n;return e=t().startOf("week"),n=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?n+"dddAh点整":n+"dddAh点mm"},lastWeek:function(){var e,n;return e=t().startOf("week"),n=this.unix()n?"早上":1130>n?"上午":1230>n?"中午":1800>n?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"日";case"M":return t+"月";case"w":case"W":return t+"週";default:return t}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d分鐘",h:"一小時",hh:"%d小時",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%d年"}})}),ve.locale("en"),Ne?module.exports=ve:"function"==typeof define&&define.amd?(define("moment",function(t,e,n){return n.config&&n.config()&&n.config().noGlobal===!0&&(Le.moment=be),ve}),ye(!0)):ye()}.call(this),!function(t,e){"use strict";if("function"==typeof define&&define.amd)define(["jquery","moment"],e);else if("object"==typeof exports)e(require("jquery"),require("moment"));else{if(!jQuery)throw new Error("bootstrap-datetimepicker requires jQuery to be loaded first");if(!moment)throw new Error("bootstrap-datetimepicker requires moment.js to be loaded first");e(t.jQuery,moment)}}(this,function(t,e){"use strict";if("undefined"==typeof e)throw new Error("momentjs is required");var n=0,i=function(i,a){var r,s=t.fn.datetimepicker.defaults,o={time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down"},l=this,d=!1,u=function(){var r,d,u=!1;if(l.options=t.extend({},s,a),l.options.icons=t.extend({},o,l.options.icons),l.element=t(i),h(),!l.options.pickTime&&!l.options.pickDate)throw new Error("Must choose at least one picker");if(l.id=n++,e.locale(l.options.language),l.date=e(),l.unset=!1,l.isInput=l.element.is("input"),l.component=!1,l.element.hasClass("input-group")&&(l.component=l.element.find(0===l.element.find(".datepickerbutton").size()?'[class^="input-group-"]':".datepickerbutton")),l.format=l.options.format,r=e().localeData(),l.format||(l.format=l.options.pickDate?r.longDateFormat("L"):"",l.options.pickDate&&l.options.pickTime&&(l.format+=" "),l.format+=l.options.pickTime?r.longDateFormat("LT"):"",l.options.useSeconds&&(-1!==r.longDateFormat("LT").indexOf(" A")?l.format=l.format.split(" A")[0]+":ss A":l.format+=":ss")),l.use24hours=l.format.toLowerCase().indexOf("a")<0&&l.format.indexOf("h")<0,l.component&&(u=l.component.find("span")),l.options.pickTime&&u&&u.addClass(l.options.icons.time),l.options.pickDate&&u&&(u.removeClass(l.options.icons.time),u.addClass(l.options.icons.date)),l.options.widgetParent="string"==typeof l.options.widgetParent&&l.options.widgetParent||l.element.parents().filter(function(){return"scroll"===t(this).css("overflow-y")}).get(0)||"body",l.widget=t(B()).appendTo(l.options.widgetParent),l.minViewMode=l.options.minViewMode||0,"string"==typeof l.minViewMode)switch(l.minViewMode){case"months":l.minViewMode=1;break;case"years":l.minViewMode=2;break;default:l.minViewMode=0}if(l.viewMode=l.options.viewMode||0,"string"==typeof l.viewMode)switch(l.viewMode){case"months":l.viewMode=1;break;case"years":l.viewMode=2;break;default:l.viewMode=0}l.viewMode=Math.max(l.viewMode,l.minViewMode),l.options.disabledDates=O(l.options.disabledDates),l.options.enabledDates=O(l.options.enabledDates),l.startViewMode=l.viewMode,l.setMinDate(l.options.minDate),l.setMaxDate(l.options.maxDate),g(),y(),b(),w(),M(),_(),C(),c().prop("disabled")||A(),""!==l.options.defaultDate&&""===c().val()&&l.setValue(l.options.defaultDate),1!==l.options.minuteStepping&&(d=l.options.minuteStepping,l.date.minutes(Math.round(l.date.minutes()/d)*d%60).seconds(0))},c=function(){var t;if(l.isInput)return l.element;if(t=l.element.find(".datepickerinput"),0===t.size())t=l.element.find("input");else if(!t.is("input"))throw new Error('CSS class "datepickerinput" cannot be applied to non input element');return t},h=function(){var t;t=l.element.is("input")?l.element.data():l.element.find("input").data(),void 0!==t.dateFormat&&(l.options.format=t.dateFormat),void 0!==t.datePickdate&&(l.options.pickDate=t.datePickdate),void 0!==t.datePicktime&&(l.options.pickTime=t.datePicktime),void 0!==t.dateUseminutes&&(l.options.useMinutes=t.dateUseminutes),void 0!==t.dateUseseconds&&(l.options.useSeconds=t.dateUseseconds),void 0!==t.dateUsecurrent&&(l.options.useCurrent=t.dateUsecurrent),void 0!==t.calendarWeeks&&(l.options.calendarWeeks=t.calendarWeeks),void 0!==t.dateMinutestepping&&(l.options.minuteStepping=t.dateMinutestepping),void 0!==t.dateMindate&&(l.options.minDate=t.dateMindate),void 0!==t.dateMaxdate&&(l.options.maxDate=t.dateMaxdate),void 0!==t.dateShowtoday&&(l.options.showToday=t.dateShowtoday),void 0!==t.dateCollapse&&(l.options.collapse=t.dateCollapse),void 0!==t.dateLanguage&&(l.options.language=t.dateLanguage),void 0!==t.dateDefaultdate&&(l.options.defaultDate=t.dateDefaultdate),void 0!==t.dateDisableddates&&(l.options.disabledDates=t.dateDisableddates),void 0!==t.dateEnableddates&&(l.options.enabledDates=t.dateEnableddates),void 0!==t.dateIcons&&(l.options.icons=t.dateIcons),void 0!==t.dateUsestrict&&(l.options.useStrict=t.dateUsestrict),void 0!==t.dateDirection&&(l.options.direction=t.dateDirection),void 0!==t.dateSidebyside&&(l.options.sideBySide=t.dateSidebyside),void 0!==t.dateDaysofweekdisabled&&(l.options.daysOfWeekDisabled=t.dateDaysofweekdisabled)},p=function(){var e,n="absolute",i=l.component?l.component.offset():l.element.offset(),a=t(window);l.width=l.component?l.component.outerWidth():l.element.outerWidth(),i.top=i.top+l.element.outerHeight(),"up"===l.options.direction?e="top":"bottom"===l.options.direction?e="bottom":"auto"===l.options.direction&&(e=i.top+l.widget.height()>a.height()+a.scrollTop()&&l.widget.height()+l.element.outerHeight()"),a=e.weekdaysMin();if(l.options.calendarWeeks===!0&&i.append('#'),0===e().localeData()._week.dow)for(n=0;7>n;n++)i.append(''+a[n]+"");else for(n=1;8>n;n++)i.append(7===n?''+a[0]+"":''+a[n]+"");l.widget.find(".datepicker-days thead").append(i)},y=function(){e.locale(l.options.language);var t,n="",i=e.monthsShort();for(t=0;12>t;t++)n+=''+i[t]+"";l.widget.find(".datepicker-months td").append(n)},v=function(){if(l.options.pickDate){e.locale(l.options.language);var n,i,a,r,s,o,d,u,c,h=l.viewDate.year(),p=l.viewDate.month(),f=l.options.minDate.year(),m=l.options.minDate.month(),_=l.options.maxDate.year(),g=l.options.maxDate.month(),y=[],v=e.months();for(l.widget.find(".datepicker-days").find(".disabled").removeClass("disabled"),l.widget.find(".datepicker-months").find(".disabled").removeClass("disabled"),l.widget.find(".datepicker-years").find(".disabled").removeClass("disabled"),l.widget.find(".datepicker-days th:eq(1)").text(v[p]+" "+h),i=e(l.viewDate,l.format,l.options.useStrict).subtract(1,"months"),d=i.daysInMonth(),i.date(d).startOf("week"),(h===f&&m>=p||f>h)&&l.widget.find(".datepicker-days th:eq(0)").addClass("disabled"),(h===_&&p>=g||h>_)&&l.widget.find(".datepicker-days th:eq(2)").addClass("disabled"),a=e(i).add(42,"d");i.isBefore(a);){if(i.weekday()===e().startOf("week").weekday()&&(r=t(""),y.push(r),l.options.calendarWeeks===!0&&r.append(''+i.week()+"")),s="",i.year()h||i.year()===h&&i.month()>p)&&(s+=" new"),i.isSame(e({y:l.date.year(),M:l.date.month(),d:l.date.date()}))&&(s+=" active"),(P(i,"day")||!W(i))&&(s+=" disabled"),l.options.showToday===!0&&i.isSame(e(),"day")&&(s+=" today"),l.options.daysOfWeekDisabled)for(o=0;o'+i.date()+""),n=i.date(),i.add(1,"d"),n===i.date()&&i.add(1,"d")}for(l.widget.find(".datepicker-days tbody").empty().append(y),c=l.date.year(),v=l.widget.find(".datepicker-months").find("th:eq(1)").text(h).end().find("span").removeClass("active"),c===h&&v.eq(l.date.month()).addClass("active"),f>h-1&&l.widget.find(".datepicker-months th:eq(0)").addClass("disabled"),h+1>_&&l.widget.find(".datepicker-months th:eq(2)").addClass("disabled"),o=0;12>o;o++)h===f&&m>o||f>h?t(v[o]).addClass("disabled"):(h===_&&o>g||h>_)&&t(v[o]).addClass("disabled");for(y="",h=10*parseInt(h/10,10),u=l.widget.find(".datepicker-years").find("th:eq(1)").text(h+"-"+(h+9)).parents("table").find("td"),l.widget.find(".datepicker-years").find("th").removeClass("disabled"),f>h&&l.widget.find(".datepicker-years").find("th:eq(0)").addClass("disabled"),h+9>_&&l.widget.find(".datepicker-years").find("th:eq(2)").addClass("disabled"),h-=1,o=-1;11>o;o++)y+='h||h>_?" disabled":"")+'">'+h+"",h+=1;u.html(y)}},b=function(){e.locale(l.options.language);var t,n,i,a=l.widget.find(".timepicker .timepicker-hours table"),r="";if(a.parent().hide(),l.use24hours)for(t=0,n=0;6>n;n+=1){for(r+="",i=0;4>i;i+=1)r+=''+$(t.toString())+"",t++;r+=""}else for(t=1,n=0;3>n;n+=1){for(r+="",i=0;4>i;i+=1)r+=''+$(t.toString())+"",t++;r+=""}a.html(r)},w=function(){var t,e,n=l.widget.find(".timepicker .timepicker-minutes table"),i="",a=0,r=l.options.minuteStepping;for(n.parent().hide(),1===r&&(r=5),t=0;te;e+=1)60>a?(i+=''+$(a.toString())+"",a+=r):i+="";i+=""}n.html(i)},M=function(){var t,e,n=l.widget.find(".timepicker .timepicker-seconds table"),i="",a=0;for(n.parent().hide(),t=0;3>t;t++){for(i+="",e=0;4>e;e+=1)i+=''+$(a.toString())+"",a+=5;i+=""}n.html(i)},L=function(){if(l.date){var t=l.widget.find(".timepicker span[data-time-component]"),e=l.date.hours(),n=l.date.format("A");l.use24hours||(0===e?e=12:12!==e&&(e%=12),l.widget.find(".timepicker [data-action=togglePeriod]").text(n)),t.filter("[data-time-component=hours]").text($(e)),t.filter("[data-time-component=minutes]").text($(l.date.minutes())),t.filter("[data-time-component=seconds]").text($(l.date.second()))}},x=function(n){n.stopPropagation(),n.preventDefault(),l.unset=!1;var i,a,r,s,o=t(n.target).closest("span, td, th"),d=e(l.date);if(1===o.length&&!o.is(".disabled"))switch(o[0].nodeName.toLowerCase()){case"th":switch(o[0].className){case"picker-switch":C(1);break;case"prev":case"next":r=z.modes[l.viewMode].navStep,"prev"===o[0].className&&(r=-1*r),l.viewDate.add(r,z.modes[l.viewMode].navFnc),v()}break;case"span":o.is(".month")?(i=o.parent().find("span").index(o),l.viewDate.month(i)):(a=parseInt(o.text(),10)||0,l.viewDate.year(a)),l.viewMode===l.minViewMode&&(l.date=e({y:l.viewDate.year(),M:l.viewDate.month(),d:l.viewDate.date(),h:l.date.hours(),m:l.date.minutes(),s:l.date.seconds()}),I(),f(d,n.type)),C(-1),v();break;case"td":o.is(".day")&&(s=parseInt(o.text(),10)||1,i=l.viewDate.month(),a=l.viewDate.year(),o.is(".old")?0===i?(i=11,a-=1):i-=1:o.is(".new")&&(11===i?(i=0,a+=1):i+=1),l.date=e({y:a,M:i,d:s,h:l.date.hours(),m:l.date.minutes(),s:l.date.seconds()}),l.viewDate=e({y:a,M:i,d:Math.min(28,s)}),v(),I(),f(d,n.type))}},D={incrementHours:function(){H("add","hours",1)},incrementMinutes:function(){H("add","minutes",l.options.minuteStepping)},incrementSeconds:function(){H("add","seconds",1)},decrementHours:function(){H("subtract","hours",1)},decrementMinutes:function(){H("subtract","minutes",l.options.minuteStepping)},decrementSeconds:function(){H("subtract","seconds",1)},togglePeriod:function(){var t=l.date.hours();t>=12?t-=12:t+=12,l.date.hours(t)},showPicker:function(){l.widget.find(".timepicker > div:not(.timepicker-picker)").hide(),l.widget.find(".timepicker .timepicker-picker").show() -},showHours:function(){l.widget.find(".timepicker .timepicker-picker").hide(),l.widget.find(".timepicker .timepicker-hours").show()},showMinutes:function(){l.widget.find(".timepicker .timepicker-picker").hide(),l.widget.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){l.widget.find(".timepicker .timepicker-picker").hide(),l.widget.find(".timepicker .timepicker-seconds").show()},selectHour:function(e){var n=parseInt(t(e.target).text(),10);l.use24hours||(l.date.hours()>=12?12!==n&&(n+=12):12===n&&(n=0)),l.date.hours(n),D.showPicker.call(l)},selectMinute:function(e){l.date.minutes(parseInt(t(e.target).text(),10)),D.showPicker.call(l)},selectSecond:function(e){l.date.seconds(parseInt(t(e.target).text(),10)),D.showPicker.call(l)}},T=function(n){var i=e(l.date),a=t(n.currentTarget).data("action"),r=D[a].apply(l,arguments);return k(n),l.date||(l.date=e({y:1970})),I(),L(),f(i,n.type),r},k=function(t){t.stopPropagation(),t.preventDefault()},Y=function(t){27===t.keyCode&&l.hide()},S=function(n){e.locale(l.options.language);var i=t(n.target),a=e(l.date),r=e(i.val(),l.format,l.options.useStrict);r.isValid()&&!P(r)&&W(r)?(_(),l.setValue(r),f(a,n.type),I()):(l.viewDate=a,l.unset=!0,f(a,n.type),m(r))},C=function(t){t&&(l.viewMode=Math.max(l.minViewMode,Math.min(2,l.viewMode+t))),l.widget.find(".datepicker > div").hide().filter(".datepicker-"+z.modes[l.viewMode].clsName).show()},A=function(){var e,n,i,a,r;l.widget.on("click",".datepicker *",t.proxy(x,this)),l.widget.on("click","[data-action]",t.proxy(T,this)),l.widget.on("mousedown",t.proxy(k,this)),l.element.on("keydown",t.proxy(Y,this)),l.options.pickDate&&l.options.pickTime&&l.widget.on("click.togglePicker",".accordion-toggle",function(s){if(s.stopPropagation(),e=t(this),n=e.closest("ul"),i=n.find(".in"),a=n.find(".collapse:not(.in)"),i&&i.length){if(r=i.data("collapse"),r&&r.transitioning)return;i.collapse("hide"),a.collapse("show"),e.find("span").toggleClass(l.options.icons.time+" "+l.options.icons.date),l.component&&l.component.find("span").toggleClass(l.options.icons.time+" "+l.options.icons.date)}}),l.isInput?l.element.on({click:t.proxy(l.show,this),focus:t.proxy(l.show,this),change:t.proxy(S,this),blur:t.proxy(l.hide,this)}):(l.element.on({change:t.proxy(S,this)},"input"),l.component?(l.component.on("click",t.proxy(l.show,this)),l.component.on("mousedown",t.proxy(k,this))):l.element.on("click",t.proxy(l.show,this)))},F=function(){t(window).on("resize.datetimepicker"+l.id,t.proxy(p,this)),l.isInput||t(document).on("mousedown.datetimepicker"+l.id,t.proxy(l.hide,this))},E=function(){l.widget.off("click",".datepicker *",l.click),l.widget.off("click","[data-action]"),l.widget.off("mousedown",l.stopEvent),l.options.pickDate&&l.options.pickTime&&l.widget.off("click.togglePicker"),l.isInput?l.element.off({focus:l.show,change:S,click:l.show,blur:l.hide}):(l.element.off({change:S},"input"),l.component?(l.component.off("click",l.show),l.component.off("mousedown",l.stopEvent)):l.element.off("click",l.show))},j=function(){t(window).off("resize.datetimepicker"+l.id),l.isInput||t(document).off("mousedown.datetimepicker"+l.id)},N=function(){if(l.element){var e,n=l.element.parents(),i=!1;for(e=0;e0?i:!1},$=function(t){return t=t.toString(),t.length>=2?t:"0"+t},B=function(){var t='‹›',e='',n='
'+t+'
'+t+e+'
'+t+e+"
",i="";return l.options.pickDate&&l.options.pickTime?(i='
',i+=l.options.sideBySide?'
'+n+'
'+R.getTemplate()+"
":'
    '+n+'
  • '+R.getTemplate()+"
",i+="
"):l.options.pickTime?'":'"},z={modes:[{clsName:"days",navFnc:"month",navStep:1},{clsName:"months",navFnc:"year",navStep:1},{clsName:"years",navFnc:"year",navStep:10}]},R={hourTemplate:'',minuteTemplate:'',secondTemplate:''};R.getTemplate=function(){return'
"+(l.options.useSeconds?'':"")+(l.use24hours?"":'')+" "+(l.options.useSeconds?'":"")+(l.use24hours?"":'')+'"+(l.options.useSeconds?'':"")+(l.use24hours?"":'')+'
'+(l.options.useMinutes?'':"")+"
"+R.hourTemplate+' :'+(l.options.useMinutes?R.minuteTemplate:'00')+":'+R.secondTemplate+"
'+(l.options.useMinutes?'':"")+"
'+(l.options.useSeconds?'
':"")},l.destroy=function(){E(),j(),l.widget.remove(),l.element.removeData("DateTimePicker"),l.component&&l.component.removeData("DateTimePicker")},l.show=function(t){if(!c().prop("disabled")){if(l.options.useCurrent&&""===c().val()){if(1!==l.options.minuteStepping){var n=e(),i=l.options.minuteStepping;n.minutes(Math.round(n.minutes()/i)*i%60).seconds(0),l.setValue(n.format(l.format))}else l.setValue(e().format(l.format));f("",t.type)}t&&"click"===t.type&&l.isInput&&l.widget.hasClass("picker-open")||(l.widget.hasClass("picker-open")?(l.widget.hide(),l.widget.removeClass("picker-open")):(l.widget.show(),l.widget.addClass("picker-open")),l.height=l.component?l.component.outerHeight():l.element.outerHeight(),p(),l.element.trigger({type:"dp.show",date:e(l.date)}),F(),t&&k(t))}},l.disable=function(){var t=c();t.prop("disabled")||(t.prop("disabled",!0),E())},l.enable=function(){var t=c();t.prop("disabled")&&(t.prop("disabled",!1),A())},l.hide=function(){var t,n,i=l.widget.find(".collapse");for(t=0;t0?this.window.innerWidth:this.screen.width,768>width?($("div.navbar-collapse").addClass("collapse"),topOffset=100):$("div.navbar-collapse").removeClass("collapse"),height=this.window.innerHeight>0?this.window.innerHeight:this.screen.height,height-=topOffset,1>height&&(height=1),height>topOffset&&$("#page-wrapper").css("min-height",height+"px")})}); \ No newline at end of file diff --git a/resources/css/bootstrap.min.css b/public/default/css/bootstrap.min.css similarity index 100% rename from resources/css/bootstrap.min.css rename to public/default/css/bootstrap.min.css diff --git a/resources/css/dataTables.bootstrap.css b/public/default/css/dataTables.bootstrap.css similarity index 92% rename from resources/css/dataTables.bootstrap.css rename to public/default/css/dataTables.bootstrap.css index 1a6310fe..913b07bf 100755 --- a/resources/css/dataTables.bootstrap.css +++ b/public/default/css/dataTables.bootstrap.css @@ -1,3 +1,7 @@ +.dataTables_wrapper { + margin-top: 15px; +} + div.dataTables_length label { float: left; text-align: left; @@ -210,4 +214,11 @@ div.DTFC_LeftBodyWrapper tbody tr:first-child td { div.DTFC_RightFootWrapper table, div.DTFC_LeftFootWrapper table { border-top: none; +} + +.dataTables_processing { + position: absolute; + left: 50%; + top: 140px; + margin-left: -35px; } \ No newline at end of file diff --git a/resources/css/ekko-lightbox.min.css b/public/default/css/ekko-lightbox.min.css similarity index 100% rename from resources/css/ekko-lightbox.min.css rename to public/default/css/ekko-lightbox.min.css diff --git a/public/default/css/font-awesome.min.css b/public/default/css/font-awesome.min.css new file mode 100755 index 00000000..3d920fc8 --- /dev/null +++ b/public/default/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.1.0 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.1.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-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}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.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-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{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:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.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{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-square:before,.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-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-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"} \ No newline at end of file diff --git a/resources/css/bootstrap-datetimepicker.min.css b/public/default/css/formitems/datetime/bootstrap-datetimepicker.min.css similarity index 100% rename from resources/css/bootstrap-datetimepicker.min.css rename to public/default/css/formitems/datetime/bootstrap-datetimepicker.min.css diff --git a/public/default/css/formitems/datetime/style.css b/public/default/css/formitems/datetime/style.css new file mode 100644 index 00000000..d0ecaa3c --- /dev/null +++ b/public/default/css/formitems/datetime/style.css @@ -0,0 +1,7 @@ +.input-group-addon .fa-calendar, .input-group-addon .fa-clock-o { + cursor: pointer; +} + +.form-group.datepicker, .form-group.timepicker { + width: 250px; +} \ No newline at end of file diff --git a/public/default/css/formitems/image/images.css b/public/default/css/formitems/image/images.css new file mode 100644 index 00000000..24c7a4e7 --- /dev/null +++ b/public/default/css/formitems/image/images.css @@ -0,0 +1,3 @@ +.images-group .imageThumbnail { + cursor: move; +} \ No newline at end of file diff --git a/public/default/css/formitems/select/chosen-sprite.png b/public/default/css/formitems/select/chosen-sprite.png new file mode 100755 index 00000000..c57da70b Binary files /dev/null and b/public/default/css/formitems/select/chosen-sprite.png differ diff --git a/public/default/css/formitems/select/chosen-sprite@2x.png b/public/default/css/formitems/select/chosen-sprite@2x.png new file mode 100755 index 00000000..6b505452 Binary files /dev/null and b/public/default/css/formitems/select/chosen-sprite@2x.png differ diff --git a/public/default/css/formitems/select/chosen.css b/public/default/css/formitems/select/chosen.css new file mode 100755 index 00000000..e7ea0922 --- /dev/null +++ b/public/default/css/formitems/select/chosen.css @@ -0,0 +1,450 @@ +/*! +Chosen, a Select Box Enhancer for jQuery and Prototype +by Patrick Filler for Harvest, http://getharvest.com + +Version 1.4.2 +Full source at https://github.com/harvesthq/chosen +Copyright (c) 2011-2015 Harvest http://getharvest.com + +MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md +This file is generated by `grunt build`, do not edit it by hand. +*/ + +/* @group Base */ +.chosen-container { + position: relative; + display: inline-block; + vertical-align: middle; + font-size: 13px; + zoom: 1; + *display: inline; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.chosen-container * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.chosen-container .chosen-drop { + position: absolute; + top: 100%; + left: -9999px; + z-index: 1010; + width: 100%; + border: 1px solid #aaa; + border-top: 0; + background: #fff; + box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); +} +.chosen-container.chosen-with-drop .chosen-drop { + left: 0; +} +.chosen-container a { + cursor: pointer; +} +.chosen-container .search-choice .group-name, .chosen-container .chosen-single .group-name { + margin-right: 4px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-weight: normal; + color: #999999; +} +.chosen-container .search-choice .group-name:after, .chosen-container .chosen-single .group-name:after { + content: ":"; + padding-left: 2px; + vertical-align: top; +} + +/* @end */ +/* @group Single Chosen */ +.chosen-container-single .chosen-single { + position: relative; + display: block; + overflow: hidden; + padding: 0 0 0 8px; + height: 25px; + border: 1px solid #aaa; + border-radius: 5px; + background-color: #fff; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); + background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-clip: padding-box; + box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); + color: #444; + text-decoration: none; + white-space: nowrap; + line-height: 24px; +} +.chosen-container-single .chosen-default { + color: #999; +} +.chosen-container-single .chosen-single span { + display: block; + overflow: hidden; + margin-right: 26px; + text-overflow: ellipsis; + white-space: nowrap; +} +.chosen-container-single .chosen-single-with-deselect span { + margin-right: 38px; +} +.chosen-container-single .chosen-single abbr { + position: absolute; + top: 6px; + right: 26px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-single .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single.chosen-disabled .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single .chosen-single div { + position: absolute; + top: 0; + right: 0; + display: block; + width: 18px; + height: 100%; +} +.chosen-container-single .chosen-single div b { + display: block; + width: 100%; + height: 100%; + background: url('chosen-sprite.png') no-repeat 0px 2px; +} +.chosen-container-single .chosen-search { + position: relative; + z-index: 1010; + margin: 0; + padding: 3px 4px; + white-space: nowrap; +} +.chosen-container-single .chosen-search input[type="text"] { + margin: 1px 0; + padding: 4px 20px 4px 5px; + width: 100%; + height: auto; + outline: 0; + border: 1px solid #aaa; + background: white url('chosen-sprite.png') no-repeat 100% -20px; + background: url('chosen-sprite.png') no-repeat 100% -20px; + font-size: 1em; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-single .chosen-drop { + margin-top: -1px; + border-radius: 0 0 4px 4px; + background-clip: padding-box; +} +.chosen-container-single.chosen-container-single-nosearch .chosen-search { + position: absolute; + left: -9999px; +} + +/* @end */ +/* @group Results */ +.chosen-container .chosen-results { + color: #444; + position: relative; + overflow-x: hidden; + overflow-y: auto; + margin: 0 4px 4px 0; + padding: 0 0 0 4px; + max-height: 240px; + -webkit-overflow-scrolling: touch; +} +.chosen-container .chosen-results li { + display: none; + margin: 0; + padding: 5px 6px; + list-style: none; + line-height: 15px; + word-wrap: break-word; + -webkit-touch-callout: none; +} +.chosen-container .chosen-results li.active-result { + display: list-item; + cursor: pointer; +} +.chosen-container .chosen-results li.disabled-result { + display: list-item; + color: #ccc; + cursor: default; +} +.chosen-container .chosen-results li.highlighted { + background-color: #3875d7; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); + color: #fff; +} +.chosen-container .chosen-results li.no-results { + color: #777; + display: list-item; + background: #f4f4f4; +} +.chosen-container .chosen-results li.group-result { + display: list-item; + font-weight: bold; + cursor: default; +} +.chosen-container .chosen-results li.group-option { + padding-left: 15px; +} +.chosen-container .chosen-results li em { + font-style: normal; + text-decoration: underline; +} + +/* @end */ +/* @group Multi Chosen */ +.chosen-container-multi .chosen-choices { + position: relative; + overflow: hidden; + margin: 0; + padding: 0 5px; + width: 100%; + height: auto !important; + height: 1%; + border: 1px solid #aaa; + background-color: #fff; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(#eeeeee 1%, #ffffff 15%); + cursor: text; +} +.chosen-container-multi .chosen-choices li { + float: left; + list-style: none; +} +.chosen-container-multi .chosen-choices li.search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { + margin: 1px 0; + padding: 0; + height: 25px; + outline: 0; + border: 0 !important; + background: transparent !important; + box-shadow: none; + color: #999; + font-size: 100%; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-multi .chosen-choices li.search-choice { + position: relative; + margin: 3px 5px 3px 0; + padding: 3px 20px 3px 5px; + border: 1px solid #aaa; + max-width: 100%; + border-radius: 3px; + background-color: #eeeeee; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-size: 100% 19px; + background-repeat: repeat-x; + background-clip: padding-box; + box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); + color: #333; + line-height: 13px; + cursor: default; +} +.chosen-container-multi .chosen-choices li.search-choice span { + word-wrap: break-word; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { + position: absolute; + top: 4px; + right: 3px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-choices li.search-choice-disabled { + padding-right: 5px; + border: 1px solid #ccc; + background-color: #e4e4e4; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + color: #666; +} +.chosen-container-multi .chosen-choices li.search-choice-focus { + background: #d4d4d4; +} +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-results { + margin: 0; + padding: 0; +} +.chosen-container-multi .chosen-drop .result-selected { + display: list-item; + color: #ccc; + cursor: default; +} + +/* @end */ +/* @group Active */ +.chosen-container-active .chosen-single { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active.chosen-with-drop .chosen-single { + border: 1px solid #aaa; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); + background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: linear-gradient(#eeeeee 20%, #ffffff 80%); + box-shadow: 0 1px 0 #fff inset; +} +.chosen-container-active.chosen-with-drop .chosen-single div { + border-left: none; + background: transparent; +} +.chosen-container-active.chosen-with-drop .chosen-single div b { + background-position: -18px 2px; +} +.chosen-container-active .chosen-choices { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active .chosen-choices li.search-field input[type="text"] { + color: #222 !important; +} + +/* @end */ +/* @group Disabled Support */ +.chosen-disabled { + opacity: 0.5 !important; + cursor: default; +} +.chosen-disabled .chosen-single { + cursor: default; +} +.chosen-disabled .chosen-choices .search-choice .search-choice-close { + cursor: default; +} + +/* @end */ +/* @group Right to Left */ +.chosen-rtl { + text-align: right; +} +.chosen-rtl .chosen-single { + overflow: visible; + padding: 0 8px 0 0; +} +.chosen-rtl .chosen-single span { + margin-right: 0; + margin-left: 26px; + direction: rtl; +} +.chosen-rtl .chosen-single-with-deselect span { + margin-left: 38px; +} +.chosen-rtl .chosen-single div { + right: auto; + left: 3px; +} +.chosen-rtl .chosen-single abbr { + right: auto; + left: 26px; +} +.chosen-rtl .chosen-choices li { + float: right; +} +.chosen-rtl .chosen-choices li.search-field input[type="text"] { + direction: rtl; +} +.chosen-rtl .chosen-choices li.search-choice { + margin: 3px 5px 3px 0; + padding: 3px 5px 3px 19px; +} +.chosen-rtl .chosen-choices li.search-choice .search-choice-close { + right: auto; + left: 4px; +} +.chosen-rtl.chosen-container-single-nosearch .chosen-search, +.chosen-rtl .chosen-drop { + left: 9999px; +} +.chosen-rtl.chosen-container-single .chosen-results { + margin: 0 0 4px 4px; + padding: 0 4px 0 0; +} +.chosen-rtl .chosen-results li.group-option { + padding-right: 15px; + padding-left: 0; +} +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { + border-right: none; +} +.chosen-rtl .chosen-search input[type="text"] { + padding: 4px 5px 4px 20px; + background: white url('chosen-sprite.png') no-repeat -30px -20px; + background: url('chosen-sprite.png') no-repeat -30px -20px; + direction: rtl; +} +.chosen-rtl.chosen-container-single .chosen-single div b { + background-position: 6px 2px; +} +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { + background-position: -12px 2px; +} + +/* @end */ +/* @group Retina compatibility */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi), only screen and (min-resolution: 1.5dppx) { + .chosen-rtl .chosen-search input[type="text"], + .chosen-container-single .chosen-single abbr, + .chosen-container-single .chosen-single div b, + .chosen-container-single .chosen-search input[type="text"], + .chosen-container-multi .chosen-choices .search-choice .search-choice-close, + .chosen-container .chosen-results-scroll-down span, + .chosen-container .chosen-results-scroll-up span { + background-image: url('chosen-sprite@2x.png') !important; + background-size: 52px 37px !important; + background-repeat: no-repeat !important; + } +} +/* @end */ diff --git a/public/default/css/jquery.nestable.css b/public/default/css/jquery.nestable.css new file mode 100644 index 00000000..84563f07 --- /dev/null +++ b/public/default/css/jquery.nestable.css @@ -0,0 +1,70 @@ +/** + * Nestable + */ +.dd-list { display: block; position: relative; margin: 0; padding: 0; list-style: none; } +.dd-list .dd-list { padding-left: 30px; } +.dd-collapsed .dd-list { display: none; } + +.dd-item, +.dd-empty, +.dd-placeholder { display: block; position: relative; margin: 0; padding: 0; min-height: 20px; font-size: 13px; line-height: 20px; } + +.dd-handle { display: block; height: 30px; margin: 5px 0; cursor: move; padding: 5px 10px; color: #333; text-decoration: none; font-weight: 400; border: 1px solid #ccc; + background: #fafafa; + -webkit-border-radius: 3px; + border-radius: 3px; + box-sizing: border-box; -moz-box-sizing: border-box; +} +.dd-handle:hover { color: #2ea8e5; background: #fff; } + +.dd-item > button { display: block; position: relative; cursor: pointer; float: left; width: 25px; height: 20px; margin: 7px 0; padding: 0; text-indent: 100%; white-space: nowrap; overflow: hidden; border: 0; background: transparent; font-size: 10px; line-height: 1; text-align: center; font-weight: bold; } +.dd-item > button:before { content: '\f067'; display: block; position: absolute; width: 100%; text-align: center; text-indent: 0; font-family: 'FontAwesome' } +.dd-item > button[data-action="collapse"]:before { content: '\f068'; } + +.dd-placeholder, +.dd-empty { + margin: 5px 0; padding: 0; min-height: 30px; background: #f2fbff; border: 1px dashed #b6bcbf; + box-sizing: border-box; -moz-box-sizing: border-box; } +.dd-empty { border: 1px dashed #bbb; min-height: 100px; background-color: #e5e5e5; + background-size: 60px 60px; + background-position: 0 0, 30px 30px; +} + +.dd-dragel { position: absolute; pointer-events: none; z-index: 9999; } +.dd-dragel > .dd-item .dd-handle { margin-top: 0; } +.dd-dragel .dd-handle { + -webkit-box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1); + box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1); +} + +.dd-hover > .dd-handle { background: #2ea8e5 !important; } + +/** + * Nestable Draggable Handles + */ + +.dd3-content { display: block; height: 30px; margin: 5px 0; padding: 5px 10px 5px 40px; color: #333; text-decoration: none; font-weight: 400; border: 1px solid #ccc; + background: #fafafa; + -webkit-border-radius: 3px; + border-radius: 3px; + box-sizing: border-box; -moz-box-sizing: border-box; +} +.dd3-not-reorderable .dd3-content +{ + padding-left: 10px; +} +.dd3-content:hover { color: #2ea8e5; background: #fff; } + +.dd-dragel > .dd3-item > .dd3-content { margin: 0; } + +.dd3-item > button { margin-left: 30px; } +.dd3-not-reorderable.dd3-item > button { margin-left: 10px; } + +.dd3-handle { position: absolute; margin: 0; left: 0; top: 0; cursor:move; width: 30px; text-indent: 100%; white-space: nowrap; overflow: hidden; + border: 1px solid #aaa; + background: #ddd; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.dd3-handle:before { content: '≡'; display: block; position: absolute; left: 0; top: 3px; width: 100%; text-align: center; text-indent: 0; color: #fff; font-size: 20px; font-weight: normal; } +.dd3-handle:hover { background: #ddd; } \ No newline at end of file diff --git a/resources/css/sb-admin-2.css b/public/default/css/sb-admin-2.css similarity index 93% rename from resources/css/sb-admin-2.css rename to public/default/css/sb-admin-2.css index 47e576d4..38407210 100755 --- a/resources/css/sb-admin-2.css +++ b/public/default/css/sb-admin-2.css @@ -342,4 +342,8 @@ table.dataTable thead .sorting:after { .panel-yellow a:hover { color: #df8a13; +} + +.tab-content { + padding: 10px 0; } \ No newline at end of file diff --git a/public/fonts/FontAwesome.otf b/public/default/fonts/FontAwesome.otf similarity index 100% rename from public/fonts/FontAwesome.otf rename to public/default/fonts/FontAwesome.otf diff --git a/public/fonts/fontawesome-webfont.eot b/public/default/fonts/fontawesome-webfont.eot similarity index 100% rename from public/fonts/fontawesome-webfont.eot rename to public/default/fonts/fontawesome-webfont.eot diff --git a/public/fonts/fontawesome-webfont.svg b/public/default/fonts/fontawesome-webfont.svg similarity index 100% rename from public/fonts/fontawesome-webfont.svg rename to public/default/fonts/fontawesome-webfont.svg diff --git a/public/fonts/fontawesome-webfont.ttf b/public/default/fonts/fontawesome-webfont.ttf similarity index 100% rename from public/fonts/fontawesome-webfont.ttf rename to public/default/fonts/fontawesome-webfont.ttf diff --git a/public/fonts/fontawesome-webfont.woff b/public/default/fonts/fontawesome-webfont.woff similarity index 100% rename from public/fonts/fontawesome-webfont.woff rename to public/default/fonts/fontawesome-webfont.woff diff --git a/public/default/js/admin-default.js b/public/default/js/admin-default.js new file mode 100644 index 00000000..6824e002 --- /dev/null +++ b/public/default/js/admin-default.js @@ -0,0 +1,34 @@ +$(function () +{ + // select active link in menu + (function () + { + var currentPage = window.location.href; + currentPage = currentPage.replace(window.location.search, ''); + currentPage = currentPage.replace(/\/create$/, ''); + currentPage = currentPage.replace(/\/([0-9]+)\/edit/, ''); + + var currentPageLink = $('#side-menu a[href="' + window.location.href + '"]'); + if ( ! currentPageLink.length) + { + currentPageLink = $('#side-menu a[href="' + currentPage + '"]'); + } + currentPageLink.addClass('active').parents('li').addClass('active').end().parents('ul').addClass('collapse').addClass('in'); + })(); + + // create tooltips + (function () + { + $('html').tooltip({ + selector: "[data-toggle=tooltip]", + container: "body" + }) + })(); + + // autofocus first text input + (function () + { + $('input[type="text"]:first').focus(); + })(); + +}); \ No newline at end of file diff --git a/resources/js/bootbox.js b/public/default/js/bootbox.js similarity index 100% rename from resources/js/bootbox.js rename to public/default/js/bootbox.js diff --git a/resources/js/bootstrap.min.js b/public/default/js/bootstrap.min.js similarity index 100% rename from resources/js/bootstrap.min.js rename to public/default/js/bootstrap.min.js diff --git a/public/default/js/columnfilters/base.js b/public/default/js/columnfilters/base.js new file mode 100644 index 00000000..28bccf3a --- /dev/null +++ b/public/default/js/columnfilters/base.js @@ -0,0 +1 @@ +window.columnFilters = {}; \ No newline at end of file diff --git a/public/default/js/columnfilters/range.js b/public/default/js/columnfilters/range.js new file mode 100644 index 00000000..b9482587 --- /dev/null +++ b/public/default/js/columnfilters/range.js @@ -0,0 +1,70 @@ +window.columnFilters.range = function (container, table) +{ + var $container = $(container); + var $input = $container.find('input'); + var from = $input.filter(':first'); + var to = $input.filter(':last'); + var index = $container.closest('td').data('index'); + + from.data('ajax-data-name', 'from'); + to.data('ajax-data-name', 'to'); + + $.fn.dataTable.ext.search.push(function (settings, data, dataIndex) + { + if (table.settings()[0].sTableId != settings.sTableId) + { + return true; + } + var value = table.data()[dataIndex][index]; + if (value['@data-order'] !== undefined) + { + value = value['@data-order']; + } + + var fromValue = from.val(); + var toValue = to.val(); + if ((from.closest('.datepicker').length > 0) && (to.closest('.datepicker').length > 0)) + { + if (fromValue != '') + { + fromValue = from.closest('.datepicker').data('DateTimePicker').getDate(); + } else + { + fromValue = Number.NEGATIVE_INFINITY; + } + if (toValue != '') + { + toValue = to.closest('.datepicker').data('DateTimePicker').getDate(); + } else + { + toValue = Number.POSITIVE_INFINITY; + } + + value = moment(value); + } else + { + value = parseInt(value); + if (fromValue != '') + { + fromValue = parseInt(fromValue); + } else + { + fromValue = Number.NEGATIVE_INFINITY; + } + if (toValue != '') + { + toValue = parseInt(toValue); + } else + { + toValue = Number.POSITIVE_INFINITY; + } + } + + return (value >= fromValue && value <= toValue); + }); + + $input.on('keyup change', function () + { + table.draw(); + }); +}; \ No newline at end of file diff --git a/public/default/js/columnfilters/select.js b/public/default/js/columnfilters/select.js new file mode 100644 index 00000000..4e7c3915 --- /dev/null +++ b/public/default/js/columnfilters/select.js @@ -0,0 +1,9 @@ +window.columnFilters.select = function (input, table) +{ + var $input = $(input); + var index = $input.closest('td').data('index'); + $input.on('change', function () + { + table.column(index).search($input.val()).draw(); + }); +}; \ No newline at end of file diff --git a/public/default/js/columnfilters/text.js b/public/default/js/columnfilters/text.js new file mode 100644 index 00000000..0a5313a8 --- /dev/null +++ b/public/default/js/columnfilters/text.js @@ -0,0 +1,9 @@ +window.columnFilters.text = function (input, table) +{ + var $input = $(input); + var index = $input.closest('td').data('index'); + $input.on('keyup change', function () + { + table.column(index).search($input.val()).draw(); + }); +}; \ No newline at end of file diff --git a/public/default/js/columns/checkbox.js b/public/default/js/columns/checkbox.js new file mode 100644 index 00000000..1d4f3c58 --- /dev/null +++ b/public/default/js/columns/checkbox.js @@ -0,0 +1,22 @@ +$(function () +{ + $('.adminCheckboxAll').change(function () + { + var checked = $(this).is(':checked'); + $('.adminCheckboxRow').prop('checked', checked).filter(':first').change(); + }); + $(document).delegate('.adminCheckboxRow', 'change', function () + { + var selected = []; + $('.adminCheckboxRow:checked').each(function () + { + selected.push($(this).val()); + }); + $('.tableActions .btnAction').each(function () + { + var $this = $(this); + var url = $this.data('href') + selected.join(','); + $this.attr('href', url); + }); + }); +}); \ No newline at end of file diff --git a/public/default/js/columns/control.js b/public/default/js/columns/control.js new file mode 100644 index 00000000..372d518f --- /dev/null +++ b/public/default/js/columns/control.js @@ -0,0 +1,16 @@ +$(function () +{ + $(document).delegate('.btn-delete', 'click', function (e) + { + e.preventDefault(); + var form = $(this).closest('form'); + bootbox.confirm(window.admin.lang.table['delete-confirm'], function (result) + { + if (result) + { + form.submit(); + } + }); + }); + bootbox.setDefaults('locale', window.admin.locale); +}); \ No newline at end of file diff --git a/public/default/js/columns/image.js b/public/default/js/columns/image.js new file mode 100644 index 00000000..885563ea --- /dev/null +++ b/public/default/js/columns/image.js @@ -0,0 +1,10 @@ +$(function () +{ + $(document).delegate('*[data-toggle="lightbox"]', 'click', function (e) + { + e.preventDefault(); + $(this).ekkoLightbox({ + always_show_close: false + }); + }); +}); \ No newline at end of file diff --git a/public/default/js/datatables/init.js b/public/default/js/datatables/init.js new file mode 100644 index 00000000..c5aa2b9c --- /dev/null +++ b/public/default/js/datatables/init.js @@ -0,0 +1,50 @@ +$(function () +{ + $.fn.dataTable.ext.errMode = function () + { + $.notify(window.admin.lang.table.error, 'error'); + }; + $('.datatables').each(function () + { + var $this = $(this); + var params = { + language: window.admin.lang.table, + stateSave: true, + lengthMenu: [ + [10, 25, 50, -1], + [10, 25, 50, window.admin.lang.table.all] + ] + }; + params = $.extend(params, $this.data('attributes')); + + var url; + if (url = $this.data('url')) + { + params.serverSide = true; + params.processing = true; + params.ajax = { + url: url, + data: function (d) + { + $this.find('.column-filter').each(function () + { + var $this = $(this); + var index = $this.closest('td').data('index'); + if (name = $this.data('ajax-data-name')) + { + d.columns[index]['search'][name] = $this.val(); + } + }); + } + }; + } + var table = $this.DataTable(params); + + $this.find('.column-filter').each(function () + { + if ($(this).parent().closest('.column-filter').length > 0) return; + var type = $(this).data('type'); + window.columnFilters[type](this, table); + }); + }); +}); \ No newline at end of file diff --git a/public/default/js/datatables/jquery.dataTables.min.js b/public/default/js/datatables/jquery.dataTables.min.js new file mode 100644 index 00000000..b696e89a --- /dev/null +++ b/public/default/js/datatables/jquery.dataTables.min.js @@ -0,0 +1,158 @@ +/*! DataTables 1.10.6 + * ©2008-2015 SpryMedia Ltd - datatables.net/license + */ +(function(Ea,P,k){var O=function(h){function V(a){var b,c,e={};h.each(a,function(d){if((b=d.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=d.replace(b[0],b[2].toLowerCase()),e[c]=d,"o"===b[1]&&V(a[d])});a._hungarianMap=e}function H(a,b,c){a._hungarianMap||V(a);var e;h.each(b,function(d){e=a._hungarianMap[d];if(e!==k&&(c||b[e]===k))"o"===e.charAt(0)?(b[e]||(b[e]={}),h.extend(!0,b[e],b[d]),H(a[e],b[e],c)):b[e]=b[d]})}function O(a){var b=m.defaults.oLanguage,c=a.sZeroRecords; +!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate"); +A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");if(a=a.aoSearchCols)for(var b=0,c=a.length;b").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("
").css({position:"absolute", +top:1,left:1,width:100,overflow:"scroll"}).append(h('
').css({width:"100%",height:10}))).appendTo("body"),c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==Math.round(c.offset().left);b.remove()}function hb(a,b,c,e,d,f){var g,i=!1;c!==k&&(g=c,i=!0);for(;e!==d;)a.hasOwnProperty(e)&&(g=i?b(g,a[e],e,a):a[e],i=!0,e+=f);return g}function Fa(a,b){var c=m.defaults.column,e=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:P.createElement("th"),sTitle:c.sTitle? +c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[e],mData:c.mData?c.mData:e,idx:e});a.aoColumns.push(c);c=a.aoPreSearchCols;c[e]=h.extend({},m.models.oSearch,c[e]);ka(a,e,h(b).data())}function ka(a,b,c){var b=a.aoColumns[b],e=a.oClasses,d=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=d.attr("width")||null;var f=(d.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),H(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&& +(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,i=W(g),j=b.mRender?W(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var e=i(a,b,k,c);return j&&b?j(e,b,a,c):e};b.fnSetData=function(a,b,c){return Q(g)(a,b,c)};"number"!==typeof g&& +(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,d.addClass(e.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=e.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=e.sSortableAsc,b.sSortingClassJUI=e.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=e.sSortableDesc,b.sSortingClassJUI=e.sSortJUIDescAllowed):(b.sSortingClass=e.sSortable,b.sSortingClassJUI=e.sSortJUI)}function X(a){if(!1!==a.oFeatures.bAutoWidth){var b= +a.aoColumns;Ga(a);for(var c=0,e=b.length;cq[f])e(l.length+q[f],n);else if("string"===typeof q[f]){i=0;for(j=l.length;ib&&a[d]--; -1!=e&&c===k&&a.splice(e,1)}function ca(a,b,c,e){var d=a.aoData[b],f,g=function(c,f){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=y(a,b,f,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===d.src)d._aData=na(a,d,e,e===k?k:d._aData).data;else{var i=d.anCells;if(i)if(e!==k)g(i[e],e);else{c=0;for(f=i.length;c").appendTo(g));b=0;for(c=l.length;btr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH); +h(i).find(">tr>th, >tr>td").addClass(n.sFooterTH);if(null!==i){a=a.aoFooter[0];b=0;for(c=a.length;b=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(i){if(!a.bDestroying&&!kb(a))return}else a.iDraw++;if(0!==j.length){f=i?a.aoData.length:n;for(i=i?0:g;i",{"class":d?e[0]:""}).append(h("",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];w(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],La(a),g,n,j]);w(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],La(a),g,n,j]);e=h(a.nTBody);e.children().detach();e.append(h(b));w(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing= +!1}}function N(a,b){var c=a.oFeatures,e=c.bFilter;c.bSort&&lb(a);e?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;M(a);a._drawHold=!1}function mb(a){var b=a.oClasses,c=h(a.nTable),c=h("
").insertBefore(c),e=a.oFeatures,d=h("
",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=d[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,i,j,n,l,q,o=0;o")[0];n=f[o+1];if("'"==n||'"'==n){l="";for(q=2;f[o+q]!=n;)l+=f[o+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),j.id=n[0].substr(1,n[0].length-1),j.className=n[1]):"#"==l.charAt(0)?j.id=l.substr(1,l.length-1):j.className=l;o+=q}d.append(j);d=h(j)}else if(">"==i)d=d.parent();else if("l"==i&&e.bPaginate&&e.bLengthChange)g=nb(a);else if("f"==i&&e.bFilter)g=ob(a);else if("r"==i&&e.bProcessing)g=pb(a);else if("t"==i)g=qb(a);else if("i"== +i&&e.bInfo)g=rb(a);else if("p"==i&&e.bPaginate)g=sb(a);else if(0!==m.ext.feature.length){j=m.ext.feature;q=0;for(n=j.length;q',i=e.sSearch,i=i.match(/_INPUT_/)?i.replace("_INPUT_",g):i+g,b=h("
",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("
").addClass(b.sLength); +a.aanFeatures.l||(j[0].id=c+"_length");j.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",d[0].outerHTML));h("select",j).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());M(a)});h(a.nTable).bind("length.dt.DT",function(b,c,f){a===c&&h("select",j).val(f)});return j[0]}function sb(a){var b=a.sPaginationType,c=m.ext.pager[b],e="function"===typeof c,d=function(a){M(a)},b=h("
").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;e||c.fnInit(a,b,d);f.p||(b.id=a.sTableId+ +"_paginate",a.aoDrawCallback.push({fn:function(a){if(e){var b=a._iDisplayStart,h=a._iDisplayLength,n=a.fnRecordsDisplay(),l=-1===h,b=l?0:Math.ceil(b/h),h=l?1:Math.ceil(n/h),n=c(b,h),q,l=0;for(q=f.p.length;lf&&(e=0)):"first"==b?e=0:"previous"==b?(e=0<=d?e-d:0,0>e&&(e=0)):"next"== +b?e+d",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");w(a,null,"processing",[a,b])}function qb(a){var b=h(a.nTable);b.attr("role", +"grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var e=c.sX,d=c.sY,f=a.oClasses,g=b.children("caption"),i=g.length?g[0]._captionSide:null,j=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");l.length||(l=null);c=h("
",{"class":f.sScrollWrapper}).append(h("
",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?!e?null:s(e):"100%"}).append(h("
",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box", +width:c.sXInner||"100%"}).append(j.removeAttr("id").css("margin-left",0).append("top"===i?g:null).append(b.children("thead"))))).append(h("
",{"class":f.sScrollBody}).css({overflow:"auto",height:!d?null:s(d),width:!e?null:s(e)}).append(b));l&&c.append(h("
",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:e?!e?null:s(e):"100%"}).append(h("
",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===i?g:null).append(b.children("tfoot"))))); +var b=c.children(),q=b[0],f=b[1],o=l?b[2]:null;if(e)h(f).on("scroll.DT",function(){var a=this.scrollLeft;q.scrollLeft=a;l&&(o.scrollLeft=a)});a.nScrollHead=q;a.nScrollBody=f;a.nScrollFoot=o;a.aoDrawCallback.push({fn:Y,sName:"scrolling"});return c[0]}function Y(a){var b=a.oScroll,c=b.sX,e=b.sXInner,d=b.sY,f=b.iBarWidth,g=h(a.nScrollHead),i=g[0].style,j=g.children("div"),n=j[0].style,l=j.children("table"),j=a.nScrollBody,q=h(j),o=j.style,k=h(a.nScrollFoot).children("div"),p=k.children("table"),m=h(a.nTHead), +r=h(a.nTable),t=r[0],u=t.style,K=a.nTFoot?h(a.nTFoot):null,ha=a.oBrowser,w=ha.bScrollOversize,x,v,y,L,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};r.children("thead, tfoot").remove();z=m.clone().prependTo(r);x=m.find("tr");y=z.find("tr");z.find("th, td").removeAttr("tabindex");K&&(L=K.clone().prependTo(r),v=K.find("tr"),L=L.find("tr"));c||(o.width="100%",g[0].style.width="100%");h.each(qa(a,z),function(b,c){D= +la(a,b);c.style.width=a.aoColumns[D].sWidth});K&&G(function(a){a.style.width=""},L);b.bCollapse&&""!==d&&(o.height=q[0].offsetHeight+m[0].offsetHeight+"px");g=r.outerWidth();if(""===c){if(u.width="100%",w&&(r.find("tbody").height()>j.offsetHeight||"scroll"==q.css("overflow-y")))u.width=s(r.outerWidth()-f)}else""!==e?u.width=s(e):g==q.width()&&q.height()g-f&&(u.width=s(g))):u.width=s(g);g=r.outerWidth();G(E,y);G(function(a){C.push(a.innerHTML);A.push(s(h(a).css("width")))}, +y);G(function(a,b){a.style.width=A[b]},x);h(y).height(0);K&&(G(E,L),G(function(a){B.push(s(h(a).css("width")))},L),G(function(a,b){a.style.width=B[b]},v),h(L).height(0));G(function(a,b){a.innerHTML='
'+C[b]+"
";a.style.width=A[b]},y);K&&G(function(a,b){a.innerHTML="";a.style.width=B[b]},L);if(r.outerWidth()j.offsetHeight||"scroll"==q.css("overflow-y")?g+f:g;if(w&&(j.scrollHeight>j.offsetHeight||"scroll"==q.css("overflow-y")))u.width= +s(v-f);(""===c||""!==e)&&R(a,1,"Possible column misalignment",6)}else v="100%";o.width=s(v);i.width=s(v);K&&(a.nScrollFoot.style.width=s(v));!d&&w&&(o.height=s(t.offsetHeight+f));d&&b.bCollapse&&(o.height=s(d),b=c&&t.offsetWidth>j.offsetWidth?f:0,t.offsetHeightj.clientHeight||"scroll"==q.css("overflow-y");ha="padding"+(ha.bScrollbarLeft?"Left":"Right");n[ha]=l?f+"px":"0px";K&&(p[0].style.width= +s(b),k[0].style.width=s(b),k[0].style[ha]=l?f+"px":"0px");q.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}function G(a,b,c){for(var e=0,d=0,f=b.length,g,i;d"));i.find("tfoot th, tfoot td").css("width","");var p=i.find("tbody tr"),j=qa(a,i.find("thead")[0]);for(o=0;o").css("width",s(a)).appendTo(b||P.body),e=c[0].offsetWidth;c.remove(); +return e}function Fb(a,b){var c=a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(h(b).outerWidth()-c)}function Eb(a,b){var c=Gb(a,b);if(0>c)return null;var e=a.aoData[c];return!e.nTr?h("").html(y(a,c,b,"display"))[0]:e.anCells[b]}function Gb(a,b){for(var c,e=-1,d=-1,f=0,g=a.aoData.length;fe&&(e=c.length,d=f);return d}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Hb(){var a= +m.__scrollbarWidth;if(a===k){var b=h("

").css({position:"absolute",top:0,left:0,width:"100%",height:150,padding:0,overflow:"scroll",visibility:"hidden"}).appendTo("body"),a=b[0].offsetWidth-b[0].clientWidth;m.__scrollbarWidth=a;b.remove()}return a}function T(a){var b,c,e=[],d=a.aoColumns,f,g,i,j;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):n.push.apply(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a< +n.length;a++){j=n[a][0];f=d[j].aDataSort;b=0;for(c=f.length;bd?1:0,0!==c)return"asc"===h.dir?c:-c;c=e[a];d=e[b];return cd?1:0}):h.sort(function(a,b){var c,g,h,i,j=n.length,k=f[a]._aSortData,m=f[b]._aSortData;for(h=0;hg?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,e=a.aoColumns,d= +T(a),a=a.oLanguage.oAria,f=0,g=e.length;f/g,"");var h=c.nTh;h.removeAttribute("aria-sort");c.bSortable&&(0d?d+1:3));d=0;for(f=e.length;dd?d+1:3))}a.aLastSort=e}function Ib(a,b){var c=a.aoColumns[b],e=m.ext.order[c.sSortDataType],d;e&&(d=e.call(a.oInstance, +a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],h=0,j=a.aoData.length;h=e.length?[0,c[1]]:c)}));d.search!==k&&h.extend(a.oPreviousSearch,Ab(d.search));b=0;for(c=d.columns.length;b=c&&(b=c-e);b-=b%e;if(-1===e||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,e=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?e[c[b]]||e._:"string"===typeof c?e[c]||e._:e._}function B(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Wa(a,b){var c=[],c=Mb.numbers_length,e=Math.floor(c/2);b<=c?c=U(0,b):a<=e?(c=U(0,c-2),c.push("ellipsis"), +c.push(b-1)):(a>=b-1-e?c=U(b-(c-2),b):(c=U(a-e+2,a+e-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Aa(b,a)},"num-fmt":function(b){return Aa(b,a,Xa)},"html-num":function(b){return Aa(b,a,Ba)},"html-num-fmt":function(b){return Aa(b,a,Ba,Xa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments)); +return m.ext.internal[a].apply(this,b)}}var m,x,t,r,u,Ya={},Ob=/[\r\n]/g,Ba=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$\u00a3\u20ac\u00a5%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,I=function(a){return!a||!0===a||"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b], +"."):a},Za=function(a,b,c){var e="string"===typeof a;if(I(a))return!0;b&&e&&(a=Qb(a,b));c&&e&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return I(a)?!0:!(I(a)||"string"===typeof a)?null:Za(a.replace(Ba,""),b,c)?!0:null},D=function(a,b,c){var e=[],d=0,f=a.length;if(c!==k)for(;d")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a, +b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[x.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),e=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return e.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],e=c.oScroll;a===k||a?b.draw(!1):(""!==e.sX||""!==e.sY)&&Y(c)};this.fnClearTable= +function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var e=this.api(!0),a=e.rows(a),d=a.settings()[0],h=d.aoData[a[0][0]];a.remove();b&&b.call(this,d,h);(c===k||c)&&e.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,e,d,h){d=this.api(!0);null===b||b===k?d.search(a,c,e,h):d.column(b).search(a,c,e,h);d.draw()}; +this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var e=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==e||"th"==e?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null}; +this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[x.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a, +b,c)};this.fnUpdate=function(a,b,c,e,d){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(d===k||d)&&h.columns.adjust();(e===k||e)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,e=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var d in m.ext.internal)d&&(this[d]=Nb(d));this.each(function(){var d={},d=1t<"F"ip>'),p.renderer)?h.isPlainObject(p.renderer)&&!p.renderer.header&&(p.renderer.header="jqueryui"):p.renderer="jqueryui":h.extend(j,m.ext.classes,d.oClasses);q.addClass(j.sTable);if(""!==p.oScroll.sX||""!==p.oScroll.sY)p.oScroll.iBarWidth=Hb();!0===p.oScroll.sX&& +(p.oScroll.sX="100%");p.iInitDisplayStart===k&&(p.iInitDisplayStart=d.iDisplayStart,p._iDisplayStart=d.iDisplayStart);null!==d.iDeferLoading&&(p.bDeferLoading=!0,g=h.isArray(d.iDeferLoading),p._iRecordsDisplay=g?d.iDeferLoading[0]:d.iDeferLoading,p._iRecordsTotal=g?d.iDeferLoading[1]:d.iDeferLoading);var t=p.oLanguage;h.extend(!0,t,d.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){O(a);H(l.oLanguage,a);h.extend(true,t,a);ga(p)},error:function(){ga(p)}}),n=!0);null=== +d.asStripeClasses&&(p.asStripeClasses=[j.sStripeOdd,j.sStripeEven]);var g=p.asStripeClasses,s=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return s.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),p.asDestroyStripes=g.slice());o=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(p.aoHeader,g[0]),o=qa(p));if(null===d.aoColumns){r=[];g=0;for(i=o.length;g").appendTo(this));p.nTHead=i[0];i=q.children("tbody"); +0===i.length&&(i=h("").appendTo(this));p.nTBody=i[0];i=q.children("tfoot");if(0===i.length&&0").appendTo(this);0===i.length||0===i.children().length?q.addClass(j.sNoFooter):0a?new t(b[a],this[a]):null},filter:function(a){var b=[]; +if(v.filter)b=v.filter.call(this,a,this);else for(var c=0,e=this.length;c").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=aa(e),d.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(d);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Vb(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});r(["row().child.remove()", +"row().child().remove()"],function(){cb(this);return this});r("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,e,d){for(var c=[],e=0,f=d.length;e=0?b:g.length+b];if(typeof a==="function"){var d=Ca(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,d),j[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[la(c,b)];case "name":return h.map(i,function(a,b){return a===k[1]?b:null})}else return h(j).filter(a).map(function(){return h.inArray(this, +j)}).toArray()})},1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column", +function(a,b){return a.aoColumns[b].mData},1)});u("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,e,d,f){return ia(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,e,d){return ia(a.aoData,d,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,e){if(a===k)return c.aoColumns[e].bVisible; +var d=c.aoColumns,f=d[e],g=c.aoData,i,j,n;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,D(d,"bVisible"),e+1);i=0;for(j=g.length;ie;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings, +function(a,d){var f=d.nScrollHead?h("table",d.nScrollHead)[0]:null,g=d.nScrollFoot?h("table",d.nScrollFoot)[0]:null;if(d.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){return h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable})};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=H;r("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a, +b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var e=h(this.tables().nodes());e[b].apply(e,a);return this})});r("clear()",function(){return this.iterator("table",function(a){oa(a)})});r("settings()",function(){return new t(this.context,this.context)});r("init()",function(){var a=this.context;return a.length?a[0].oInit:null});r("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});r("destroy()", +function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,e=b.oClasses,d=b.nTable,f=b.nTBody,g=b.nTHead,i=b.nTFoot,j=h(d),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),q;b.bDestroying=!0;w(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(Ea).unbind(".DT-"+b.sInstance);d!=g.parentNode&&(j.children("thead").detach(),j.append(g));i&&d!=i.parentNode&&(j.children("tfoot").detach(), +j.append(i));j.detach();k.detach();b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(e.sSortable+" "+e.sSortableAsc+" "+e.sSortableDesc+" "+e.sSortableNone);b.bJUI&&(h("th span."+e.sSortIcon+", td span."+e.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+e.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(d,b.nTableReinsertBefore);f.children().detach();f.append(l);j.css("width",b.sDestroyWidth).removeClass(e.sTable); +(q=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%q])});c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){r(b+"s().every()",function(a){return this.iterator(b,function(e,d,f){a.call((new t(e))[b](d,f))})})});m.version="1.10.6";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null, +_sFilterRow:null,_sRowStripe:"",src:null};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[], +ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)}, +fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname, +JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)", +sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};V(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1, +asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};V(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null, +iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[], +aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1, +_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==B(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==B(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,e=this.aiDisplay.length,d=this.oFeatures,f=d.bPaginate;return d.bServerSide? +!1===f||-1===a?b+e:Math.min(b+a,this._iRecordsDisplay):!f||c>e||-1===a?e:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{}};m.ext=x={buttons:{},classes:{},errMode:"alert",feature:[],search:[],internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect, +ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length", +sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner", +sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Da="",Da="",F=Da+"ui-state-default",ja=Da+"css_right ui-icon ui-icon-",Xb=Da+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,m.ext.classes,{sPageButton:"fg-button ui-button "+F,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_", +sSortAsc:F+" sorting_asc",sSortDesc:F+" sorting_desc",sSortable:F+" sorting",sSortableAsc:F+" sorting_asc_disabled",sSortableDesc:F+" sorting_desc_disabled",sSortableNone:F+" sorting_disabled",sSortJUIAsc:ja+"triangle-1-n",sSortJUIDesc:ja+"triangle-1-s",sSortJUI:ja+"carat-2-n-s",sSortJUIAscAllowed:ja+"carat-1-n",sSortJUIDescAllowed:ja+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+F,sScrollFoot:"dataTables_scrollFoot "+F, +sHeaderTH:F,sFooterTH:F,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous",Wa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Wa(a,b),"next","last"]},_numbers:Wa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,e,d,f){var g=a.oClasses,i= +a.oLanguage.oPaginate,j,k,l=0,m=function(b,e){var o,r,t,s,u=function(b){Ta(a,b.data.action,true)};o=0;for(r=e.length;o").appendTo(b);m(t,s)}else{k=j="";switch(s){case "ellipsis":b.append('');break;case "first":j=i.sFirst;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "previous":j=i.sPrevious;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "next":j=i.sNext;k=s+(d",{"class":g.sPageButton+" "+k,"aria-controls":a.sTableId,"data-dt-idx":l,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(j).appendTo(b);Va(t,{action:s},u);l++}}}},o;try{o=h(P.activeElement).data("dt-idx")}catch(r){}m(h(b).empty(),e);o&&h(b).find("[data-dt-idx="+o+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal; +return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||I(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return I(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search, +{html:function(a){return I(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ba,""):""},string:function(a){return I(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Aa=function(a,b,c,e){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),e&&(a=a.replace(e,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return I(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return I(a)? +"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,e){h(a.nTable).on("order.dt.DT",function(d,f,g,h){if(a===f){d=c.idx;b.removeClass(c.sSortingClass+" "+e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,e){h("

").addClass(e.sSortJUIWrapper).append(b.contents()).append(h("").addClass(e.sSortIcon+ +" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(d,f,g,h){if(a===f){d=c.idx;b.removeClass(e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass);b.find("span."+e.sSortIcon).removeClass(e.sSortJUIAsc+" "+e.sSortJUIDesc+" "+e.sSortJUI+" "+e.sSortJUIAscAllowed+" "+e.sSortJUIDescAllowed).addClass(h[d]=="asc"?e.sSortJUIAsc:h[d]=="desc"?e.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,e){return{display:function(d){if("number"!== +typeof d&&"string"!==typeof d)return d;var f=0>d?"-":"",d=Math.abs(parseFloat(d)),g=parseInt(d,10),d=c?b+(d-g).toFixed(c).substring(2):"";return f+(e||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+d}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:kb,_fnAjaxParameters:tb,_fnAjaxUpdateDraw:ub,_fnAjaxDataSrc:sa,_fnAddColumn:Fa,_fnColumnOptions:ka,_fnAdjustColumnSizing:X,_fnVisibleToColumnIndex:la,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:Z,_fnColumnTypes:Ha, +_fnApplyColumnDefs:ib,_fnHungarianMap:V,_fnCamelToHungarian:H,_fnLanguageCompat:O,_fnBrowserDetect:gb,_fnAddData:J,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:y,_fnSetCellData:Ia,_fnSplitObjNotation:Ka,_fnGetObjectDataFn:W,_fnSetObjectDataFn:Q,_fnGetDataMaster:La,_fnClearTable:oa,_fnDeleteIndex:pa,_fnInvalidate:ca,_fnGetRowElements:na,_fnCreateTr:Ja,_fnBuildHead:jb, +_fnDrawHead:ea,_fnDraw:M,_fnReDraw:N,_fnAddOptionsHtml:mb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:ob,_fnFilterComplete:fa,_fnFilterCustom:xb,_fnFilterColumn:wb,_fnFilter:vb,_fnFilterCreateSearch:Qa,_fnEscapeRegex:va,_fnFilterData:yb,_fnFeatureHtmlInfo:rb,_fnUpdateInfo:Bb,_fnInfoMacros:Cb,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:nb,_fnFeatureHtmlPaginate:sb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:pb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:qb, +_fnScrollDraw:Y,_fnApplyToChildren:G,_fnCalculateColumnWidths:Ga,_fnThrottle:ua,_fnConvertToWidth:Db,_fnScrollingWidthAdjust:Fb,_fnGetWidestNode:Eb,_fnGetMaxLenString:Gb,_fnStringToCss:s,_fnScrollBarWidth:Hb,_fnSortFlatten:T,_fnSort:lb,_fnSortAria:Jb,_fnSortListener:Ua,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:R,_fnMap:E,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:w,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:B, +_fnRowAttributes:Ma,_fnCalculateEnd:function(){}});h.fn.dataTable=m;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],O):"object"===typeof exports?module.exports=O(require("jquery")):jQuery&&!jQuery.fn.dataTable&&O(jQuery)})(window,document); diff --git a/resources/js/plugins/dataTables/jquery.dataTables_bootstrap.js b/public/default/js/datatables/jquery.dataTables_bootstrap.js similarity index 100% rename from resources/js/plugins/dataTables/jquery.dataTables_bootstrap.js rename to public/default/js/datatables/jquery.dataTables_bootstrap.js diff --git a/resources/js/ekko-lightbox.min.js b/public/default/js/ekko-lightbox.min.js similarity index 100% rename from resources/js/ekko-lightbox.min.js rename to public/default/js/ekko-lightbox.min.js diff --git a/public/ckeditor/CHANGES.md b/public/default/js/formitems/ckeditor/CHANGES.md similarity index 100% rename from public/ckeditor/CHANGES.md rename to public/default/js/formitems/ckeditor/CHANGES.md diff --git a/public/ckeditor/LICENSE.md b/public/default/js/formitems/ckeditor/LICENSE.md similarity index 100% rename from public/ckeditor/LICENSE.md rename to public/default/js/formitems/ckeditor/LICENSE.md diff --git a/public/ckeditor/README.md b/public/default/js/formitems/ckeditor/README.md similarity index 100% rename from public/ckeditor/README.md rename to public/default/js/formitems/ckeditor/README.md diff --git a/public/ckeditor/adapters/jquery.js b/public/default/js/formitems/ckeditor/adapters/jquery.js similarity index 100% rename from public/ckeditor/adapters/jquery.js rename to public/default/js/formitems/ckeditor/adapters/jquery.js diff --git a/public/ckeditor/build-config.js b/public/default/js/formitems/ckeditor/build-config.js similarity index 100% rename from public/ckeditor/build-config.js rename to public/default/js/formitems/ckeditor/build-config.js diff --git a/public/ckeditor/ckeditor.js b/public/default/js/formitems/ckeditor/ckeditor.js similarity index 99% rename from public/ckeditor/ckeditor.js rename to public/default/js/formitems/ckeditor/ckeditor.js index 2b0f9750..b4986e3c 100644 --- a/public/ckeditor/ckeditor.js +++ b/public/default/js/formitems/ckeditor/ckeditor.js @@ -493,7 +493,7 @@ arguments);b.on("load",function(){var a=this._.checkbox.getElement();a.on("prope getValue:function(){for(var b=this._.children,a=0;a','
','
'; - } - - $finalFilename = RandomFilenamer::get($upload_dir, $extension); - $file = $file->move($upload_dir, $finalFilename); - $CKEditorFuncNum = Input::get('CKEditorFuncNum'); - $url = URL::route('imagecache', [ - 'original', - $imageDirectory . '/' . $finalFilename - ]); - $message = Lang::get('admin::lang.ckeditor.upload.success', [ - 'size' => number_format($file->getSize() / 1024, 3, '.', ''), - 'width' => $width, - 'height' => $height - ]); - $result = "window.parent.CKEDITOR.tools.callFunction($CKEditorFuncNum, '$url', '$message')"; - return ''; - } - - public function getImage($filename) - { - Config::set('session.driver', 'array'); - - // find file - $image_path = false; - foreach (Config::get('imagecache.paths') as $path) - { - // don't allow '..' in filenames - $image_path = $path . '/' . str_replace('..', '', $filename); - if (file_exists($image_path) && is_file($image_path)) - { - break; - } - } - - // abort if file not found - if ($image_path === false) - { - App::abort(404); - } - - // define template callback - $callback = function ($image) - { - return $image->widen(80); - }; - - // image manipulation based on callback - $content = app('image')->cache(function ($image) use ($image_path, $callback) - { - return $callback($image->make($image_path)); - }, Config::get('imagecache::lifetime')); - - // define mime type - $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $content); - - // return http response - return new Response($content, 200, [ - 'Content-Type' => $mime, - 'Cache-Control' => 'max-age=' . (Config::get('imagecache::lifetime') * 60) . ', public', - 'Etag' => md5($content) - ]); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Controllers/LangController.php b/src/SleepingOwl/Admin/Controllers/LangController.php deleted file mode 100644 index 899da9f9..00000000 --- a/src/SleepingOwl/Admin/Controllers/LangController.php +++ /dev/null @@ -1,35 +0,0 @@ - 'text/javascript', - ]); - - return $this->cacheResponse($response); - } - - /** - * Cache the response 1 year (31536000 sec) - * @param Response $response - * @return \Illuminate\Http\Response - */ - protected function cacheResponse(Response $response) - { - $response->setSharedMaxAge(31536000); - $response->setMaxAge(31536000); - $response->setExpires(new \DateTime('+1 year')); - - return $response; - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Display/AdminDisplay.php b/src/SleepingOwl/Admin/Display/AdminDisplay.php new file mode 100644 index 00000000..4e7e4b6c --- /dev/null +++ b/src/SleepingOwl/Admin/Display/AdminDisplay.php @@ -0,0 +1,22 @@ +columnFilters() as $columnFilter) + { + if ($columnFilter instanceof ColumnFilterInterface) + { + $columnFilter->initialize(); + } + } + + AssetManager::addScript('admin::default/js/datatables/jquery.dataTables.min.js'); + AssetManager::addScript('admin::default/js/datatables/jquery.dataTables_bootstrap.js'); + AssetManager::addScript('admin::default/js/notify-combined.min.js'); + AssetManager::addScript('admin::default/js/datatables/init.js'); + + AssetManager::addStyle('admin::default/css/dataTables.bootstrap.css'); + } + + public function columnFilters($columnFilters = null) + { + if (is_null($columnFilters)) + { + return $this->columnFilters; + } + $this->columnFilters = $columnFilters; + return $this; + } + + public function attributes($attributes = null) + { + if (is_null($attributes)) + { + return $this->attributes; + } + $this->attributes = $attributes; + return $this; + } + + /** + * Set or get datatables order + * @param array|null $order + * @return $this|array + */ + public function order($order = null) + { + if (is_null($order)) + { + return $this->order; + } + $this->order = $order; + return $this; + } + + /** + * Get view render parameters + * @return array + */ + protected function getParams() + { + $params = parent::getParams(); + $params['order'] = $this->order(); + $params['columnFilters'] = $this->columnFilters(); + $params['attributes'] = $this->attributes(); + return $params; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Display/DisplayDatatablesAsync.php b/src/SleepingOwl/Admin/Display/DisplayDatatablesAsync.php new file mode 100644 index 00000000..3f138e2e --- /dev/null +++ b/src/SleepingOwl/Admin/Display/DisplayDatatablesAsync.php @@ -0,0 +1,242 @@ +name($name); + $this->distinct=$distinct; + } + + /** + * Register display routes + */ + public static function registerRoutes() + { + Route::get('{adminModel}/async/{adminDisplayName?}', [ + 'as' => 'admin.model.async', + function ($model, $name = null) + { + $display = $model->display(); + if ($display instanceof DisplayTabbed) + { + $display = static::findDatatablesAsyncByName($display, $name); + } + if ($display instanceof DisplayDatatablesAsync) + { + return $display->renderAsync(); + } + abort(404); + } + ]); + } + + /** + * Find DisplayDatatablesAsync in tabbed display by name + * @param DisplayTabbed $display + * @param string|null $name + * @return DisplayDatatablesAsync|null + */ + protected static function findDatatablesAsyncByName(DisplayTabbed $display, $name) + { + $tabs = $display->tabs(); + foreach ($tabs as $tab) + { + $content = $tab->getOriginalContent(); + if ($content instanceof DisplayDatatablesAsync && $content->name() === $name) + { + return $content; + } + } + return null; + } + + /** + * @return \Illuminate\View\View + */ + public function render() + { + $params = $this->getParams(); + $attributes = Request::all(); + array_unshift($attributes, $this->name()); + array_unshift($attributes, $this->model()->alias()); + $params['url'] = route('admin.model.async', $attributes); + return view(AdminTemplate::view('display.datatablesAsync'), $params); + } + + /** + * Render async request + * @return array + */ + public function renderAsync() + { + $query = $this->repository->query(); + $totalCount = $query->count(); + + if(!is_null($this->distinct)){ + $filteredCount = $query->distinct()->count($this->distinct); + } + + $this->modifyQuery($query); + $this->applySearch($query); + $this->applyColumnSearch($query); + + if(is_null($this->distinct)){ + $filteredCount = $query->count(); + } + + $this->applyOrders($query); + $this->applyOffset($query); + $collection = $query->get(); + + return $this->prepareDatatablesStructure($collection, $totalCount, $filteredCount); + } + + /** + * Apply offset and limit to the query + * @param $query + */ + protected function applyOffset($query) + { + $offset = Request::get('start', 0); + $limit = Request::get('length', 10); + if ($limit == -1) + { + return; + } + $query->offset($offset)->limit($limit); + } + + /** + * Apply orders to the query + * @param $query + */ + protected function applyOrders($query) + { + $orders = Request::get('order', []); + foreach ($orders as $order) + { + $columnIndex = $order['column']; + $orderDirection = $order['dir']; + $column = $this->allColumns()[$columnIndex]; + if ($column instanceof NamedColumn && $column->isOrderable()) + { + $name = $column->name(); + $query->orderBy($name, $orderDirection); + } + } + } + + /** + * Apply search to the query + * @param $query + */ + protected function applySearch($query) + { + $search = Request::get('search.value'); + if (is_null($search)) + { + return; + } + + $query->where(function ($query) use ($search) + { + $columns = $this->columns(); + foreach ($columns as $column) + { + if ($column instanceof String) + { + $name = $column->name(); + if ($this->repository->hasColumn($name)) + { + $query->orWhere($name, 'like', '%' . $search . '%'); + } + } + } + }); + } + + protected function applyColumnSearch($query) + { + $queryColumns = Request::get('columns', []); + foreach ($queryColumns as $index => $queryColumn) + { + $search = array_get($queryColumn, 'search.value'); + $fullSearch = array_get($queryColumn, 'search'); + + $column = array_get($this->columns(), $index); + $columnFilter = array_get($this->columnFilters(), $index); + if ( ! is_null($columnFilter)) + { + $columnFilter->apply($this->repository, $column, $query, $search, $fullSearch); + } + } + } + + /** + * Convert collection to the datatables structure + * + * @param $collection + * @param $totalCount + * @param $filteredCount + * @return array + */ + protected function prepareDatatablesStructure($collection, $totalCount, $filteredCount) + { + $columns = $this->allColumns(); + + $result = []; + $result['draw'] = Request::get('draw', 0); + $result['recordsTotal'] = $totalCount; + $result['recordsFiltered'] = $filteredCount; + $result['data'] = []; + foreach ($collection as $instance) + { + $_row = []; + foreach ($columns as $column) + { + $column->setInstance($instance); + $_row[] = (string)$column; + } + $result['data'][] = $_row; + } + return $result; + } + + /** + * Get or set datatables name + * @param null $name + * @return $this + */ + public function name($name = null) + { + if (is_null($name)) + { + return $this->name; + } + $this->name = $name; + return $this; + } + +} diff --git a/src/SleepingOwl/Admin/Display/DisplayTab.php b/src/SleepingOwl/Admin/Display/DisplayTab.php new file mode 100644 index 00000000..aa32e850 --- /dev/null +++ b/src/SleepingOwl/Admin/Display/DisplayTab.php @@ -0,0 +1,198 @@ +content = $content; + } + + /** + * Get or set tab label + * @param null $label + * @return $this|array + */ + public function label($label = null) + { + if (is_null($label)) + { + return $this->label; + } + $this->label = $label; + return $this; + } + + /** + * Get or set tab active state + * @param null $active + * @return $this|bool + */ + public function active($active = null) + { + if (is_null($active)) + { + return $this->active; + } + $this->active = $active; + return $this; + } + + /** + * Get or set tab name + * @param null $name + * @return $this|string + */ + public function name($name = null) + { + if (is_null($name)) + { + return (is_null($this->name)) ? md5($this->label) : $this->name; + } + $this->name = $name; + return $this; + } + + /** + * Get tab original content + * @return mixed + */ + public function getOriginalContent() + { + return $this->content; + } + + /** + * Render tab content + * @return View + */ + public function content() + { + $params = [ + 'active' => $this->active(), + 'name' => $this->name(), + 'content' => $this->content, + ]; + return view(AdminTemplate::view('display.tab_content'), $params); + } + + /** + * @param string $class + */ + public function setClass($class) + { + if ($this->content instanceof DisplayInterface) + { + $this->content->setClass($class); + } + } + + /** + * Initialize tab + */ + public function initialize() + { + if ($this->content instanceof DisplayInterface) + { + $this->content->initialize(); + } + } + + /** + * @param string $action + */ + public function setAction($action) + { + if ($this->content instanceof FormInterface) + { + $this->content->setAction($action); + } + } + + /** + * @param int $id + */ + public function setId($id) + { + if ($this->content instanceof FormInterface) + { + $this->content->setId($id); + } + } + + /** + * @param mixed $model + * @return null + */ + public function validate($model) + { + if ($this->content instanceof FormInterface) + { + return $this->content->validate($model); + } + return null; + } + + /** + * @param mixed $model + */ + public function save($model) + { + if ($this->content instanceof FormInterface) + { + $this->content->save($model); + } + } + + /** + * @return View + */ + public function render() + { + $params = [ + 'label' => $this->label(), + 'active' => $this->active(), + 'name' => $this->name(), + ]; + return view(AdminTemplate::view('display.tab'), $params); + } + + /** + * @return string + */ + function __toString() + { + return (string) $this->render(); + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Display/DisplayTabbed.php b/src/SleepingOwl/Admin/Display/DisplayTabbed.php new file mode 100644 index 00000000..8a287886 --- /dev/null +++ b/src/SleepingOwl/Admin/Display/DisplayTabbed.php @@ -0,0 +1,146 @@ +tabs; + } + if (is_callable($tabs)) + { + $tabs = call_user_func($tabs); + } + $this->tabs = $tabs; + return $this; + } + + /** + * @return \Illuminate\View\View + */ + public function render() + { + $params = [ + 'tabs' => $this->tabs(), + ]; + return view(AdminTemplate::view('display.tabbed'), $params); + } + + /** + * @return string + */ + function __toString() + { + return (string)$this->render(); + } + + /** + * @param string $class + */ + public function setClass($class) + { + foreach ($this->tabs as $tab) + { + if ($tab instanceof DisplayInterface) + { + $tab->setClass($class); + } + } + } + + /** + * + */ + public function initialize() + { + foreach ($this->tabs as $tab) + { + if ($tab instanceof DisplayInterface) + { + $tab->initialize(); + } + } + } + + /** + * @param string $action + */ + public function setAction($action) + { + foreach ($this->tabs as $tab) + { + if ($tab instanceof FormInterface) + { + $tab->setAction($action); + } + } + } + + /** + * @param int $id + */ + public function setId($id) + { + foreach ($this->tabs as $tab) + { + if ($tab instanceof FormInterface) + { + $tab->setId($id); + } + } + } + + /** + * @param mixed $model + * @return null + */ + public function validate($model) + { + foreach ($this->tabs as $tab) + { + if ($tab instanceof FormInterface) + { + $result = $tab->validate($model); + if ( ! is_null($result)) + { + return $result; + } + } + } + return null; + } + + /** + * @param mixed $model + */ + public function save($model) + { + foreach ($this->tabs as $tab) + { + if ($tab instanceof FormInterface) + { + $tab->save($model); + } + } + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Display/DisplayTable.php b/src/SleepingOwl/Admin/Display/DisplayTable.php new file mode 100644 index 00000000..847341ae --- /dev/null +++ b/src/SleepingOwl/Admin/Display/DisplayTable.php @@ -0,0 +1,277 @@ +class)) + { + $this->class = $class; + } + } + + public function columns($columns = null) + { + if (is_null($columns)) + { + return $this->columns; + } + $this->columns = $columns; + return $this; + } + + public function allColumns() + { + $columns = $this->columns(); + if ($this->controlActive()) + { + $columns[] = Column::control(); + } + return $columns; + } + + public function with($with = null) + { + if (is_null($with)) + { + return $this->with; + } + if ( ! is_array($with)) + { + $with = func_get_args(); + } + $this->with = $with; + return $this; + } + + public function filters($filters = null) + { + if (is_null($filters)) + { + return $this->filters; + } + $this->filters = $filters; + return $this; + } + + public function apply($apply = null) + { + if (is_null($apply)) + { + return $this->apply; + } + $this->apply = $apply; + return $this; + } + + public function scope($scope = null) + { + if (is_null($scope)) + { + return $this->scopes; + } + $this->scopes[] = func_get_args(); + return $this; + } + + public function title() + { + $titles = array_map(function ($filter) + { + return $filter->title(); + }, $this->activeFilters); + return implode(', ', $titles); + } + + public function initialize() + { + $this->repository = new BaseRepository($this->class); + $this->repository->with($this->with()); + + $this->initializeFilters(); + + foreach ($this->allColumns() as $column) + { + if ($column instanceof ColumnInterface) + { + $column->initialize(); + } + } + } + + protected function initializeAction() + { + $action = Request::get('_action'); + $id = Request::get('_id'); + $ids = Request::get('_ids'); + if ( ! is_null($action) && ( ! is_null($id) || ! is_null($ids))) + { + $columns = array_merge($this->columns(), $this->actions()); + foreach ($columns as $column) + { + if ( ! $column instanceof Column\NamedColumn) continue; + + if ($column->name() == $action) + { + $param = null; + if ( ! is_null($id)) + { + $param = $this->repository->find($id); + } else + { + $ids = explode(',', $ids); + $param = $this->repository->findMany($ids); + } + $column->call($param); + } + } + } + } + + protected function initializeFilters() + { + $this->initializeAction(); + foreach ($this->filters() as $filter) + { + $filter->initialize(); + if ($filter->isActive()) + { + $this->activeFilters[] = $filter; + } + } + } + + protected function modifyQuery($query) + { + foreach ($this->scope() as $scope) + { + if ( ! is_null($scope)) + { + $method = array_shift($scope); + call_user_func_array([ + $query, + $method + ], $scope); + } + } + $apply = $this->apply(); + if ( ! is_null($apply)) + { + call_user_func($apply, $query); + } + foreach ($this->activeFilters as $filter) + { + $filter->apply($query); + } + } + + public function actions($actions = null) + { + if (is_null($actions)) + { + foreach ($this->actions as $action) + { + $action->url($this->model()->displayUrl([ + '_action' => $action->name(), + '_ids' => '', + ])); + } + return $this->actions; + } + $this->actions = $actions; + return $this; + } + + public function controlActive($controlActive = null) + { + if (is_null($controlActive)) + { + return $this->controlActive; + } + $this->controlActive = $controlActive; + return $this; + } + + public function enableControls() + { + $this->controlActive(true); + return $this; + } + + public function disableControls() + { + $this->controlActive(false); + return $this; + } + + public function model() + { + return Admin::model($this->class); + } + + public function parameters($parameters = null) + { + if (is_null($parameters)) + { + return $this->parameters; + } + $this->parameters = $parameters; + return $this; + } + + protected function getParams() + { + return [ + 'title' => $this->title(), + 'columns' => $this->allColumns(), + 'creatable' => ! is_null($this->model()->create()), + 'createUrl' => $this->model()->createUrl($this->parameters() + Request::all()), + 'actions' => $this->actions(), + ]; + } + + public function render() + { + $query = $this->repository->query(); + $this->modifyQuery($query); + $params = $this->getParams(); + $params['collection'] = $query->get(); + return view(AdminTemplate::view('display.' . $this->view), $params)->render(); + } + + function __toString() + { + try + { + return (string)$this->render(); + } catch (\Exception $e) + { + ExceptionHandler::handle($e); + } + } + +} diff --git a/src/SleepingOwl/Admin/Display/DisplayTree.php b/src/SleepingOwl/Admin/Display/DisplayTree.php new file mode 100644 index 00000000..7109c85d --- /dev/null +++ b/src/SleepingOwl/Admin/Display/DisplayTree.php @@ -0,0 +1,162 @@ +class)) + { + $this->class = $class; + } + } + + public function with($with = null) + { + if (is_null($with)) + { + return $this->with; + } + if ( ! is_array($with)) + { + $with = func_get_args(); + } + $this->with = $with; + return $this; + } + + public function initialize() + { + AssetManager::addScript('admin::default/js/jquery.nestable.js'); + AssetManager::addScript('admin::default/js/nestable.js'); + AssetManager::addStyle('admin::default/css/jquery.nestable.css'); + + $this->repository = new TreeRepository($this->class); + $this->repository->with($this->with()); + + Column::treeControl()->initialize(); + } + + public function reorderable($reorderable = null) + { + if (is_null($reorderable)) + { + return $this->reorderable; + } + $this->reorderable = $reorderable; + return $this; + } + + public function repository() + { + $this->repository->parentField($this->parentField()); + $this->repository->orderField($this->orderField()); + $this->repository->rootParentId($this->rootParentId()); + return $this->repository; + } + + public function parameters($parameters = null) + { + if (is_null($parameters)) + { + return $this->parameters; + } + $this->parameters = $parameters; + return $this; + } + + public function model() + { + return Admin::model($this->class); + } + + public function render() + { + $params = [ + 'items' => $this->repository()->tree(), + 'reorderable' => $this->reorderable(), + 'url' => Admin::model($this->class)->displayUrl(), + 'value' => $this->value(), + 'creatable' => ! is_null($this->model()->create()), + 'createUrl' => $this->model()->createUrl($this->parameters() + Request::all()), + 'controls' => [Column::treeControl()], + ]; + return view(AdminTemplate::view('display.tree'), $params); + } + + function __toString() + { + return (string)$this->render(); + } + + public static function registerRoutes() + { + Route::post('{adminModel}/reorder', function ($model) + { + $data = Request::get('data'); + $model->display()->repository()->reorder($data); + }); + } + + public function value($value = null) + { + if (is_null($value)) + { + return $this->value; + } + $this->value = $value; + return $this; + } + + public function parentField($parentField = null) + { + if (is_null($parentField)) + { + return $this->parentField; + } + $this->parentField = $parentField; + return $this; + } + + public function orderField($orderField = null) + { + if (is_null($orderField)) + { + return $this->orderField; + } + $this->orderField = $orderField; + return $this; + } + + public function rootParentId($rootParentId = null) + { + if (func_num_args() == 0) + { + return $this->rootParentId; + } + $this->rootParentId = $rootParentId; + return $this; + } + +} diff --git a/src/SleepingOwl/Admin/Exceptions/MethodNotFoundException.php b/src/SleepingOwl/Admin/Exceptions/MethodNotFoundException.php deleted file mode 100644 index d5b9541b..00000000 --- a/src/SleepingOwl/Admin/Exceptions/MethodNotFoundException.php +++ /dev/null @@ -1,10 +0,0 @@ -errors = $errors; - } - - /** - * @return MessageBag - */ - public function getErrors() - { - return $this->errors; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Exceptions/ValueNotSetException.php b/src/SleepingOwl/Admin/Exceptions/ValueNotSetException.php deleted file mode 100644 index 3e4e3a6b..00000000 --- a/src/SleepingOwl/Admin/Exceptions/ValueNotSetException.php +++ /dev/null @@ -1,10 +0,0 @@ -name($name); + $this->alias($name); + } + + public function name($name = null) + { + if (is_null($name)) + { + return $this->name; + } + $this->name = $name; + return $this; + } + + public function alias($alias = null) + { + if (is_null($alias)) + { + return $this->alias; + } + $this->alias = $alias; + return $this; + } + + public function title($title = null) + { + if (is_null($title)) + { + if (is_callable($this->title)) + { + return call_user_func($this->title, $this->value()); + } + return $this->title; + } + $this->title = $title; + return $this; + } + + public function value($value = null) + { + if (is_null($value)) + { + return $this->value; + } + $this->value = $value; + return $this; + } + + public function initialize() + { + $parameters = Request::all(); + $value = $this->value(); + if (is_null($value)) + { + $value = array_get($parameters, $this->alias()); + } + $this->value($value); + } + + public function isActive() + { + return ! is_null($this->value()); + } + + public function apply($query) + { + $query->where($this->name(), $this->value()); + } + +} diff --git a/src/SleepingOwl/Admin/Filter/FilterCustom.php b/src/SleepingOwl/Admin/Filter/FilterCustom.php new file mode 100644 index 00000000..8b1c8ef6 --- /dev/null +++ b/src/SleepingOwl/Admin/Filter/FilterCustom.php @@ -0,0 +1,23 @@ +callback(), $query, $this->value()); + } + + public function callback($callback = null) + { + if (is_null($callback)) + { + return $this->callback; + } + $this->callback = $callback; + return $this; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Filter/FilterField.php b/src/SleepingOwl/Admin/Filter/FilterField.php new file mode 100644 index 00000000..50cfa47c --- /dev/null +++ b/src/SleepingOwl/Admin/Filter/FilterField.php @@ -0,0 +1,16 @@ +value(); + } + return $parent; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Filter/FilterRelated.php b/src/SleepingOwl/Admin/Filter/FilterRelated.php new file mode 100644 index 00000000..34dde5e1 --- /dev/null +++ b/src/SleepingOwl/Admin/Filter/FilterRelated.php @@ -0,0 +1,58 @@ +display; + } + $this->display = $display; + return $this; + } + + public function model($model = null) + { + if (is_null($model)) + { + return $this->model; + } + $this->model = $model; + return $this; + } + + public function title($title = null) + { + $parent = parent::title($title); + if (is_null($parent)) + { + return $this->getDisplayField(); + } + return $parent; + } + + protected function getDisplayField() + { + $model = $this->model(); + if (is_null($model)) + { + throw new \Exception('Specify model for filter: ' . $this->name()); + } + try + { + $instance = app($model)->findOrFail($this->value()); + return $instance->{$this->display()}; + } catch (ModelNotFoundException $e) + { + } + return null; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Filter/FilterScope.php b/src/SleepingOwl/Admin/Filter/FilterScope.php new file mode 100644 index 00000000..3cab2475 --- /dev/null +++ b/src/SleepingOwl/Admin/Filter/FilterScope.php @@ -0,0 +1,11 @@ +name()], $this->value()); + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Form/AdminForm.php b/src/SleepingOwl/Admin/Form/AdminForm.php new file mode 100644 index 00000000..70f0f0b4 --- /dev/null +++ b/src/SleepingOwl/Admin/Form/AdminForm.php @@ -0,0 +1,18 @@ +initialized) return; + + $this->initialized = true; + $this->repository = new BaseRepository($this->class); + $this->instance(app($this->class)); + $items = $this->items(); + array_walk_recursive($items, function ($item) + { + if ($item instanceof FormItemInterface) + { + $item->initialize(); + } + }); + } + + /** + * Set form action + * @param string $action + */ + public function setAction($action) + { + if (is_null($this->action)) + { + $this->action = $action; + } + } + + /** + * Set form class + * @param string $class + */ + public function setClass($class) + { + if (is_null($this->class)) + { + $this->class = $class; + } + } + + /** + * Get or set form items + * @param FormInterface[]|null $items + * @return $this|FormInterface[] + */ + public function items($items = null) + { + if (is_null($items)) + { + return $this->items; + } + $this->items = $items; + return $this; + } + + /** + * Get or set form related model instance + * @param mixed|null $instance + * @return $this|mixed + */ + public function instance($instance = null) + { + if (is_null($instance)) + { + return $this->instance; + } + $this->instance = $instance; + $items = $this->items(); + array_walk_recursive($items, function ($item) use ($instance) + { + if ($item instanceof FormItemInterface) + { + $item->setInstance($instance); + } + }); + return $this; + } + + /** + * Set currently loaded model id + * @param int $id + */ + public function setId($id) + { + if (is_null($this->id)) + { + $this->id = $id; + $this->instance($this->repository->find($id)); + } + } + + /** + * Get related form model configuration + * @return ModelConfiguration + */ + public function model() + { + return Admin::model($this->class); + } + + /** + * Save instance + * @param $model + */ + public function save($model) + { + if ($this->model() != $model) + { + return null; + } + $items = $this->items(); + array_walk_recursive($items, function ($item) + { + if ($item instanceof FormItemInterface) + { + $item->save(); + } + }); + $this->instance()->save(); + } + + /** + * Validate data, returns null on success + * @param mixed $model + * @return Validator|null + */ + public function validate($model) + { + if ($this->model() != $model) + { + return null; + } + + $rules = []; + $items = $this->items(); + array_walk_recursive($items, function ($item) use (&$rules) + { + if ($item instanceof FormItemInterface) + { + $rules += $item->getValidationRules(); + } + }); + $data = Request::all(); + $verifier = app('validation.presence'); + $verifier->setConnection($this->instance()->getConnectionName()); + $validator = Validator::make($data, $rules); + $validator->setPresenceVerifier($verifier); + if ($validator->fails()) + { + return $validator; + } + return null; + } + + /** + * @return View + */ + public function render() + { + $params = [ + 'items' => $this->items(), + 'instance' => $this->instance(), + 'action' => $this->action, + 'backUrl' => session('_redirectBack', URL::previous()), + ]; + return view(AdminTemplate::view('form.' . $this->view), $params); + } + + /** + * @return string + */ + function __toString() + { + return (string)$this->render(); + } + +} diff --git a/src/SleepingOwl/Admin/Form/FormPanel.php b/src/SleepingOwl/Admin/Form/FormPanel.php new file mode 100644 index 00000000..f974e270 --- /dev/null +++ b/src/SleepingOwl/Admin/Form/FormPanel.php @@ -0,0 +1,8 @@ +format)) + { + $this->format(config('admin.' . $this->defaultConfigFormat)); + } + return $this->format; + } + $this->format = $format; + return $this; + } + + public function seconds($seconds = null) + { + if (is_null($seconds)) + { + return $this->seconds; + } + $this->seconds = $seconds; + return $this; + } + + public function value() + { + $value = parent::value(); + if (empty($value)) + { + $value = null; + } + if ( ! is_null($value)) + { + try + { + $time = Carbon::parse($value); + } catch (\Exception $e) + { + try + { + $time = Carbon::createFromFormat($this->format(), $value); + } catch (\Exception $e) + { + return null; + } + } + $value = $time->format($this->format()); + } + return $value; + } + + public function save() + { + $name = $this->name(); + $value = parent::value(); + if (empty($value)) + { + $value = null; + } + if ( ! is_null($value)) + { + $value = Carbon::createFromFormat($this->format(), $value); + } + $this->instance()->$name = $value; + } + + public function getParams() + { + return parent::getParams() + [ + 'seconds' => $this->seconds(), + 'format' => $this->format(), + 'pickerFormat' => $this->pickerFormat(), + ]; + } + + public function pickerFormat($pickerFormat = null) + { + if (is_null($pickerFormat)) + { + if (is_null($this->pickerFormat)) + { + return $this->generatePickerFormat(); + } + return $this->pickerFormat; + } + $this->pickerFormat = $pickerFormat; + return $this; + } + + protected function generatePickerFormat() + { + $format = $this->format(); + $replacement = [ + 'i' => 'mm', + 's' => 'ss', + 'h' => 'hh', + 'H' => 'HH', + 'g' => 'h', + 'G' => 'H', + 'd' => 'DD', + 'j' => 'D', + 'm' => 'MM', + 'n' => 'M', + 'Y' => 'YYYY', + 'y' => 'YY', + ]; + return strtr($format, $replacement); + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/BaseFormItem.php b/src/SleepingOwl/Admin/FormItems/BaseFormItem.php new file mode 100644 index 00000000..8efdffc6 --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/BaseFormItem.php @@ -0,0 +1,87 @@ +instance($instance); + } + + public function instance($instance = null) + { + if (is_null($instance)) + { + return $this->instance; + } + $this->instance = $instance; + return $this; + } + + public function validationRules($validationRules = null) + { + if (is_null($validationRules)) + { + return $this->validationRules; + } + if (is_string($validationRules)) + { + $validationRules = explode('|', $validationRules); + } + $this->validationRules = $validationRules; + return $this; + } + + public function getValidationRules() + { + return $this->validationRules(); + } + + public function validationRule($rule) + { + $this->validationRules[] = $rule; + return $this; + } + + public function save() + { + } + + public function getParams() + { + return [ + 'instance' => $this->instance(), + ]; + } + + public function render() + { + $params = $this->getParams(); + return view(AdminTemplate::view('formitem.' . $this->view), $params)->render(); + } + + function __toString() + { + try + { + return (string)$this->render(); + } catch (\Exception $e) + { + ExceptionHandler::handle($e); + } + } + +} diff --git a/src/SleepingOwl/Admin/FormItems/CKEditor.php b/src/SleepingOwl/Admin/FormItems/CKEditor.php new file mode 100644 index 00000000..217f03ea --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/CKEditor.php @@ -0,0 +1,147 @@ +files()->in($path); + } + + protected static function createImageObject(SplFileInfo $file) + { + $obj = new StdClass; + $path = $file->getRelativePathname(); + $url = config('admin.imagesUploadDirectory') . '/' . $path; + $url = asset($url); + $obj->url = $url; + $obj->thumbnail = $url; + return $obj; + } + + protected static function postUpload() + { + $path = config('admin.imagesUploadDirectory') . '/'; + $upload_dir = public_path($path); + + $allowedExtensions = [ + 'bmp', + 'gif', + 'jpg', + 'jpeg', + 'png' + ]; + + $maxsize = 2000; + $maxwidth = 9000; + $maxheight = 8000; + $minwidth = 10; + $minheight = 10; + + $file = Request::file('upload'); + $errors = []; + + $extension = null; + $width = 0; + $height = 0; + try + { + if (is_null($file)) + { + $errors[] = trans('admin::lang.ckeditor.upload.error.common'); + throw new Exception; + } + $extension = $file->guessClientExtension(); + if ( ! in_array($extension, $allowedExtensions)) + { + $errors[] = trans('admin::lang.ckeditor.upload.error.wrong_extension', ['file' => $file->getClientOriginalName()]); + throw new Exception; + } + if ($file->getSize() > $maxsize * 1000) + { + $errors[] = trans('admin::lang.ckeditor.upload.error.filesize_limit', ['size' => $maxsize]); + } + list($width, $height) = getimagesize($file); + if ($width > $maxwidth || $height > $maxheight) + { + $errors[] = trans('admin::lang.ckeditor.upload.error.imagesize_max_limit', [ + 'width' => $width, + 'height' => $height, + 'maxwidth' => $maxwidth, + 'maxheight' => $maxheight + ]); + } + if ($width < $minwidth || $height < $minheight) + { + $errors[] = trans('admin::lang.ckeditor.upload.error.imagesize_min_limit', [ + 'width' => $width, + 'height' => $height, + 'minwidth' => $minwidth, + 'minheight' => $minheight + ]); + } + } catch (Exception $e) + { + } + + if ( ! empty($errors)) + { + return ''; + } + + $finalFilename = $file->getClientOriginalName(); + $file = $file->move($upload_dir, $finalFilename); + $CKEditorFuncNum = Request::get('CKEditorFuncNum'); + $url = asset($path . $finalFilename); + $message = trans('admin::lang.ckeditor.upload.success', [ + 'size' => number_format($file->getSize() / 1024, 3, '.', ''), + 'width' => $width, + 'height' => $height + ]); + $result = "window.parent.CKEDITOR.tools.callFunction($CKEditorFuncNum, '$url', '$message')"; + return ''; + } + +} diff --git a/src/SleepingOwl/Admin/FormItems/Checkbox.php b/src/SleepingOwl/Admin/FormItems/Checkbox.php new file mode 100644 index 00000000..ab1f382f --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Checkbox.php @@ -0,0 +1,21 @@ +name(); + if ( ! Request::has($name)) + { + Request::merge([$name => 0]); + } + parent::save(); + } + + +} diff --git a/src/SleepingOwl/Admin/FormItems/Columns.php b/src/SleepingOwl/Admin/FormItems/Columns.php new file mode 100644 index 00000000..812005af --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Columns.php @@ -0,0 +1,86 @@ +columns; + } + $this->columns = $columns; + return $this; + } + + public function getParams() + { + return parent::getParams() + [ + 'columns' => $this->columns(), + ]; + } + + public function getValidationRules() + { + $rules = parent::getValidationRules(); + foreach ($this->columns() as $columnItems) + { + foreach ($columnItems as $item) + { + if ($item instanceof FormItemInterface) + { + $rules += $item->getValidationRules(); + } + } + } + return $rules; + } + + public function save() + { + parent::save(); + $this->all(function ($item) + { + $item->save(); + }); + } + + public function initialize() + { + parent::initialize(); + $this->all(function ($item) + { + $item->initialize(); + }); + } + + public function setInstance($instance) + { + parent::setInstance($instance); + $this->all(function ($item) use ($instance) + { + $item->setInstance($instance); + }); + return $this->instance($instance); + } + + protected function all($callback) + { + foreach ($this->columns() as $columnItems) + { + foreach ($columnItems as $item) + { + if ($item instanceof FormItemInterface) + { + $callback($item); + } + } + } + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/Custom.php b/src/SleepingOwl/Admin/FormItems/Custom.php new file mode 100644 index 00000000..8e9fca1d --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Custom.php @@ -0,0 +1,47 @@ +display)) + { + return call_user_func($this->display, $this->instance()); + } + return $this->display; + } + $this->display = $display; + return $this; + } + + public function callback($callback = null) + { + if (is_null($callback)) + { + return $this->callback; + } + $this->callback = $callback; + return $this; + } + + public function render() + { + return $this->display(); + } + + public function save() + { + $callback = $this->callback(); + if (is_callable($callback)) + { + call_user_func($callback, $this->instance()); + } + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/Date.php b/src/SleepingOwl/Admin/FormItems/Date.php new file mode 100644 index 00000000..c100d04c --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Date.php @@ -0,0 +1,9 @@ + 'required', + ]; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/FormItem.php b/src/SleepingOwl/Admin/FormItems/FormItem.php new file mode 100644 index 00000000..8f8bf59e --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/FormItem.php @@ -0,0 +1,31 @@ + 'admin.formitems.image.' . static::$route, + function () + { + $validator = Validator::make(Request::all(), static::uploadValidationRules()); + if ($validator->fails()) + { + return Response::make($validator->errors()->get('file'), 400); + } + $file = Request::file('file'); + $filename = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension(); + $path = config('admin.imagesUploadDirectory'); + $fullpath = public_path($path); + $file->move($fullpath, $filename); + $value = $path . '/' . $filename; + return [ + 'url' => asset($value), + 'value' => $value, + ]; + } + ]); + } + + protected static function uploadValidationRules() + { + return [ + 'file' => 'image', + ]; + } + +} diff --git a/src/SleepingOwl/Admin/FormItems/Images.php b/src/SleepingOwl/Admin/FormItems/Images.php new file mode 100644 index 00000000..ef663862 --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Images.php @@ -0,0 +1,49 @@ +name(); + $value = Request::get($name, ''); + if ( ! empty($value)) + { + $value = explode(',', $value); + } else + { + $value = []; + } + Request::merge([$name => $value]); + parent::save(); + } + + public function value() + { + $value = parent::value(); + if (is_null($value)) + { + $value = []; + } + if (is_string($value)) + { + $value = preg_split('/,/', $value, -1, PREG_SPLIT_NO_EMPTY); + } + return $value; + } + +} diff --git a/src/SleepingOwl/Admin/FormItems/MultiSelect.php b/src/SleepingOwl/Admin/FormItems/MultiSelect.php new file mode 100644 index 00000000..1a6e5030 --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/MultiSelect.php @@ -0,0 +1,24 @@ +count() > 0) + { + $value = $value->lists($value->first()->getKeyName()); + } + if ($value instanceof Collection) + { + $value = $value->toArray(); + } + return $value; + } + +} diff --git a/src/SleepingOwl/Admin/FormItems/NamedFormItem.php b/src/SleepingOwl/Admin/FormItems/NamedFormItem.php new file mode 100644 index 00000000..6cf16b32 --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/NamedFormItem.php @@ -0,0 +1,162 @@ +label = $label; + $parts = explode(".", $path); + if (count($parts) > 1) { + $this->path = $path; + $this->name = $parts[0] . "[" . implode("][", array_slice($parts, 1)) . "]"; + $this->attribute = implode(".", array_slice(explode(".", $path), -1, 1)); + } else { + $this->path = $path; + $this->name = $path; + $this->attribute = $path; + } + } + + public function path($path = null) + { + if (is_null($path)) + { + return $this->path; + } + $this->path = $path; + return $path; + } + + public function attribute($attribute = null) + { + if (is_null($attribute)) + { + return $this->attribute; + } + $this->attribute = $attribute; + return $attribute; + } + + public function name($name = null) + { + if (is_null($name)) + { + return $this->name; + } + $this->name = $name; + return $this; + } + + public function label($label = null) + { + if (is_null($label)) + { + return $this->label; + } + $this->label = $label; + return $this; + } + + public function getParams() + { + return parent::getParams() + [ + 'name' => $this->name(), + 'label' => $this->label(), + 'readonly' => $this->readonly(), + 'value' => $this->value() + ]; + } + + public function defaultValue($defaultValue = null) + { + if (is_null($defaultValue)) + { + return $this->defaultValue; + } + $this->defaultValue = $defaultValue; + return $this; + } + + public function readonly($readonly = null) + { + if (is_null($readonly)) + { + return $this->readonly; + } + + $this->readonly = $readonly; + + return $this; + } + + public function value() + { + $instance = $this->instance(); + if ( ! is_null($value = old($this->path()))) + { + return $value; + } + $input = Request::all(); + if (($value = array_get($input, $this->path())) !== null) + { + return $value; + } + if ( ! is_null($instance) && ! is_null($value = $instance->getAttribute($this->attribute()))) + { + return $value; + } + return $this->defaultValue(); + } + + public function save() + { + $attribute = $this->attribute(); + if (Request::get($this->path()) === null) { + $value = null; + } else { + $value = $this->value(); + } + $this->instance()->$attribute = $value; + } + + public function required() + { + return $this->validationRule('required'); + } + + public function unique() + { + return $this->validationRule('_unique'); + } + + public function getValidationRules() + { + $rules = parent::getValidationRules(); + array_walk($rules, function (&$item) + { + if ($item == '_unique') + { + $table = $this->instance()->getTable(); + $item = 'unique:' . $table . ',' . $this->attribute(); + if ($this->instance()->exists()) + { + $item .= ',' . $this->instance()->getKey(); + } + } + }); + return [ + $this->name() => $rules + ]; + } + +} diff --git a/src/SleepingOwl/Admin/FormItems/Password.php b/src/SleepingOwl/Admin/FormItems/Password.php new file mode 100644 index 00000000..f1179e0e --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Password.php @@ -0,0 +1,8 @@ +model; + } + $this->model = $model; + return $this; + } + + public function display($display = null) + { + if (is_null($display)) + { + return $this->display; + } + $this->display = $display; + return $this; + } + + public function options($options = null) + { + if (is_null($options)) + { + if ( ! is_null($this->model()) && ! is_null($this->display())) + { + $this->loadOptions(); + } + $options = $this->options; + asort($options); + return $options; + } + $this->options = $options; + return $this; + } + + protected function loadOptions() + { + $repository = new BaseRepository($this->model()); + $key = $repository->model()->getKeyName(); + $options = $repository->query()->get()->lists($this->display(), $key); + if ($options instanceof Collection) + { + $options = $options->all(); + } + $this->options($options); + } + + public function getParams() + { + return parent::getParams() + [ + 'options' => $this->options(), + 'nullable' => $this->isNullable(), + ]; + } + + public function enum($values) + { + return $this->options(array_combine($values, $values)); + } + + public function nullable($nullable = true) + { + $this->nullable = $nullable; + return $this; + } + + public function isNullable() + { + return $this->nullable; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/Text.php b/src/SleepingOwl/Admin/FormItems/Text.php new file mode 100644 index 00000000..5e53202c --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Text.php @@ -0,0 +1,8 @@ +placement; + } + $this->placement = $placement; + return $this; + } + + public function addon($addon = null) + { + if (is_null($addon)) + { + return $this->addon; + } + $this->addon = $addon; + return $this; + } + + public function getParams() + { + return parent::getParams() + [ + 'placement' => $this->placement(), + 'addon' => $this->addon(), + ]; + } + + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/Textarea.php b/src/SleepingOwl/Admin/FormItems/Textarea.php new file mode 100644 index 00000000..9b6f98ec --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Textarea.php @@ -0,0 +1,30 @@ + $this->name(), + 'label' => $this->label(), + 'readonly' => $this->readonly(), + 'value' => $this->value(), + 'rows' => $this->rows() + ]; + } + + public function rows($rows = null) + { + if (is_null($rows)) + { + return $this->rows; + } + $this->rows = $rows; + return $this; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/FormItems/Time.php b/src/SleepingOwl/Admin/FormItems/Time.php new file mode 100644 index 00000000..362dddb4 --- /dev/null +++ b/src/SleepingOwl/Admin/FormItems/Time.php @@ -0,0 +1,9 @@ +view($view); + } + + public function save() + { + $callback = $this->callback(); + if (is_callable($callback)) + { + call_user_func($callback, $this->instance()); + } + } + + public function view($view = null) + { + if (is_null($view)) + { + return $this->view; + } + $this->view = $view; + $this->display(function ($instance) + { + return view($this->view(), ['instance' => $instance]); + }); + return $this; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Helpers/ExceptionHandler.php b/src/SleepingOwl/Admin/Helpers/ExceptionHandler.php new file mode 100644 index 00000000..df8563b5 --- /dev/null +++ b/src/SleepingOwl/Admin/Helpers/ExceptionHandler.php @@ -0,0 +1,16 @@ +encrypter = $encrypter; + $this->request = $request; + $this->manager = $manager; + } + + public function run() + { + $session = $this->startSession($this->request); + $this->request->setSession($session); + } + + protected function startSession(Request $request) + { + with($session = $this->getSession($request))->setRequestOnHandler($request); + + $session->start(); + + return $session; + } + + public function getSession(Request $request) + { + $session = $this->manager->driver(); + + $cookie = $request->cookies->get($session->getName()); + if ( ! is_null($cookie)) + { + $session->setId($this->encrypter->decrypt($cookie)); + } + + return $session; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Http/Controllers/AdminController.php b/src/SleepingOwl/Admin/Http/Controllers/AdminController.php new file mode 100644 index 00000000..ff5c8206 --- /dev/null +++ b/src/SleepingOwl/Admin/Http/Controllers/AdminController.php @@ -0,0 +1,154 @@ +render($model->title(), $model->display()); + } + + public function getCreate($model) + { + $create = $model->create(); + if (is_null($create)) + { + abort(404); + } + return $this->render($model->title(), $create); + } + + public function postStore($model) + { + $create = $model->create(); + if (is_null($create)) + { + abort(404); + } + if ($create instanceof FormInterface) + { + if ($validator = $create->validate($model)) + { + return Redirect::back()->withErrors($validator)->withInput()->with([ + '_redirectBack' => Request::get('_redirectBack'), + ]); + } + $create->save($model); + } + return Redirect::to(Request::get('_redirectBack', $model->displayUrl())); + } + + public function getEdit($model, $id) + { + $edit = $model->fullEdit($id); + if (is_null($edit)) + { + abort(404); + } + return $this->render($model->title(), $edit); + } + + public function postUpdate($model, $id) + { + $edit = $model->fullEdit($id); + if (is_null($edit)) + { + abort(404); + } + if ($edit instanceof FormInterface) + { + if ($validator = $edit->validate($model)) + { + return Redirect::back()->withErrors($validator)->withInput()->with([ + '_redirectBack' => Request::get('_redirectBack'), + ]); + } + $edit->save($model); + } + return Redirect::to(Request::get('_redirectBack', $model->displayUrl())); + } + + public function postDestroy($model, $id) + { + $delete = $model->delete($id); + if (is_null($delete)) + { + abort(404); + } + $model->repository()->delete($id); + return Redirect::back(); + } + + public function postRestore($model, $id) + { + $restore = $model->restore($id); + if (is_null($restore)) + { + abort(404); + } + $model->repository()->restore($id); + return Redirect::back(); + } + + public function render($title, $content) + { + if ($content instanceof Renderable) + { + $content = $content->render(); + } + return view(AdminTemplate::view('_layout.inner'), [ + 'title' => $title, + 'content' => $content, + ]); + } + + public function getLang() + { + $lang = trans('admin::lang'); + if ($lang == 'admin::lang') + { + $lang = trans('admin::lang', [], 'messages', 'en'); + } + + $data = array( + 'locale' => App::getLocale(), + 'token' => csrf_token(), + 'prefix' => config('admin.prefix'), + 'lang' => $lang, + 'ckeditor_cfg' => config('admin.ckeditor') + ); + + $content = 'window.admin = '.json_encode($data) . ';'; + + $response = new Response($content, 200, [ + 'Content-Type' => 'text/javascript', + ]); + + return $this->cacheResponse($response); + } + + protected function cacheResponse(Response $response) + { + $response->setSharedMaxAge(31536000); + $response->setMaxAge(31536000); + $response->setExpires(new \DateTime('+1 year')); + + return $response; + } + + public function getWildcard() + { + abort(404); + } + +} diff --git a/src/SleepingOwl/Admin/Http/Controllers/AuthController.php b/src/SleepingOwl/Admin/Http/Controllers/AuthController.php new file mode 100644 index 00000000..6089cc6c --- /dev/null +++ b/src/SleepingOwl/Admin/Http/Controllers/AuthController.php @@ -0,0 +1,66 @@ +redirect(); + } + $loginPostUrl = route('admin.login.post'); + return view(AdminTemplate::view('pages.login'), [ + 'title' => config('admin.title'), + 'loginPostUrl' => $loginPostUrl, + ]); + } + + public function postLogin() + { + $rules = config('admin.auth.rules'); + $data = Request::only(array_keys($rules)); + $lang = trans('admin::validation'); + if ($lang == 'admin::validation') + { + $lang = []; + } + $validator = Validator::make($data, $rules, $lang); + if ($validator->fails()) + { + return Redirect::back()->withInput()->withErrors($validator); + } + + if (AdminAuth::attempt($data)) + { + return Redirect::intended(route('admin.wildcard', '/')); + } + + $message = new MessageBag([ + 'username' => trans('admin::lang.auth.wrong-username'), + 'password' => trans('admin::lang.auth.wrong-password') + ]); + return Redirect::back()->withInput()->withErrors($message); + } + + public function getLogout() + { + AdminAuth::logout(); + return $this->redirect(); + } + +} diff --git a/src/SleepingOwl/Admin/Http/Middleware/Authenticate.php b/src/SleepingOwl/Admin/Http/Middleware/Authenticate.php new file mode 100644 index 00000000..1fe46471 --- /dev/null +++ b/src/SleepingOwl/Admin/Http/Middleware/Authenticate.php @@ -0,0 +1,32 @@ +ajax()) + { + return response('Unauthorized.', 401); + } else + { + return redirect()->guest(route('admin.login')); + } + } + + return $next($request); + } + +} diff --git a/src/SleepingOwl/Admin/Http/routes.php b/src/SleepingOwl/Admin/Http/routes.php new file mode 100644 index 00000000..9abca552 --- /dev/null +++ b/src/SleepingOwl/Admin/Http/routes.php @@ -0,0 +1,67 @@ +'web'], function() { + Route::get('login', [ + 'as' => 'admin.login', + 'uses' => 'AuthController@getLogin', + ]); + + Route::post('login', [ + 'as' => 'admin.login.post', + 'uses' => 'AuthController@postLogin', + ]); + + Route::get('assets/lang', [ + 'as' => 'admin.lang', + 'uses' => 'AdminController@getLang', + ]); + + Route::group([ + 'middleware' => config('admin.middleware'), + ], function () + { + Route::get('logout', [ + 'as' => 'admin.logout', + 'uses' => 'AuthController@getLogout', + ]); + + Route::get('{adminModel}', [ + 'as' => 'admin.model', + 'uses' => 'AdminController@getDisplay' + ]); + + Route::get('{adminModel}/create', [ + 'as' => 'admin.model.create', + 'uses' => 'AdminController@getCreate', + ]); + + Route::post('{adminModel}', [ + 'as' => 'admin.model.store', + 'uses' => 'AdminController@postStore', + ]); + + Route::get('{adminModel}/{adminModelId}/edit', [ + 'as' => 'admin.model.edit', + 'uses' => 'AdminController@getEdit', + ]); + + Route::post('{adminModel}/{adminModelId}', [ + 'as' => 'admin.model.update', + 'uses' => 'AdminController@postUpdate', + ]); + + Route::delete('{adminModel}/{adminModelId}', [ + 'as' => 'admin.model.destroy', + 'uses' => 'AdminController@postDestroy', + ]); + + Route::post('{adminModel}/{adminModelId}/restore', [ + 'as' => 'admin.model.restore', + 'uses' => 'AdminController@postRestore', + ]); + + Route::get('{adminWildcard}', [ + 'as' => 'admin.wildcard', + 'uses' => 'AdminController@getWildcard' + ]); + }); +}); diff --git a/src/SleepingOwl/Admin/Interfaces/ColumnFilterInterface.php b/src/SleepingOwl/Admin/Interfaces/ColumnFilterInterface.php new file mode 100644 index 00000000..ce142fe4 --- /dev/null +++ b/src/SleepingOwl/Admin/Interfaces/ColumnFilterInterface.php @@ -0,0 +1,13 @@ +router = $admin->router; - $this->htmlBuilder = $admin->htmlBuilder; $this->modelClass = $modelClass; - $this->subItems = []; if (is_null(static::$current)) { static::$current = $this; + $this->level(0); } else { static::$current->addItem($this); + $this->level(static::$current->level() + 1); } } /** - * @param string $label - * @return $this - */ - public function label($label) - { - $this->label = $label; - return $this; - } - - /** - * @return string - */ - public function getLabel() - { - if ( ! is_null($this->label)) return $this->label; - - return $this->getModelItem()->getTitle(); - } - - /** - * @param string $icon - * @return $this - */ - public function icon($icon) - { - $this->icon = $icon; - return $this; - } - - /** - * @return string - */ - public function getIcon() - { - return $this->icon; - } - - /** - * @return string + * Get related model configuration + * @return ModelConfiguration */ - public function getUses() + protected function getModelItem() { - return $this->uses; + return Admin::model($this->modelClass); } /** - * @param string $uses - * @return $this + * Get or set menu item label + * @param string|null $label + * @return $this|string */ - public function uses($uses) + public function label($label = null) { - $this->uses = $uses; + if (is_null($label)) + { + return is_null($this->label) ? $this->getModelItem()->title() : $this->label; + } + $this->label = $label; return $this; } /** - * @param string $url - * @return $this + * Get or set menu item icon + * @param string|null $icon + * @return $this|string */ - public function url($url) + public function icon($icon = null) { - $this->url = $url; + if (is_null($icon)) + { + return $this->icon; + } + $this->icon = $icon; return $this; } /** - * @return string + * Get or set menu item subitems + * @param Closure|null $callback + * @return $this|MenuItem[] */ - public function getUrl() + public function items($callback = null) { - if ( ! is_null($this->url)) + if (is_null($callback)) { - if (strpos($this->url, '://') !== false) - { - return $this->url; - } - return $this->router->routeToWildcard($this->url); - } - if ( ! is_null($this->modelClass)) - { - return $this->router->routeToModel($this->getModelItem()->getAlias()); + return $this->subItems; } - return '#'; - } - - /** - * @param \Closure $callback - * @return $this - */ - public function items($callback) - { $old = static::$current; static::$current = $this; call_user_func($callback); @@ -170,39 +122,7 @@ public function items($callback) } /** - * @return bool - */ - public function hasSubItems() - { - return count($this->subItems) != 0; - } - - /** - * @param $url - * @return $this - */ - public function itemWithUrl($url) - { - if ($this->url === $url) return $this; - foreach ($this->subItems as $item) - { - if ($result = $item->itemWithUrl($url)) - { - return $result; - } - } - return null; - } - - /** - * @return MenuItem[] - */ - public function getItems() - { - return $this->subItems; - } - - /** + * Add subitem * @param MenuItem $item * @return $this */ @@ -213,89 +133,68 @@ public function addItem($item) } /** - * @return \SleepingOwl\Admin\Models\ModelItem - * @throws \SleepingOwl\Admin\Exceptions\ModelNotFoundException + * Get or set menu item depth level + * @param int|null $level + * @return $this|int */ - protected function getModelItem() + public function level($level = null) { - return Admin::instance()->models->modelWithClassname($this->modelClass); + if (is_null($level)) + { + return $this->level; + } + $this->level = $level; + return $this; } /** - * @param int $level - * @return string + * Get or set menu item url + * @param string|null $url + * @return $this|string */ - public function render($level = 1) + public function url($url = null) { - if ($this->isHidden()) return; - if ($this->hasSubItems()) + if (is_null($url)) { - $level++; - $content = $this->htmlBuilder->tag('i', [ - 'class' => [ - 'fa', - 'fa-fw', - $this->getIcon() - ] - ]); - $content .= ' ' . $this->getLabel() . $this->htmlBuilder->tag('span', ['class' => 'fa arrow']); - $content = $this->htmlBuilder->tag('a', ['href' => $this->getUrl()], $content); - - $subitemsContent = ''; - foreach ($this->subItems as $item) + if ( ! is_null($this->url)) { - $subitemsContent .= $item->render($level); + if (strpos($this->url, '://') !== false) + { + return $this->url; + } + return route('admin.wildcard', $this->url); } - - $classByLevel = [ - 2 => 'nav-second-level', - 3 => 'nav-third-level' - ]; - $content .= $this->htmlBuilder->tag('ul', [ - 'class' => [ - 'nav', - Arr::get($classByLevel, $level, null) - ] - ], $subitemsContent); - } else - { - $content = $this->renderSingleItem(); + if ( ! is_null($this->modelClass)) + { + return $this->getModelItem()->displayUrl(); + } + return '#'; } - return $this->htmlBuilder->tag('li', [], $content); - } - - /** - * @return string - */ - protected function renderSingleItem() - { - $content = $this->htmlBuilder->tag('i', [ - 'class' => [ - 'fa', - 'fa-fw', - $this->getIcon() - ] - ]); - $content .= ' ' . $this->getLabel(); - return $this->htmlBuilder->tag('a', ['href' => $this->getUrl()], $content); + $this->url = $url; + return $this; } /** - * @param bool $hidden - * @return $this + * @return View */ - public function hidden($hidden = true) + public function render() { - $this->hidden = $hidden; - return $this; + $params = [ + 'icon' => $this->icon(), + 'label' => $this->label(), + 'url' => $this->url(), + 'level' => $this->level(), + 'items' => $this->items(), + ]; + return view(AdminTemplate::view('_partials.menu_item'), $params); } /** - * @return bool + * @return string */ - public function isHidden() + function __toString() { - return $this->hidden; + return (string)$this->render(); } } \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Model/ModelConfiguration.php b/src/SleepingOwl/Admin/Model/ModelConfiguration.php new file mode 100644 index 00000000..9359cdce --- /dev/null +++ b/src/SleepingOwl/Admin/Model/ModelConfiguration.php @@ -0,0 +1,225 @@ +class = $class; + $this->setDefaultAlias(); + } + + public function repository() + { + return new BaseRepository($this->class); + } + + protected function setDefaultAlias() + { + $alias = Str::snake(Str::plural(class_basename($this->class))); + $this->alias($alias); + } + + public function alias($alias = null) + { + if (func_num_args() == 0) + { + return $this->alias; + } + $this->alias = $alias; + return $this; + } + + public function title($title = null) + { + if (func_num_args() == 0) + { + return $this->title; + } + $this->title = $title; + return $this; + } + + public function create($create = null) + { + if (func_num_args() == 0) + { + return $this->getCreate(); + } + $this->create = $create; + return $this; + } + + public function edit($edit = null) + { + if ((func_num_args() == 0) || is_numeric($edit)) + { + return $this->getEdit($edit); + } + $this->edit = $edit; + return $this; + } + + public function createAndEdit($callback) + { + $this->create($callback); + $this->edit($callback); + return $this; + } + + public function delete($delete = null) + { + if ((func_num_args() == 0) || is_numeric($delete)) + { + return $this->getDelete($delete); + } + $this->delete = $delete; + return $this; + } + + public function restore($restore = null) + { + if ((func_num_args() == 0) || is_numeric($restore)) + { + return $this->getRestore($restore); + } + $this->restore = $restore; + return $this; + } + + public function display($display = null) + { + if (func_num_args() == 0) + { + return $this->getDisplay(); + } + $this->display = $display; + return $this; + } + + protected function getDisplay() + { + $display = call_user_func($this->display); + if ($display instanceof DisplayInterface) + { + $display->setClass($this->class); + $display->initialize(); + } + return $display; + } + + protected function getCreate() + { + if (is_null($this->create)) + { + return null; + } + $create = call_user_func($this->create, null); + if ($create instanceof DisplayInterface) + { + $create->setClass($this->class); + $create->initialize(); + } + if ($create instanceof FormInterface) + { + $create->setAction($this->storeUrl()); + } + return $create; + } + + protected function getEdit($id) + { + if (is_null($this->edit)) + { + return null; + } + $edit = call_user_func($this->edit, $id); + if ($edit instanceof DisplayInterface) + { + $edit->setClass($this->class); + $edit->initialize(); + } + return $edit; + } + + public function fullEdit($id) + { + $edit = $this->edit($id); + if ($edit instanceof FormInterface) + { + $edit->setAction($this->updateUrl($id)); + $edit->setId($id); + } + return $edit; + } + + protected function getDelete($id) + { + if (is_callable($this->delete)) + { + return call_user_func($this->delete, $id); + } + return $this->delete; + } + + protected function getRestore($id) + { + if (is_callable($this->restore)) + { + return call_user_func($this->restore, $id); + } + return $this->restore; + } + + public function displayUrl($parameters = []) + { + array_unshift($parameters, $this->alias()); + return route('admin.model', $parameters); + } + + public function createUrl($parameters = []) + { + array_unshift($parameters, $this->alias()); + return route('admin.model.create', $parameters); + } + + public function storeUrl() + { + return route('admin.model.store', $this->alias()); + } + + public function editUrl($id) + { + return route('admin.model.edit', [$this->alias(), $id]); + } + + public function updateUrl($id) + { + return route('admin.model.update', [$this->alias(), $id]); + } + + public function deleteUrl($id) + { + return route('admin.model.destroy', [$this->alias(), $id]); + } + + public function restoreUrl($id) + { + return route('admin.model.restore', [$this->alias(), $id]); + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Filters/Filter.php b/src/SleepingOwl/Admin/Models/Filters/Filter.php deleted file mode 100644 index 6c68254e..00000000 --- a/src/SleepingOwl/Admin/Models/Filters/Filter.php +++ /dev/null @@ -1,164 +0,0 @@ -name = $name; - $this->alias = $name; - $this->title = new Title; - if ($modelItem = ModelItem::$current) - { - $modelItem->addFilter($this); - } - } - - /** - * Set static title and/or get title object - * @param null $title - * @return Title - */ - public function title($title = null) - { - return $this->title->title($title); - } - - /** - * Set filter scope - * @param string $scope - * @return $this - */ - public function scope($scope) - { - $this->scope = $scope; - return $this; - } - - /** - * Run filter - * @param Builder $query - * @param array $parameters - * @return string - */ - public function filter(Builder $query, $parameters) - { - $parameter = $this->getParameter($parameters); - if (is_null($parameter)) return null; - - if ( ! $this->applyScope($query, $parameter) && $this->name) - { - $query->where($this->name, '=', $parameter); - } - return $this->title->get($parameter); - } - - /** - * Set static value for filter - * @param $value - * @return $this - */ - public function value($value) - { - $this->value = $value; - return $this; - } - - /** - * @return string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * @param string $alias - */ - public function setAlias($alias) - { - $this->alias = $alias; - } - - /** - * @param $name - * @param $arguments - * @throws MethodNotFoundException - */ - function __call($name, $arguments) - { - if ($name == 'as') - { - $this->setAlias(Arr::get($arguments, 0, null)); - return $this; - } - throw new MethodNotFoundException(get_class($this), $name); - } - - /** - * Apply scope to $query - * @param Builder $query - * @param $parameter - * @return bool - */ - protected function applyScope(Builder $query, $parameter) - { - if ($this->scope) - { - $query->{$this->scope}($parameter); - return true; - } - return false; - } - - /** - * @param $parameters - * @return mixed - */ - protected function getParameter($parameters) - { - if (($parameter = Arr::get($parameters, $this->alias, null)) && ($this->value !== null)) - { - $parameter = $this->value; - } - return $parameter; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Filters/Title.php b/src/SleepingOwl/Admin/Models/Filters/Title.php deleted file mode 100644 index 035d9e8e..00000000 --- a/src/SleepingOwl/Admin/Models/Filters/Title.php +++ /dev/null @@ -1,101 +0,0 @@ -staticTitle = $title; - return $this; - } - - /** - * Set model classname and/or attribute to load title from - * - * @param string $modelClass - * @param string|null $field - * @return $this - */ - public function from($modelClass, $field = null) - { - $this->from = $modelClass; - $this->field = $field ?: static::DEFAULT_FIELD; - return $this; - } - - /** - * Get title as string - * - * @param string $parameter - * @throws ModelAttributeNotFoundException - * @throws TitleNotFormattedException - * @throws ModelNotFoundException - * @return string - */ - public function get($parameter) - { - if ( ! is_null($this->staticTitle)) return $this->staticTitle; - if (is_null($this->from)) - { - throw new TitleNotFormattedException; - } - $from = $this->from; - $property = $this->field; - $model = new $this->from; - $model = $this->getInstance($parameter, $model); - if (isset($model->$property)) - { - return $model->$property; - } - throw new ModelAttributeNotFoundException($from, $property); - } - - /** - * Get instance by id - * - * @param string $id - * @param Model $model - * @throws ModelNotFoundException - * @return Model|null - */ - protected function getInstance($id, $model) - { - return $model->findOrFail($id); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/Form.php b/src/SleepingOwl/Admin/Models/Form/Form.php deleted file mode 100644 index 9178da4b..00000000 --- a/src/SleepingOwl/Admin/Models/Form/Form.php +++ /dev/null @@ -1,186 +0,0 @@ -formBuilder = Admin::instance()->formBuilder; - $this->items = []; - } - - /** - * @return mixed - */ - public function getInstance() - { - return $this->instance; - } - - /** - * @param mixed $instance - */ - public function setInstance($instance) - { - $this->instance = $instance; - $this->setDefaults(); - } - - /** - * Set default values for instance - */ - public function setDefaults() - { - foreach ($this->items as $item) - { - $name = $item->getName(); - if ( ! is_null($name) && ! isset($this->instance->$name)) - { - $this->instance->$name = $item->getDefault(); - } - } - } - - /** - * @param mixed $method - */ - public function setMethod($method) - { - $this->method = $method; - } - - /** - * @param mixed $saveUrl - */ - public function setSaveUrl($saveUrl) - { - $this->saveUrl = $saveUrl; - } - - /** - * @param mixed $errors - */ - public function setErrors($errors) - { - if (is_null($errors)) - { - $errors = new ViewErrorBag; - } - $this->errors = $errors; - } - - /** - * @param mixed $backUrl - */ - public function setBackUrl($backUrl) - { - $this->backUrl = $backUrl; - } - - /** - * @return string - */ - public function render() - { - $content = []; - $content[] = $this->formBuilder->model($this->instance, [ - 'method' => $this->method, - 'url' => $this->saveUrl, - 'errors' => $this->errors - ]); - foreach ($this->items as $item) - { - $content[] = $item->render(); - } - $content[] = $this->formBuilder->submitGroup($this->backUrl); - $content[] = $this->formBuilder->close(); - - return implode('', $content); - } - - /** - * @return string - */ - public function __toString() - { - return $this->render(); - } - - /** - * @param $values - */ - public function setValues($values) - { - $this->values = $values; - } - - public function getValueForName($name) - { - return Arr::get($this->values, $name, null); - } - - public function addItem($item) - { - $this->items[] = $item; - } - - public function getValidationRules() - { - $rules = []; - foreach ($this->items as $item) - { - $rules[$item->getName()] = $item->getValidationRules(); - } - return $rules; - } - - public function updateRequestData(&$data) - { - foreach ($this->items as $item) - { - $item->updateRequestData($data); - } - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem.php b/src/SleepingOwl/Admin/Models/Form/FormItem.php deleted file mode 100644 index 74f55128..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem.php +++ /dev/null @@ -1,94 +0,0 @@ -getForm()->addItem($formItem); - return $formItem; - } - - /** - * @param $name - * @param Closure|string $handler - */ - public static function register($name, $handler) - { - static::$handlers[$name] = $handler; - } - - /** - * @param $method - * @return Closure|string|null - */ - protected static function getHandler($method) - { - return Arr::get(static::$handlers, $method, null); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/BaseFormItem.php b/src/SleepingOwl/Admin/Models/Form/FormItem/BaseFormItem.php deleted file mode 100644 index 8af06c96..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/BaseFormItem.php +++ /dev/null @@ -1,152 +0,0 @@ -formBuilder = Admin::instance()->formBuilder; - $this->label = $label; - $this->name = $name; - if ($modelItem = ModelItem::$current) - { - $this->form = $modelItem->getForm(); - } - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @return mixed - */ - protected function getValueFromForm() - { - return $this->form->getValueForName($this->name); - } - - public function required($onlyOnCreate = false) - { - if ($onlyOnCreate) - { - $this->validationRule('required_only_on_create'); - } else - { - $this->validationRule('required'); - } - return $this; - } - - public function unique() - { - $table = ModelItem::$current->getModelTable(); - return $this->validationRule('unique:' . $table . ',' . $this->name); - } - - public function validationRule($rule) - { - $rules = explode('|', $rule); - foreach ($rules as $rule) - { - $this->validation[] = $rule; - } - return $this; - } - - public function getValidationRules() - { - return $this->validation; - } - - public function attributes($attributes) - { - $this->attributes = $attributes; - } - - function __call($name, $arguments) - { - if ($name == 'default') - { - return call_user_func_array([$this, 'setDefault'], $arguments); - } - throw new MethodNotFoundException(get_class($this), $name); - } - - /** - * @param mixed $default - * @return $this - */ - public function setDefault($default) - { - $this->default = $default; - return $this; - } - - /** - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * @param array $data - */ - public function updateRequestData(&$data) - { - - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/BaseTime.php b/src/SleepingOwl/Admin/Models/Form/FormItem/BaseTime.php deleted file mode 100644 index 274caddf..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/BaseTime.php +++ /dev/null @@ -1,36 +0,0 @@ - &$value) - { - if ( ! is_string($value)) continue; - if ((strpos($value, 'AM') !== false) || (strpos($value, 'PM') !== false)) - { - try - { - $time = new Carbon($value); - $value = $time->format('Y-m-d H:i:s'); - } catch (\Exception $e) - { - } - } - } - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Checkbox.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Checkbox.php deleted file mode 100644 index 3e5a60bf..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Checkbox.php +++ /dev/null @@ -1,9 +0,0 @@ -formBuilder->checkboxGroup($this->name, $this->label, $this->getValueFromForm(), $this->attributes); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Ckeditor.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Ckeditor.php deleted file mode 100644 index 4854e7e2..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Ckeditor.php +++ /dev/null @@ -1,18 +0,0 @@ -router->routeToAsset('ckeditor/ckeditor.js')); - if ( ! isset($this->attributes['class'])) - { - $this->attributes['class'] = ''; - } - $this->attributes['class'] .= ' ckeditor'; - return parent::render(); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/ClosureHandler.php b/src/SleepingOwl/Admin/Models/Form/FormItem/ClosureHandler.php deleted file mode 100644 index 7d14a0b8..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/ClosureHandler.php +++ /dev/null @@ -1,26 +0,0 @@ -handler = $handler; - } - - /** - * @return string - */ - public function render() - { - $model = $this->formBuilder->getModel(); - $method = $this->handler; - return $method($model); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Date.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Date.php deleted file mode 100644 index a5956754..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Date.php +++ /dev/null @@ -1,17 +0,0 @@ -attributes['data-date-picktime'] = false; - return $this->formBuilder->datetime($this->name, $this->label, $this->getValueFromForm(), $this->attributes); - } - - public function getValidationRules() - { - $rules = parent::getValidationRules(); - $rules[] = 'date:locale'; - return $rules; - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/File.php b/src/SleepingOwl/Admin/Models/Form/FormItem/File.php deleted file mode 100644 index 70dcac66..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/File.php +++ /dev/null @@ -1,10 +0,0 @@ -formBuilder->fileGroup($this->name, $this->label, $this->form->getInstance(), $this->attributes); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Hidden.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Hidden.php deleted file mode 100644 index b4fc353c..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Hidden.php +++ /dev/null @@ -1,10 +0,0 @@ -formBuilder->hidden($this->name, $this->getValueFromForm(), $this->attributes); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Image.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Image.php deleted file mode 100644 index 7e2050ab..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Image.php +++ /dev/null @@ -1,36 +0,0 @@ -formBuilder->imageGroup($this->name, $this->label, $this->form->getInstance(), $this->attributes); - } - - public function getValidationRules() - { - $rules = parent::getValidationRules(); - $rules[] = 'image'; - return $rules; - } - - /** - * @param array $data - */ - public function updateRequestData(&$data) - { - foreach ($data as $key => &$value) - { - if ( ! is_string($value)) continue; - if (preg_match('/^(?[a-zA-Z0-9]+)ConfirmDelete$/', $key, $matches)) - { - $field = $matches['field']; - if (empty($data[$field])) - { - $data[$field] = ''; - } - } - } - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/MultiSelect.php b/src/SleepingOwl/Admin/Models/Form/FormItem/MultiSelect.php deleted file mode 100644 index 68888293..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/MultiSelect.php +++ /dev/null @@ -1,151 +0,0 @@ -list)) - { - $list = $this->list; - $list = array_combine($list, $list); - } else - { - if ( ! method_exists($this->list, 'getList')) - { - throw new \Exception('You must implement "public static function getList()" in "' . $this->list . '"'); - } - $list = forward_static_call([ - $this->list, - 'getList' - ]); - } - if ( ! isset($this->attributes['class'])) - { - $this->attributes['class'] = ''; - } - $this->attributes['class'] .= ' multiselect'; - $this->attributes['multiple'] = true; - - $content = $this->formBuilder->selectGroup($this->name, $this->label, $list, $this->values(), $this->attributes); - $content .= ''; - return $content; - } - - /** - * @param $value - * @return $this - */ - public function value($value) - { - $this->value = $value; - return $this; - } - - /** - * @param $list - * @return $this - */ - public function setList($list) - { - $this->list = $list; - return $this; - } - - /** - * @param $name - * @param $arguments - * @return \SleepingOwl\Admin\Models\Form\FormItem\MultiSelect|void - * @throws MethodNotFoundException - */ - function __call($name, $arguments) - { - if ($name === 'list') - { - return $this->setList(Arr::get($arguments, 0, null)); - } - return parent::__call($name, $arguments); - } - - /** - * @throws ValueNotSetException - * @return mixed - */ - public function values() - { - $result = $this->form->instance; - if (is_null($this->value)) - { - throw new ValueNotSetException; - } - $parts = explode('.', $this->value); - foreach ($parts as $part) - { - if ($result instanceof Relation) - { - $result = $result->lists($part); - } else - { - $result = $result->$part(); - } - } - if (count($result) == 0 && ! $this->form->instance->exists) - { - return $this->getDefault(); - } - return $result; - } - - /** - * @param array $data - */ - public function updateRequestData(&$data) - { - foreach ($data as $key => &$value) - { - if (is_array($value)) - { - $value = array_filter($value, function ($item) - { - return $item !== '__dummy-multiselect-value'; - }); - } - } - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Password.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Password.php deleted file mode 100644 index 582d568c..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Password.php +++ /dev/null @@ -1,9 +0,0 @@ -formBuilder->passwordGroup($this->name, $this->label, $this->attributes); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Select.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Select.php deleted file mode 100644 index ff479fb1..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Select.php +++ /dev/null @@ -1,101 +0,0 @@ -list)) - { - $list = $this->list; - } else - { - if ( ! method_exists($this->list, 'getList')) - { - throw new \Exception('You must implement "public static function getList()" in "' . $this->list . '"'); - } - $list = forward_static_call([ - $this->list, - 'getList' - ]); - } - if ( ! isset($this->attributes['class'])) - { - $this->attributes['class'] = ''; - } - $this->attributes['class'] .= ' multiselect'; - $this->attributes['size'] = 2; - $this->attributes['data-select-type'] = 'single'; - - if ($this->nullable) - { - $this->attributes['multiple'] = true; - $this->attributes['data-nullable'] = true; - } - - $select = $this->formBuilder->selectGroup($this->name, $this->label, $list, $this->getValueFromForm(), $this->attributes); - - return $select; - } - - /** - * @param array $values - * - * @return $this - */ - public function enum($values) - { - $this->list(array_combine($values, $values)); - - return $this; - } - - function __call($name, $arguments) - { - if ($name === 'list') - { - $this->list = Arr::get($arguments, 0, null); - return $this; - } - return parent::__call($name, $arguments); - } - - /** - * @param bool $nullable - * @return $this - */ - public function nullable($nullable = true) - { - $this->nullable = $nullable; - return $this; - } - - /** - * @param array $data - */ - public function updateRequestData(&$data) - { - if ($this->nullable && ! isset($data[$this->name])) - { - $data[$this->name] = null; - } - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Text.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Text.php deleted file mode 100644 index 1557d835..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Text.php +++ /dev/null @@ -1,9 +0,0 @@ -formBuilder->textGroup($this->name, $this->label, $this->getValueFromForm(), $this->attributes); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/TextAddon.php b/src/SleepingOwl/Admin/Models/Form/FormItem/TextAddon.php deleted file mode 100644 index 2eb35152..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/TextAddon.php +++ /dev/null @@ -1,59 +0,0 @@ -formBuilder->textAddonGroup($this->name, $this->label, $this->getAddon(), $this->placement, $this->getValueFromForm(), $this->attributes, $this->wrapperAttributes); - } - - public function addon($addon) - { - $this->addon = $addon; - return $this; - } - - protected function getAddon() - { - $data = explode(':', $this->addon); - $method = array_shift($data); - if (method_exists($this, $method)) - { - return call_user_func_array([ - $this, - $method - ], $data); - } - return $this->addon; - } - - /** - * @param string $placement - * @return $this - */ - public function placement($placement) - { - $this->placement = $placement; - return $this; - } - - /** - * @param array $wrapperAttributes - * @return $this - */ - public function wrapperAttributes($wrapperAttributes) - { - $this->wrapperAttributes = $wrapperAttributes; - return $this; - } - - protected function route($name, $parameters = []) - { - return route($name, $parameters); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Textarea.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Textarea.php deleted file mode 100644 index c45a93b5..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Textarea.php +++ /dev/null @@ -1,9 +0,0 @@ -formBuilder->textareaGroup($this->name, $this->label, $this->getValueFromForm(), $this->attributes); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Time.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Time.php deleted file mode 100644 index 8dd1bacd..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Time.php +++ /dev/null @@ -1,31 +0,0 @@ -showSeconds = $showSeconds; - return $this; - } - - /** - * @return mixed - */ - public function render() - { - $this->attributes['data-date-pickdate'] = 'false'; - $this->attributes['data-date-useseconds'] = $this->showSeconds; - return $this->formBuilder->datetime($this->name, $this->label, $this->getValueFromForm(), $this->attributes, DateFormatter::NONE, $this->showSeconds ? DateFormatter::MEDIUM : DateFormatter::SHORT); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/Timestamp.php b/src/SleepingOwl/Admin/Models/Form/FormItem/Timestamp.php deleted file mode 100644 index 07a4666f..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/Timestamp.php +++ /dev/null @@ -1,23 +0,0 @@ -attributes['data-date-useseconds'] = $this->showSeconds; - return $this->formBuilder->datetime($this->name, $this->label, $this->getValueFromForm(), $this->attributes, DateFormatter::SHORT, $this->showSeconds ? DateFormatter::MEDIUM : DateFormatter::SHORT); - } - - public function getValidationRules() - { - $rules = parent::getValidationRules(); - $rules[] = 'date:locale'; - return $rules; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/FormItem/View.php b/src/SleepingOwl/Admin/Models/Form/FormItem/View.php deleted file mode 100644 index 1b60caa8..00000000 --- a/src/SleepingOwl/Admin/Models/Form/FormItem/View.php +++ /dev/null @@ -1,24 +0,0 @@ -view = $name; - } - - public function render() - { - if (!IlluminateView::exists($this->view)) - { - throw new \Exception('View [' . $this->view . '] doesnt exist'); - } - return IlluminateView::make($this->view); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Form/Interfaces/FormItemInterface.php b/src/SleepingOwl/Admin/Models/Form/Interfaces/FormItemInterface.php deleted file mode 100644 index 16973de5..00000000 --- a/src/SleepingOwl/Admin/Models/Form/Interfaces/FormItemInterface.php +++ /dev/null @@ -1,31 +0,0 @@ -htmlBuilder = Admin::instance()->htmlBuilder; - $this->modelClass = $modelClass; - $this->alias = $this->getAliasFromClass($modelClass); - $this->columns = []; - $this->filters = []; - $this->form = null; - - Admin::instance()->models->addItem($this); - - $this->form = new Form; - - $this->orderable = true; - if (class_exists($class = $this->getModelClass())) - { - $instance = new $class; - $this->orderable = ! ($instance instanceof ModelWithOrderFieldInterface); - } - } - - /** - * @return string - */ - public function renderTableAttributes() - { - $attributes = []; - if ( ! $this->orderable) - { - $attributes['data-ordering'] = 'false'; - } - if ($this->isAsync()) - { - $url = Admin::instance()->router->routeToTable($this->getAlias(), \Input::all()); - $attributes['data-ajax'] = $url; - } - return $this->htmlBuilder->attributes($attributes); - } - - /** - * @return boolean - */ - public function isOrderable() - { - return $this->orderable; - } - - /** - * @return bool - */ - public function isCreatable() - { - if (is_bool($this->creatable)) return $this->creatable; - return ! call_user_func($this->creatable); - } - - /** - * @param $instance - * @return bool - */ - public function isEditable($instance) - { - if (is_bool($this->editable)) return $this->editable; - return ! call_user_func($this->editable, $instance); - } - - /** - * @param $instance - * @return bool - */ - public function isDeletable($instance) - { - if (is_bool($this->deletable)) return $this->deletable; - return ! call_user_func($this->deletable, $instance); - } - - /** - * @return mixed - */ - public function getAlias() - { - return $this->alias; - } - - /** - * @param mixed $alias - * @return $this - */ - public function setAlias($alias) - { - $this->alias = $alias; - return $this; - } - - /** - * @return mixed - */ - public function getWith() - { - return $this->with; - } - - /** - * Set eager load fields - * - * @param $params - * @return ModelItem - */ - public function with($params = null) - { - if ( ! is_array($params)) - { - $params = func_get_args(); - } - $this->with = $params; - return $this; - } - - /** - * @return string - */ - public function getModelClass() - { - return $this->modelClass; - } - - public function getModelTable() - { - $instance = new $this->modelClass; - return $instance->getTable(); - } - - /** - * @return ColumnInterface[] - */ - public function getColumns() - { - return $this->columns; - } - - public function getColumnByName($name) - { - foreach ($this->columns as $column) - { - if ($column->getName() === $name) - { - return $column; - } - } - return null; - } - - /** - * @param $callback - * @return $this - */ - public function columns($callback) - { - $old = static::$current; - static::$current = $this; - call_user_func($callback); - Column::control(); - static::$current = $old; - return $this; - } - - /** - * @param ColumnInterface $column - */ - public function addColumn(ColumnInterface $column) - { - $this->columns[] = $column; - } - - /** - * @param $title - * @return $this - */ - public function title($title) - { - $this->title = $title; - return $this; - } - - /** - * @return string - */ - public function getTitle() - { - return $this->title; - } - - /** - * @param $callback - * @return $this - */ - public function filters($callback) - { - $old = static::$current; - static::$current = $this; - call_user_func($callback); - static::$current = $old; - return $this; - } - - /** - * @param $name - * @return Filter - */ - public static function filter($name) - { - return new Filter($name); - } - - /** - * @param Filter $filter - */ - public function addFilter(Filter $filter) - { - $this->filters[] = $filter; - } - - /** - * @param Builder $query - * @param $parameters - * @return array - */ - public function applyFilters(Builder $query, $parameters) - { - $titles = []; - foreach ($this->filters as $filter) - { - $title = $filter->filter($query, $parameters); - if ($title) - { - $titles[] = $title; - } - } - return $titles; - } - - /** - * @param $callback - * @return $this - */ - public function form($callback) - { - $old = static::$current; - static::$current = $this; - call_user_func($callback); - static::$current = $old; - return $this; - } - - /** - * @return Form - */ - public function getForm() - { - return $this->form; - } - - /** - * @param $modelClass - * @return string - */ - protected function getAliasFromClass($modelClass) - { - return Str::snake(Str::plural(class_basename($modelClass))); - } - - /** - * @param $method - * @param $param - * @throws MethodNotFoundException - */ - public function __call($method, $param) - { - if ($method === 'as') - { - return call_user_func_array([ - $this, - 'setAlias' - ], $param); - } - if (preg_match('/^deny(?.+)$/', $method, $attributes)) - { - $closure = isset($param[0]) ? $param[0] : true; - if (is_bool($closure)) $closure = ! $closure; - - $types = $attributes['types']; - $types = strtolower(str_replace('ing', 'able', $types)); - $types = explode('and', $types); - foreach ($types as $type) - { - $this->$type = $closure; - } - return $this; - } - throw new MethodNotFoundException(get_class($this), $method); - } - - /** - * @return boolean - */ - public function isAsync() - { - return $this->async; - } - - /** - * @param boolean $async - * @return $this - */ - public function async($async = true) - { - $this->async = $async; - return $this; - } - - /** - * @return bool - */ - public function isWithJoinEnabled() - { - return $this->withjoinEnabled; - } - - /** - * @return $this - */ - public function disableWithJoin() - { - $this->withjoinEnabled = false; - return $this; - } - - /** - * @param bool $state - * @return $this - */ - public function columnFilter($state = true) - { - $this->columnFilter = $state; - return $this; - } - - /** - * @return bool - */ - public function isColumnFilter() - { - return $this->columnFilter; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Models/Models.php b/src/SleepingOwl/Admin/Models/Models.php deleted file mode 100644 index 2f09d5d6..00000000 --- a/src/SleepingOwl/Admin/Models/Models.php +++ /dev/null @@ -1,65 +0,0 @@ -items as $item) - { - if ($item->getAlias() === $alias) - { - return $item; - } - } - throw new ModelNotFoundException('Model with alias [' . $alias . '] not registered as admin module.'); - } - - /** - * @param string $classname - * @throws ModelNotFoundException - * @return ModelItem - */ - public function modelWithClassname($classname) - { - foreach ($this->items as $item) - { - if ($item->getModelClass() === $classname) - { - return $item; - } - } - throw new ModelNotFoundException('Model with classname [' . $classname . '] not registered as admin module.'); - } - - public function getAllAliases() - { - return array_map(function (ModelItem $item) { - return $item->getAlias(); - }, $this->items); - } - - /** - * @param ModelItem $modelItem - */ - public function addItem($modelItem) - { - $this->items[] = $modelItem; - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Providers/BootstrapServiceProvider.php b/src/SleepingOwl/Admin/Providers/BootstrapServiceProvider.php new file mode 100644 index 00000000..916e2dec --- /dev/null +++ b/src/SleepingOwl/Admin/Providers/BootstrapServiceProvider.php @@ -0,0 +1,37 @@ +directory = config('admin.bootstrapDirectory'); + if ( ! is_dir($this->directory)) + { + return; + } + $files = $this->getAllFiles(); + foreach ($files as $file) + { + require $file; + } + } + + protected function getAllFiles() + { + $files = Finder::create()->files()->name('/^.+\.php$/')->notName('routes.php')->in($this->directory); + $files->sort(function ($a) + { + return $a->getFilename() !== static::BOOTSRAP_FILE; + }); + return $files; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Providers/ColumnFilterServiceProvider.php b/src/SleepingOwl/Admin/Providers/ColumnFilterServiceProvider.php new file mode 100644 index 00000000..e9573b7d --- /dev/null +++ b/src/SleepingOwl/Admin/Providers/ColumnFilterServiceProvider.php @@ -0,0 +1,17 @@ +registerPatterns(); + $this->registerMiddleware(); + + Route::group([ + 'prefix' => config('admin.prefix'), + 'namespace' => 'SleepingOwl\Admin\Http\Controllers', + ], function () + { + Route::group([ + 'middleware' => config('admin.middleware'), + ], function () + { + $file = config('admin.bootstrapDirectory') . '/routes.php'; + if (file_exists($file)) + { + require $file; + } + }); + $routesFile = __DIR__ . '/../Http/routes.php'; + if (file_exists($routesFile)) + { + require $routesFile; + } + }); + } + + public static function registerRoutes($callback) + { + Route::group([ + 'prefix' => config('admin.prefix'), + 'middleware' => config('admin.middleware'), + ], $callback); + } + + protected function registerPatterns() + { + Route::pattern('adminModelId', '[0-9]+'); + Route::pattern('adminModel', implode('|', Admin::modelAliases())); + Route::bind('adminModel', function ($model) + { + $class = array_search($model, Admin::modelAliases()); + if ($class === false) + { + throw new ModelNotFoundException; + } + return Admin::model($class); + }); + Route::pattern('adminWildcard', '.*'); + } + + protected function registerMiddleware() + { + Route::middleware('admin.auth', 'SleepingOwl\Admin\Http\Middleware\Authenticate'); + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Repositories/Interfaces/ModelRepositoryInterface.php b/src/SleepingOwl/Admin/Repositories/Interfaces/ModelRepositoryInterface.php deleted file mode 100644 index b1701eb8..00000000 --- a/src/SleepingOwl/Admin/Repositories/Interfaces/ModelRepositoryInterface.php +++ /dev/null @@ -1,63 +0,0 @@ -modelItem = $modelItem; - $this->request = $request; - $modelClass = $this->modelItem->getModelClass(); - $this->instance = new $modelClass; - } - - /** - * @param $id - * @return Model|ValidationModelInterface|ModelWithOrderFieldInterface - */ - public function find($id) - { - return $this->instance->findOrFail($id); - } - - /** - * @param null $params - * @return array - */ - public function tableData($params = null) - { - $with = $this->modelItem->getWith(); - if ($this->modelItem->isWithJoinEnabled()) - { - $baseQuery = $this->instance->newQuery()->getQuery(); - /** @var WithJoinEloquentBuilder $query */ - $query = new WithJoinEloquentBuilder($baseQuery); - if ($this->modelItem->isAsync()) - { - $query->references($with); - } - } else - { - $query = $this->instance->newQuery(); - } - $query->setModel($this->instance)->with($with); - $query = $this->instance->applyGlobalScopes($query); - $this->applyFilters($query); - $totalCount = $query->count(); - if ( ! is_null($params)) - { - if (trim($params['search']) != '') - { - $search = '%' . $params['search'] . '%'; - $this->addSearchToQuery($query, $search); - } - $totalCount = $query->count(); - if ($params['limit'] != -1) - { - $query->offset($params['offset']); - $query->limit($params['limit']); - } - if ( ! $this->instance instanceof ModelWithOrderFieldInterface) - { - $query->getQuery()->orders = null; - } - $query->orderBy($params['orderBy'], $params['orderDest']); - } - $rows = $query->get(); - return compact('rows', 'totalCount'); - } - - /** - * @return string - */ - public function getSubtitle() - { - $query = $this->instance->newQuery(); - return $this->applyFilters($query); - } - - /** - * @param $query - * @return string - */ - protected function applyFilters($query) - { - $subtitles = $this->modelItem->applyFilters($query, $this->request->query()); - $subtitle = null; - if ( ! empty($subtitles)) - { - $subtitle = implode(', ', $subtitles); - return $subtitle; - } - return $subtitle; - } - - /** - * - */ - public function store() - { - $this->save(); - } - - /** - * @param $id - * @return void - */ - public function update($id) - { - $this->instance = $this->find($id); - $this->save(); - } - - /** - * - */ - protected function save() - { - $data = $this->request->all(); - $this->modelItem->getForm()->updateRequestData($data); - - $rules = $this->modelItem->getForm()->getValidationRules(); - $this->instance->validate($data, $rules); - - $this->instance->fill($data); - - $this->instance->save(); - } - - /** - * @param $id - * @return void - */ - public function moveUp($id) - { - $this->find($id)->moveUp(); - } - - /** - * @param $id - * @return void - */ - public function moveDown($id) - { - $this->find($id)->moveDown(); - } - - /** - * @param $id - * @throws \Exception - */ - public function destroy($id) - { - $this->find($id)->delete(); - } - - /** - * @param $id - * @return ModelWithOrderFieldInterface|ValidationModelInterface|Model - */ - public function getInstance($id = null) - { - if ( ! is_null($id)) return $this->find($id); - return $this->instance; - } - - /** - * @param WithJoinEloquentBuilder $originalQuery - * @param $search - * @internal param $query - */ - protected function addSearchToQuery(WithJoinEloquentBuilder $originalQuery, $search) - { - $originalQuery->getQuery()->whereNested(function (Builder $query) use ($search, $originalQuery) - { - $table = $this->instance->getTable(); - $columns = $this->getColumns($table); - foreach ($columns as $column => $type) - { - $field = implode('.', [ - $table, - $column - ]); - if ($this->isDateColumn($type)) - { - $field = DB::raw('convert(' . $field . ' using utf8)'); - } - $query->orWhere($field, 'like', $search); - } - - /** @var ColumnInterface[] $displayColumns */ - $displayColumns = $this->modelItem->getColumns(); - foreach ($displayColumns as $column) - { - $name = $column->getName(); - if (strpos($name, '.') !== false && $this->inWith($name, $originalQuery) && $this->modelItem->isWithJoinEnabled()) - { - $query->orWhere($name, 'like', $search); - } - } - }); - } - - /** - * @param $name - * @param WithJoinEloquentBuilder $query - * @return bool - */ - protected function inWith($name, WithJoinEloquentBuilder $query) - { - $eagerLoads = $this->modelItem->getWith(); - foreach ($eagerLoads as $with) - { - if (strpos($name, $with) !== 0) continue; - - $relation = $this->instance->$with(); - if ($query->isRelationSupported($relation)) - { - return true; - } - } - return false; - } - - /** - * @param $table - * @return array - */ - protected function getColumns($table) - { - $cacheKey = '_admin_columns_cache_' . $table; - if ($columns = Cache::get($cacheKey)) - { - return $columns; - } - $schemaManager = DB::getDoctrineSchemaManager(); - $schemaManager->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); - - $columnsFull = $schemaManager->listTableColumns($table); - $columns = array_map(function (Column $column) - { - return $column->getType()->getName(); - }, $columnsFull); - Cache::put($cacheKey, $columns, 1440); - return $columns; - } - - /** - * @param $type - * @return bool - */ - protected function isDateColumn($type) - { - return in_array($type, [ - 'date', - 'datetime' - ]); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Repository/BaseRepository.php b/src/SleepingOwl/Admin/Repository/BaseRepository.php new file mode 100644 index 00000000..f25c655a --- /dev/null +++ b/src/SleepingOwl/Admin/Repository/BaseRepository.php @@ -0,0 +1,139 @@ +class = $class; + $this->model(app($this->class)); + } + + /** + * Get or set eager loading relations + * @param string|string[]|null $with + * @return $this|string[] + */ + public function with($with = null) + { + if (is_null($with)) + { + return $this->with; + } + if ( ! is_array($with)) + { + $with = func_get_args(); + } + $this->with = $with; + return $this; + } + + /** + * Get base query + * @return mixed + */ + public function query() + { + $query = $this->model->query(); + $query->with($this->with()); + return $query; + } + + /** + * Find model instance by id + * @param int $id + * @return mixed + */ + public function find($id) + { + return $this->model->find($id); + } + + /** + * Find model instances by ids + * @param int[] $ids + * @return mixed + */ + public function findMany($ids) + { + $query = $this->model->query(); + if (method_exists($this->model, 'withTrashed')) + { + $query->withTrashed(); + } + return $query->whereIn($this->model->getKeyName(), $ids)->get(); + } + + /** + * Delete model instance by id + * @param int $id + */ + public function delete($id) + { + $this->find($id)->delete(); + } + + /** + * Restore model instance by id + * @param int $id + */ + public function restore($id) + { + $this->query()->onlyTrashed()->find($id)->restore(); + } + + /** + * Get or set repository related model intance + * @param mixed|null $model + * @return $this|mixed + */ + public function model($model = null) + { + if (is_null($model)) + { + return $this->model; + } + $this->model = $model; + return $this; + } + + /** + * Check if model's table has column + * @param string $column + * @return bool + */ + public function hasColumn($column) + { + $table = $this->model->getTable(); + $columns = Cache::remember('admin.columns.' . $table, 60, function () use ($table) + { + return Schema::getColumnListing($table); + }); + return array_search($column, $columns) !== false; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Repository/TreeRepository.php b/src/SleepingOwl/Admin/Repository/TreeRepository.php new file mode 100644 index 00000000..167e569b --- /dev/null +++ b/src/SleepingOwl/Admin/Repository/TreeRepository.php @@ -0,0 +1,329 @@ +detectType(); + } + + /** + * Detect tree type + * @return $this + */ + protected function detectType() + { + if ($this->model() instanceof \Baum\Node) + { + return $this->type(static::TreeTypeBaum); + } + if ($this->model() instanceof \Kalnoy\Nestedset\Node) + { + return $this->type(static::TreeTypeKalnoy); + } + return $this->type(static::TreeTypeSimple); + } + + /** + * Get tree structure + * @return mixed + */ + public function tree() + { + $collection = $this->query()->get(); + switch ($this->type()) + { + case static::TreeTypeBaum: + return $collection->toHierarchy(); + break; + case static::TreeTypeKalnoy: + return $collection->toTree(); + break; + case static::TreeTypeSimple: + return $this->createSimpleTree(); + break; + } + return null; + } + + /** + * Reorder tree by $data value + * @param $data + */ + public function reorder($data) + { + if ($this->type() == static::TreeTypeSimple) + { + $this->recursiveReorderSimple($data, $this->rootParentId()); + } else + { + $left = 1; + foreach ($data as $root) + { + $left = $this->recursiveReorder($root, null, $left); + } + } + } + + /** + * Recursive reoder simple tree type + * @param $data + * @param $parentId + */ + protected function recursiveReorderSimple($data, $parentId) + { + foreach ($data as $order => $item) + { + $id = $item['id']; + + $instance = $this->find($id); + $instance->{$this->parentField()} = $parentId; + $instance->{$this->orderField()} = $order; + $instance->save(); + + if (isset($item['children'])) + { + $this->recursiveReorderSimple($item['children'], $id); + } + } + } + + /** + * Recursive reorder nested-set tree type + * @param $root + * @param $parentId + * @param $left + * @return mixed + */ + protected function recursiveReorder($root, $parentId, $left) + { + $right = $left + 1; + $children = array_get($root, 'children', []); + foreach ($children as $child) + { + $right = $this->recursiveReorder($child, $root['id'], $right); + } + $this->move($root['id'], $parentId, $left, $right); + $left = $right + 1; + return $left; + } + + /** + * Move tree node in nested-set tree type + * @param $id + * @param $parentId + * @param $left + * @param $right + */ + public function move($id, $parentId, $left, $right) + { + $instance = $this->find($id); + $attributes = $instance->getAttributes(); + $attributes[$this->getLeftColumn($instance)] = $left; + $attributes[$this->getRightColumn($instance)] = $right; + $attributes[$this->getParentColumn($instance)] = $parentId; + $instance->setRawAttributes($attributes); + $instance->save(); + } + + /** + * Get left column name + * @param $instance + * @return mixed + * @throws \Exception + */ + public function getLeftColumn($instance) + { + $methods = [ + 'getLeftColumnName', + 'getLftName', + ]; + return $this->callMethods($instance, $methods); + } + + /** + * Get right column name + * @param $instance + * @return mixed + * @throws \Exception + */ + public function getRightColumn($instance) + { + $methods = [ + 'getRightColumnName', + 'getRgtName', + ]; + return $this->callMethods($instance, $methods); + } + + /** + * Get parent column name + * @param $instance + * @return mixed + * @throws \Exception + */ + public function getParentColumn($instance) + { + $methods = [ + 'getParentColumnName', + 'getParentIdName', + ]; + return $this->callMethods($instance, $methods); + } + + /** + * Call several methods and get first result + * @param $instance + * @param $methods + * @return mixed + * @throws \Exception + */ + protected function callMethods($instance, $methods) + { + foreach ($methods as $method) + { + if (method_exists($instance, $method)) + { + return $instance->$method(); + } + } + throw new \Exception('Tree type not supported'); + } + + /** + * Get or set parent field name + * @param string|null $parentField + * @return $this|string + */ + public function parentField($parentField = null) + { + if (is_null($parentField)) + { + return $this->parentField; + } + $this->parentField = $parentField; + return $this; + } + + /** + * Get or set order field name + * @param string|null $orderField + * @return $this|string + */ + public function orderField($orderField = null) + { + if (is_null($orderField)) + { + return $this->orderField; + } + $this->orderField = $orderField; + return $this; + } + + /** + * Create simple tree type structure + * @return static + */ + protected function createSimpleTree() + { + $collection = $this->query()->orderBy($this->parentField(), 'asc')->orderBy($this->orderField(), 'asc')->get(); + + $parent = $this->rootParentId(); + return $this->getChildren($collection, $parent); + } + + /** + * Get children for simple tree type structure + * @param $collection + * @param $id + * @return static + */ + protected function getChildren($collection, $id) + { + $parentField = $this->parentField(); + $result = []; + foreach ($collection as $instance) + { + if ($instance->$parentField != $id) continue; + + $instance->setRelation('children', $this->getChildren($collection, $instance->getKey())); + $result[] = $instance; + } + return Collection::make($result); + } + + /** + * Get or set tree type + * @param int|null $type + * @return $this|int + */ + public function type($type = null) + { + if (is_null($type)) + { + return $this->type; + } + $this->type = $type; + return $this; + } + + /** + * Get or set parent field name + * @param string|null $rootParentId + * @return $this|string + */ + public function rootParentId($rootParentId = null) + { + if (func_num_args() == 0) + { + return $this->rootParentId; + } + $this->rootParentId = $rootParentId; + return $this; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Router.php b/src/SleepingOwl/Admin/Router.php deleted file mode 100644 index 5bf2db15..00000000 --- a/src/SleepingOwl/Admin/Router.php +++ /dev/null @@ -1,316 +0,0 @@ - '{model}', - 'action' => 'table', - 'method' => 'get' - ], - [ - 'url' => '{model}/create', - 'action' => 'create', - 'method' => 'get' - ], - [ - 'url' => '{model}', - 'action' => 'store', - 'method' => 'post' - ], - [ - 'url' => '{model}/{id}/edit', - 'action' => 'edit', - 'method' => 'get' - ], - [ - 'url' => '{model}/{id}/update', - 'action' => 'update', - 'method' => 'put' - ], - [ - 'url' => '{model}/{id}', - 'action' => 'destroy', - 'method' => 'delete' - ], - [ - 'url' => '{model}/{id}/moveup', - 'action' => 'moveup', - 'method' => 'patch' - ], - [ - 'url' => '{model}/{id}/movedown', - 'action' => 'movedown', - 'method' => 'patch' - ], - ]; - /** - * @var Repository - */ - private $config; - /** - * @var UrlGenerator - */ - private $urlGenerator; - - /** - * @param IlluminateRouter $router - * @param Repository $config - * @param UrlGenerator $urlGenerator - * @param string $prefix - * @param string $routePrefix - */ - function __construct(IlluminateRouter $router, Repository $config, UrlGenerator $urlGenerator, $prefix, - $routePrefix = 'sleeping-owl-admin') - { - $this->laravelRouter = $router; - $this->config = $config; - $this->prefix = $prefix; - $this->routePrefix = $routePrefix; - $this->urlGenerator = $urlGenerator; - } - - /** - * Register all admin routes - */ - public function registerRoutes() - { - $this->registerAssetsRoutes(); - $this->registerAuthRoutes(); - $this->registerImageCacheRoute(); - - $models = Admin::instance()->models->getAllAliases(); - - $this->laravelRouter->group([ - 'prefix' => $this->prefix, - 'before' => $this->getBeforeFilters(), - 'namespace' => 'SleepingOwl\Admin\Controllers', - ], function () use ($models) - { - if (empty($models)) $models = ['__empty_models__']; - $this->laravelRouter->group([ - 'where' => ['model' => implode('|', $models)] - ], function () - { - foreach (static::$modelRoutes as $route) - { - $url = $route['url']; - $action = $route['action']; - $method = $route['method']; - $controller = isset($route['controller']) ? $route['controller'] : 'AdminController'; - $this->laravelRouter->$method($url, [ - 'as' => $this->routePrefix . '.table.' . $action, - 'uses' => $controller . '@' . $action - ]); - } - }); - - $wildcardRoute = $this->laravelRouter->any('{wildcard?}', [ - 'as' => $this->routePrefix . '.wildcard', - 'uses' => 'AdminController@getWildcard' - ])->where('wildcard', '.*'); - $this->setRoutePriority($wildcardRoute, 0); - }); - } - - /** - * Register routes to admin assets - */ - protected function registerAssetsRoutes() - { - # CKEditor file listing and upload - $this->laravelRouter->group([ - 'before' => $this->getBeforeFilters(), - 'prefix' => 'images', - 'namespace' => 'SleepingOwl\Admin\Controllers' - ], function () - { - $this->laravelRouter->get('all', 'ImagesController@getAll'); - $this->laravelRouter->post('upload', 'ImagesController@postUpload'); - }); - $this->laravelRouter->get('js/{locale}/lang.js', [ - 'prefix' => $this->prefix, - 'as' => $this->routePrefix . '.lang', - 'uses' => 'SleepingOwl\Admin\Controllers\LangController@getAll' - ]); - } - - /** - * Register login and logout routes - */ - protected function registerAuthRoutes() - { - $this->laravelRouter->group([ - 'prefix' => $this->prefix, - 'namespace' => 'SleepingOwl\Admin\Controllers' - ], function () - { - $this->laravelRouter->get('login', [ - 'as' => $this->routePrefix . '.login', - 'uses' => 'AuthController@getLogin' - ]); - $this->laravelRouter->post('login', [ - 'as' => $this->routePrefix . '.login.post', - 'uses' => 'AuthController@postLogin' - ])->before('csrf'); - $this->laravelRouter->get('logout', [ - 'as' => $this->routePrefix . '.logout', - 'uses' => 'AuthController@getLogout' - ]); - }); - } - - /** - * - */ - protected function registerImageCacheRoute() - { - $this->laravelRouter->get($this->config->get('imagecache.route') . '/admin_preview/{filename}', 'SleepingOwl\Admin\Controllers\ImagesController@getImage')->where(['filename' => '[ \w\\.\\/\\-]+']); - } - - /** - * @return array - */ - protected function getBeforeFilters() - { - return $this->config->get('admin.beforeFilters'); - } - - /** - * @param string $asset - * @return string - */ - public function routeToAsset($asset) - { - return $this->urlGenerator->asset('packages/sleeping-owl/admin/' . $asset); - } - - /** - * @param $locale - * @return string - */ - public function routeToLang($locale) - { - return $this->urlGenerator->route($this->routePrefix . '.lang', $locale); - } - - /** - * @param string $model - * @param array $parameters - * @return string - */ - public function routeToModel($model, $parameters = []) - { - return $this->routeToTable($model, $parameters); - } - - /** - * Get route to admin startpage - * @return string - */ - public function routeHome() - { - return $this->routeToWildcard('/'); - } - - /** - * @param $url - * @return string - */ - public function routeToWildcard($url) - { - return $this->urlGenerator->route($this->routePrefix . '.wildcard', ['wildcard' => $url]); - } - - /** - * @param $action - * @return string - */ - public function routeToAuth($action) - { - return $this->urlGenerator->route($this->routePrefix . '.' . $action); - } - - /** - * @param string $method - * @param array $parameters - * @throws MethodNotFoundException - */ - public function __call($method, $parameters) - { - if (preg_match('/^routeTo(?[a-zA-Z]+)$/', $method, $matches)) - { - $route = Str::camel($matches['routeName']); - while (count($parameters) < 2) - { - $parameters[] = []; - } - if ( ! is_array($parameters[1])) - { - $parameters[1] = [$parameters[1]]; - } - $routeParameters = $parameters[1]; - array_unshift($routeParameters, $parameters[0]); - return $this->urlGenerator->route($this->routePrefix . '.table.' . $route, $routeParameters); - } - if (method_exists($this->laravelRouter, $method)) - { - return $this->laravelRouter->group([ - 'prefix' => $this->prefix, - 'before' => $this->getBeforeFilters(), - ], function () use ($method, $parameters) - { - call_user_func_array([ - $this->laravelRouter, - $method - ], $parameters); - }); - } - throw new MethodNotFoundException(get_class($this), $method); - } - - protected function setRoutePriority($wildcardRoute, $priority) - { - if (method_exists($wildcardRoute, 'setPriority')) - { - $wildcardRoute->setPriority($priority); - } - } - -} diff --git a/src/SleepingOwl/Admin/Session/QueryState.php b/src/SleepingOwl/Admin/Session/QueryState.php deleted file mode 100644 index 80273f96..00000000 --- a/src/SleepingOwl/Admin/Session/QueryState.php +++ /dev/null @@ -1,76 +0,0 @@ -session = $session; - $this->request = $request; - } - - /** - * Save current query parameters in session - */ - public function save() - { - $this->session->set($this->getSessionVarName(), $this->request->query()); - } - - /** - * Get saved query parameters from session - * - * @return array|null - */ - public function load() - { - return $this->session->get($this->getSessionVarName()); - } - - /** - * Get session name to save query parameters - * - * @return string - */ - protected function getSessionVarName() - { - $parts = [ - $this->prefix, - 'index', - 'query' - ]; - return implode('.', $parts); - } - - /** - * @param string $prefix - */ - public function setPrefix($prefix) - { - $this->prefix = $prefix; - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Templates/Facade/AdminTemplate.php b/src/SleepingOwl/Admin/Templates/Facade/AdminTemplate.php new file mode 100644 index 00000000..093bbd72 --- /dev/null +++ b/src/SleepingOwl/Admin/Templates/Facade/AdminTemplate.php @@ -0,0 +1,16 @@ +updateOrderFieldOnCreate(); + }); + + static::deleted(function ($row) + { + $row->updateOrderFieldOnDelete(); + }); + } + + /** + * Get order value + * @return int + */ + public function getOrderValue() + { + return $this->{$this->getOrderField()}; + } + + /** + * Move model up + */ + public function moveUp() + { + $this->move(1); + } + + /** + * Move model down + */ + public function moveDown() + { + $this->move(-1); + } + + /** + * Move model in the $destination + * @param $destination -1 (move down) or 1 (move up) + */ + protected function move($destination) + { + $previousRow = static::orderModel()->where($this->getOrderField(), $this->getOrderValue() - $destination)->first(); + $previousRow->{$this->getOrderField()} += $destination; + $previousRow->save(); + + $this->{$this->getOrderField()} -= $destination; + $this->save(); + } + + /** + * Update order field on create + */ + protected function updateOrderFieldOnCreate() + { + $this->{$this->getOrderField()} = static::orderModel()->count(); + } + + /** + * Update order field on delete + */ + protected function updateOrderFieldOnDelete() + { + static::orderModel()->where($this->getOrderField(), '>', $this->getOrderValue())->decrement($this->getOrderField()); + } + + /** + * Order scope + * @param $query + * @return mixed + */ + public function scopeOrderModel($query) + { + return $query; + } + + /** + * Get order field name + * @return string + */ + public function getOrderField() + { + return 'order'; + } + +} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/Validation/Validator.php b/src/SleepingOwl/Admin/Validation/Validator.php deleted file mode 100644 index 8cb6883d..00000000 --- a/src/SleepingOwl/Admin/Validation/Validator.php +++ /dev/null @@ -1,116 +0,0 @@ -validateRegex($attribute, $value, ['/^[a-zA-Z0-9-_]+$/']); - } - - /** - * @param $attribute - * @param $value - * @param $parameters - * @return bool - */ - protected function validateUrlStubFull($attribute, $value, $parameters) - { - return $this->validateRegex($attribute, $value, ['/^[a-zA-Z0-9-_\/]+$/']); - } - - /** - * @param string $attribute - * @param mixed $value - * @param array $parameters - * @return bool - */ - protected function validateUnique($attribute, $value, $parameters) - { - if (isset($this->customAttributes['id'])) - { - $id = $this->customAttributes['id']; - if ($id !== null) - { - $parameters[] = $id; - } - } - return parent::validateUnique($attribute, $value, $parameters); - } - - /** - * @param $attribute - * @param $value - * @param $parameters - * @return bool - */ - protected function validateRequiredOnlyOnCreate($attribute, $value, $parameters) - { - $id = $this->customAttributes['id']; - if ($id !== null) return true; - - return parent::validateRequired($attribute, $value); - } - - /** - * @param $attribute - * @param $value - * @return bool - */ - protected function validateNotPhp($attribute, $value) - { - if ($value->getClientMimeType() === 'text/php') return false; - return true; - } - - protected function validateDate($attribute, $value) - { - $parameters = func_get_args()[2]; - if (Arr::get($parameters, 0) == 'locale') - { - return $this->validateDateWithLocale($attribute, $value); - } - return parent::validateDate($attribute, $value); - } - - - protected function validateDateWithLocale($attribute, $value) - { - if ($this->validateDate($attribute, $value, [])) - { - return true; - } - $containsTime = (strpos($value, ':') !== false) ? 3 : -1; - $formatter = datefmt_create(\App::getLocale(), 3, $containsTime); - $value = $formatter->parse($value); - return $value !== false; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Admin/filters.php b/src/SleepingOwl/Admin/filters.php deleted file mode 100644 index b9d11083..00000000 --- a/src/SleepingOwl/Admin/filters.php +++ /dev/null @@ -1,15 +0,0 @@ -router->routeToAuth('login')); - } - } -}); \ No newline at end of file diff --git a/src/SleepingOwl/AdminAuth/AdminAuthManager.php b/src/SleepingOwl/AdminAuth/AdminAuthManager.php index 4a4a349d..9eb2f0e1 100755 --- a/src/SleepingOwl/AdminAuth/AdminAuthManager.php +++ b/src/SleepingOwl/AdminAuth/AdminAuthManager.php @@ -24,7 +24,7 @@ public function createEloquentDriver() * * @return \Illuminate\Auth\EloquentUserProvider */ - protected function createEloquentProvider() + protected function createEloquentProvider($config = null) { $model = Config::get('admin.auth.model'); @@ -38,7 +38,7 @@ protected function createEloquentProvider() */ public function getDefaultDriver() { - return 'eloquent'; + return 'web'; } } diff --git a/src/SleepingOwl/AdminAuth/AdminAuthServiceProvider.php b/src/SleepingOwl/AdminAuth/AdminAuthServiceProvider.php index b96aeeb2..308484c5 100755 --- a/src/SleepingOwl/AdminAuth/AdminAuthServiceProvider.php +++ b/src/SleepingOwl/AdminAuth/AdminAuthServiceProvider.php @@ -18,7 +18,7 @@ class AdminAuthServiceProvider extends ServiceProvider { */ public function register() { - $this->app->bindShared('admin.auth', function($app) + $this->app->singleton('admin.auth', function($app) { return new AdminAuthManager($app); }); diff --git a/src/SleepingOwl/AdminAuth/Database/Seeders/AdministratorsTableSeeder.php b/src/SleepingOwl/AdminAuth/Database/Seeders/AdministratorsTableSeeder.php index fa22d365..3db0b1f3 100644 --- a/src/SleepingOwl/AdminAuth/Database/Seeders/AdministratorsTableSeeder.php +++ b/src/SleepingOwl/AdminAuth/Database/Seeders/AdministratorsTableSeeder.php @@ -13,7 +13,7 @@ public function run() $default = [ 'username' => 'admin', - 'password' => Hash::make('SleepingOwl'), + 'password' => 'SleepingOwl', 'name' => 'SleepingOwl Administrator' ]; diff --git a/src/SleepingOwl/AdminAuth/Entities/Administrator.php b/src/SleepingOwl/AdminAuth/Entities/Administrator.php index ed554b3f..796963bb 100644 --- a/src/SleepingOwl/AdminAuth/Entities/Administrator.php +++ b/src/SleepingOwl/AdminAuth/Entities/Administrator.php @@ -1,5 +1,6 @@ attributes['password'] = Hash::make($value); + } + } + } \ No newline at end of file diff --git a/src/SleepingOwl/DateFormatter/DateFormatter.php b/src/SleepingOwl/DateFormatter/DateFormatter.php deleted file mode 100644 index e4cf910c..00000000 --- a/src/SleepingOwl/DateFormatter/DateFormatter.php +++ /dev/null @@ -1,38 +0,0 @@ -getPattern(); - $pattern = str_replace('yy', 'y', $pattern); - $formatter->setPattern($pattern); - - return $formatter->format($date); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Html/FormBuilder.php b/src/SleepingOwl/Html/FormBuilder.php deleted file mode 100644 index 5f975929..00000000 --- a/src/SleepingOwl/Html/FormBuilder.php +++ /dev/null @@ -1,409 +0,0 @@ -errors = array_get($options, 'errors'); - array_forget($options, 'errors'); - array_set($options, 'files', true); - return parent::open($options); - } - - /** - * Append element label and error label to form element and wrap it with div - * - * @param string $name - * @param string $label - * @param string $formElement - * @return string - */ - protected function makeGroup($name, $label, $formElement) - { - $content = ''; - $content .= $this->label($name, $label); - $content .= $formElement; - return $this->wrapContent($name, $content); - } - - /** - * Append error label to element and wrap it with div - * - * @param string $name - * @param string $content - * @return string - */ - protected function wrapContent($name, $content) - { - $content .= $this->errors->first($name, $this->getErrorTemplate()); - $class = $this->getErrorClass($name); - return $this->wrapGroup($content, compact('class')); - } - - /** - * Wrap content with div - * - * @param string $content - * @param array $options - * @return string - */ - protected function wrapGroup($content, array $options = []) - { - $options = $this->addClassToOptions($this->getFormGroupClass(), $options); - return $this->html->tag('div', $options, $content); - } - - /** - * Add class to attributes array - * - * @param string $classToAdd - * @param array $options - * @return array - */ - protected function addClassToOptions($classToAdd, array $options = []) - { - $class = array_get($options, 'class', ''); - if (is_array($class)) - { - $class[] = $classToAdd; - } elseif ( ! empty($class)) - { - $class .= ' ' . $classToAdd; - } else - { - $class = $classToAdd; - } - array_set($options, 'class', $class); - return $options; - } - - /** - * @param $name - * @param null $value - * @param string $addon - * @param string $placement - * @param array $options - * @param array $wrapperOptions - * @return mixed - */ - public function textAddon($name, $value = null, $addon = '', $placement = 'before', $options = [], - $wrapperOptions = []) - { - $addonElement = $this->html->tag('span', ['class' => 'input-group-addon'], $addon); - $inputElement = $this->text($name, $value, $options); - if ($placement === 'before') - { - $content = $addonElement . $inputElement; - } else - { - $content = $inputElement . $addonElement; - } - $wrapperOptions = $this->addClassToOptions('form-group input-group', $wrapperOptions); - return $this->html->tag('div', $wrapperOptions, $content); - } - - /** - * @param $name - * @param $label - * @param null $value - * @param array $options - * @param int $dateFormat - * @param int $timeFormat - * @return string - */ - public function datetime($name, $label, $value = null, array $options = [], $dateFormat = DateFormatter::SHORT, - $timeFormat = DateFormatter::NONE) - { - $value = $this->getValueAttribute($name, $value); - if ( ! is_null($value)) - { - $value = DateFormatter::format($value, $dateFormat, $timeFormat); - } - - $options = $this->addClassToOptions('form-control', $options); - $content = $this->textAddon($name, $value, '', 'after', $options, ['class' => 'datepicker']); - return $this->makeGroup($name, $label, $content); - } - - /** - * @param $name - * @param $label - * @param null $value - * @param array $options - * @return mixed - */ - public function textGroup($name, $label, $value = null, array $options = []) - { - $options = $this->updateOptions($options); - return $this->makeGroup($name, $label, $this->text($name, $value, $options)); - } - - /** - * @param $name - * @param $label - * @param bool $showSeconds - * @param null $value - * @param array $options - * @return string - */ - public function timeGroup($name, $label, $showSeconds = false, $value = null, array $options = []) - { - $options = $this->updateOptions($options); - - $value = $this->getValueAttribute($name, $value); - $value = DateFormatter::format($value, DateFormatter::NONE, $showSeconds ? DateFormatter::MEDIUM : DateFormatter::SHORT); - - $content = $this->text($name, $value, $options); - $content .= $this->html->tag('span', ['class' => 'input-group-addon'], ''); - $content = $this->html->tag('div', ['class' => 'form-group input-group timepicker'], $content); - return $this->makeGroup($name, $label, $content); - } - - /** - * @param $name - * @param $label - * @param array $options - * @return mixed - */ - public function passwordGroup($name, $label, array $options = []) - { - $options = $this->updateOptions($options); - return $this->makeGroup($name, $label, $this->password($name, $options)); - } - - /** - * @param $name - * @param $label - * @param string $addon - * @param string $placement - * @param null $value - * @param array $options - * @param array $wrapperAttributes - * @return mixed - */ - public function textAddonGroup($name, $label, $addon = '', $placement = 'before', $value = null, - array $options = [], array $wrapperAttributes = []) - { - $options = $this->updateOptions($options); - return $this->makeGroup($name, $label, $this->textAddon($name, $value, $addon, $placement, $options, $wrapperAttributes)); - } - - /** - * @param $name - * @param $label - * @param null $value - * @param array $options - * @return mixed - */ - public function checkboxGroup($name, $label, $value = null, array $options = []) - { - $content = $this->hidden($name, 0, ['type' => 'hidden']); - $content .= $this->labelWithoutEscaping($name, $this->checkbox($name, 1, $value, $options) . $label); - $content = $this->html->tag('div', ['class' => 'checkbox'], $content); - return $this->wrapContent($name, $content); - } - - /** - * @param $name - * @param null $value - * @param array $options - * @return string - */ - public function labelWithoutEscaping($name, $value = null, $options = []) - { - $this->labels[] = $name; - - $options = $this->html->attributes($options); - - $value = $this->formatLabel($name, $value); - - return ''; - } - - /** - * @param $name - * @param $label - * @param array $list - * @param null $value - * @param array $options - * @return mixed - */ - public function selectGroup($name, $label, array $list = [], $value = null, array $options = []) - { - $options = $this->updateOptions($options); - return $this->makeGroup($name, $label, $this->html->tag('div', [], $this->select($name, $list, $value, $options))); - } - - /** - * @param $name - * @param $label - * @param null $value - * @param array $options - * @return mixed - */ - public function textareaGroup($name, $label, $value = null, array $options = []) - { - $options = $this->updateOptions($options); - return $this->makeGroup($name, $label, $this->textarea($name, $value, $options)); - } - - /** - * @param $name - * @param $label - * @param $model - * @param array $options - * @return mixed - */ - public function imageGroup($name, $label, ModelWithImageFieldsInterface $model, array $options = []) - { - $options = $this->updateOptions($options); - $content = ''; - if ($model->$name->exists()) - { - $img = $this->html->tag('img', [ - 'class' => 'thumbnail', - 'src' => $model->$name->thumbnail('admin_preview'), - 'width' => '80px', - 'data-toggle' => 'tooltip', - 'title' => $model->$name->info() - ]); - $innerContent = $this->html->tag('a', [ - 'href' => $model->$name->thumbnail('original'), - 'data-toggle' => 'lightbox' - ], $img); - $innerContent .= $this->html->tag('a', [ - 'href' => '#', - 'class' => 'img-delete', - 'data-name' => $name, - ], ' ' . Lang::get('admin::lang.table.delete')); - $innerContent .= '
'; - $content .= $this->html->tag('div', ['class' => 'img-container'], $innerContent); - } - $content .= $this->file($name, null, $options); - return $this->makeGroup($name, $label, $content); - } - - /** - * @param $name - * @param $label - * @param ModelWithFileFieldsInterface $model - * @param array $options - * @return mixed - */ - public function fileGroup($name, $label, ModelWithFileFieldsInterface $model, array $options = []) - { - $options = $this->updateOptions($options); - $content = ''; - if ($model->$name->exists()) - { - $link = $this->html->tag('a', [ - 'href' => $model->$name->link(), - 'title' => Lang::get('admin::lang.table.download'), - 'data-toggle' => 'tooltip' - ], ' ' . $model->$name->info()); - $file = $this->html->tag('div', ['class' => 'thumbnail file-info'], $link); - $content .= $this->html->tag('div', [], $file); - } - $content .= $this->file($name, null, $options); - return $this->makeGroup($name, $label, $content); - } - - /** - * @param $cancelUrl - * @return mixed - */ - public function submitGroup($cancelUrl) - { - $content = $this->submit(Lang::get('admin::lang.table.save'), ['class' => 'btn btn-primary']); - $content .= ' '; - $content .= $this->html->link($cancelUrl, Lang::get('admin::lang.table.cancel'), ['class' => 'btn btn-default']); - return $this->wrapGroup($content); - } - - /** - * @param string $name - * @param array $attributes - * @return null|string - */ - public function getIdAttribute($name, $attributes) - { - if ($id = parent::getIdAttribute($name, $attributes)) - { - return $id; - } - if (Arr::get($attributes, 'type') !== 'hidden') - { - return $name; - } - return null; - } - - /** - * @return mixed - */ - public function getModel() - { - return $this->model; - } - - /** - * @return string - */ - protected function getFormGroupClass() - { - return 'form-group'; - } - - /** - * @param array $options - * @return array - */ - protected function updateOptions($options = []) - { - return $this->addClassToOptions('form-control', $options); - } - - /** - * @return string - */ - protected function getErrorTemplate() - { - return '

:message

'; - } - - /** - * @param $name - * @return array - */ - protected function getErrorClass($name) - { - $class = []; - if ($this->errors->has($name)) - { - $class[] = 'has-error'; - } - return $class; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Html/HtmlBuilder.php b/src/SleepingOwl/Html/HtmlBuilder.php deleted file mode 100644 index 715beb8c..00000000 --- a/src/SleepingOwl/Html/HtmlBuilder.php +++ /dev/null @@ -1,86 +0,0 @@ -getOpeningTag($tag, $attributes) . $content . $this->getClosingTag($tag); - } - - /** - * @param string $key - * @param string $value - * @return string - */ - protected function attributeElement($key, $value) - { - if (is_array($value)) - { - $value = implode(' ', $value); - } - return parent::attributeElement($key, $value); - } - - /** - * @param $tag - * @param array $attributes - * @return string - */ - protected function getOpeningTag($tag, array $attributes) - { - $result = '<' . $tag; - if ( ! empty($attributes)) - { - $result .= $this->attributes($attributes); - } - if ($this->isTagNeedsClosingTag($tag)) - { - $result .= '>'; - } - return $result; - } - - /** - * @param $tag - * @return string - */ - protected function getClosingTag($tag) - { - $closingTag = '/>'; - if ($this->isTagNeedsClosingTag($tag)) - { - $closingTag = ''; - } - return $closingTag; - } - - /** - * @param $tag - * @return bool - */ - protected function isTagNeedsClosingTag($tag) - { - return ! in_array($tag, $this->tagsWithoutContent); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Attributes/File.php b/src/SleepingOwl/Models/Attributes/File.php deleted file mode 100644 index 442533f6..00000000 --- a/src/SleepingOwl/Models/Attributes/File.php +++ /dev/null @@ -1,124 +0,0 @@ -directory = $directory; - $this->filename = $filename; - } - - /** - * @return bool - */ - public function isSeed() - { - return Str::startsWith($this->filename, 'seeds/'); - } - - /** - * @return string - */ - public function getPath() - { - return $this->directory . $this->filename; - } - - /** - * @return string - */ - public function getDirectoryFullPath() - { - return Config::get('admin.filesDirectory') . '/' . $this->directory; - } - - /** - * @return string - */ - public function getFullPath() - { - return $this->getDirectoryFullPath() . $this->filename; - } - - /** - * - */ - public function delete() - { - if ( ! $this->exists()) return; - if ($this->isSeed()) return; - IlluminateFile::delete($this->getFullPath()); - } - - /** - * @return bool - */ - public function exists() - { - return is_file($this->getFullPath()); - } - - /** - * @return string - */ - public function link() - { - $link = str_replace(public_path(), '', $this->getFullPath()); - return URL::asset($link); - } - - /** - * @return string - */ - public function info() - { - $filename = $this->getFullPath(); - if ( ! $this->exists()) return ''; - - $extension = IlluminateFile::extension($filename); - return strtr(static::TEMPLATE_INFO, [ - ':type' => $extension, - ]); - } - - /** - * @param mixed $filename - */ - public function setFilename($filename) - { - $this->filename = $filename; - } - - /** - * @return mixed - */ - function __toString() - { - return $this->filename; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Attributes/Image.php b/src/SleepingOwl/Models/Attributes/Image.php deleted file mode 100644 index 0e072e31..00000000 --- a/src/SleepingOwl/Models/Attributes/Image.php +++ /dev/null @@ -1,130 +0,0 @@ -directory = $directory; - $this->filename = $filename; - } - - /** - * @return bool - */ - public function isSeed() - { - return Str::startsWith($this->filename, 'seeds/'); - } - - /** - * @return string - */ - public function getPath() - { - return $this->directory . $this->filename; - } - - /** - * @return string - */ - public function getDirectoryFullPath() - { - return Config::get('admin.imagesDirectory') . '/' . $this->directory; - } - - /** - * @return string - */ - public function getFullPath() - { - return $this->getDirectoryFullPath() . $this->filename; - } - - /** - * - */ - public function delete() - { - if ( ! $this->exists()) return; - if ($this->isSeed()) return; - IlluminateFile::delete($this->getFullPath()); - } - - /** - * @return bool - */ - public function exists() - { - return is_file($this->getFullPath()); - } - - /** - * @return string - */ - public function info() - { - $filename = $this->getFullPath(); - if ( ! $this->exists()) return ''; - - list($width, $height) = getimagesize($filename); - $extension = \File::extension($filename); - return strtr(static::TEMPLATE_INFO, [ - ':type' => $extension, - ':width' => $width, - ':height' => $height - ]); - } - - /** - * @param mixed $filename - */ - public function setFilename($filename) - { - $this->filename = $filename; - } - - /** - * @param $template - * @return string - */ - public function thumbnail($template) - { - if ( ! $this->exists()) return null; - return route('imagecache', [ - $template, - $this->getPath() - ]); - } - - /** - * @return mixed - */ - function __toString() - { - return $this->filename; - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Interfaces/ModelWithFileFieldsInterface.php b/src/SleepingOwl/Models/Interfaces/ModelWithFileFieldsInterface.php deleted file mode 100644 index ca2edd73..00000000 --- a/src/SleepingOwl/Models/Interfaces/ModelWithFileFieldsInterface.php +++ /dev/null @@ -1,22 +0,0 @@ -defaultSort(); - return $query; - } - - /** - * @param $query - */ - public function scopeDefaultSort($query) - { - return $query; - } - - /** - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function withoutOrders() - { - $instance = new static; - $query = $instance->newQuery(); - $query->getQuery()->orders = []; - return $query; - } - - /** - * @return \Eloquent - */ - public static function random() - { - return static::withoutOrders()->orderByRaw('RAND()')->first(); - } - - /** - * @param \DateTime|int $value - * @return Carbon|string - */ - public function fromDateTime($value) - { - try - { - $result = parent::fromDateTime($value); - } catch (InvalidArgumentException $e) - { - $containsTime = (strpos($value, ':') !== false) ? 3 : -1; - $formatter = datefmt_create(\App::getLocale(), 3, $containsTime); - $value = $formatter->parse($value); - $format = $this->getDateFormat(); - $value = Carbon::createFromTimestamp($value); - return $value->format($format); - } - return $result; - } - - -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Traits/DeleteAllModelTrait.php b/src/SleepingOwl/Models/Traits/DeleteAllModelTrait.php deleted file mode 100644 index 5ec0bfeb..00000000 --- a/src/SleepingOwl/Models/Traits/DeleteAllModelTrait.php +++ /dev/null @@ -1,15 +0,0 @@ -each(function ($row) - { - $row->delete(); - }); - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Traits/ModelWithImageOrFileFieldsTrait.php b/src/SleepingOwl/Models/Traits/ModelWithImageOrFileFieldsTrait.php deleted file mode 100644 index 7647f901..00000000 --- a/src/SleepingOwl/Models/Traits/ModelWithImageOrFileFieldsTrait.php +++ /dev/null @@ -1,264 +0,0 @@ -getImageFields() as $field => $directory) - { - $row->$field->delete(); - } - } - if ($row instanceof ModelWithFileFieldsInterface) - { - foreach ($row->getFileFields() as $field => $directory) - { - $row->$field->delete(); - } - } - }); - } - - /** - * @param $field - * @return Image - */ - protected function getImage($field) - { - return new Image($this->getImageFieldDirectory($field), Arr::get($this->attributes, $field, null)); - } - - /** - * @param $field - * @return File - */ - protected function getFile($field) - { - return new File($this->getFileFieldDirectory($field), Arr::get($this->attributes, $field, null)); - } - - /** - * @param $field - * @param $image - */ - public function setImage($field, $image) - { - if (is_null($image)) return; - $filename = $image; - $this->$field->delete(); - if ($image instanceof UploadedFile) - { - $func = $this->getImageFieldNamingFunc($field); - $filename = $this->getFilenameFromFile($func, $field, $image); - $image->move(Config::get('admin.imagesDirectory') . '/' . $this->getImageFieldDirectory($field), $filename); - $this->$field->setFilename($filename); - } - $this->attributes[$field] = $filename; - } - - /** - * @param $field - * @param $file - */ - public function setFile($field, $file) - { - if ($file == null) return; - $filename = $file; - if ($file instanceof UploadedFile) - { - $this->$field->delete(); - $func = $this->getFileFieldNamingFunc($field); - $filename = $this->getFilenameFromFile($func, $field, $file); - $file->move(Config::get('admin.filesDirectory') . '/' . $this->getFileFieldDirectory($field), $filename); - $this->$field->setFilename($filename); - } - $this->attributes[$field] = $filename; - } - - /** - * @param \Closure|null $func - * @param $field - * @param UploadedFile $file - * @return string - */ - protected function getFilenameFromFile($func, $field, UploadedFile $file) - { - if (is_null($func)) - { - $func = function($directory, $originalName, $extension) - { - return RandomFilenamer::get($directory, $extension); - }; - } - return $func($this->$field->getDirectoryFullPath(), $file->getClientOriginalName(), $file->guessClientExtension()); - } - - /** - * @param $field - * @return bool - */ - public function hasImageField($field) - { - if ( ! $this instanceof ModelWithImageFieldsInterface) return false; - return isset($this->getImageFields()[$field]); - } - - /** - * @param $field - * @return mixed - */ - public function getImageFieldDirectory($field) - { - $data = $this->getImageFields()[$field]; - if (is_array($data)) - { - return Arr::get($data, 0); - } - return $data; - } - - /** - * @param $field - * @return null|\Closure - */ - public function getImageFieldNamingFunc($field) - { - $data = $this->getImageFields()[$field]; - if (is_array($data)) - { - return Arr::get($data, 1); - } - return null; - } - - /** - * @param $field - * @return bool - */ - public function hasFileField($field) - { - if ( ! $this instanceof ModelWithFileFieldsInterface) return false; - return isset($this->getFileFields()[$field]); - } - - /** - * @param $field - * @return mixed - */ - public function getFileFieldDirectory($field) - { - $data = $this->getFileFields()[$field]; - if (is_array($data)) - { - return Arr::get($data, 0); - } - return $data; - } - - - /** - * @param $field - * @return null|\Closure - */ - public function getFileFieldNamingFunc($field) - { - $data = $this->getFileFields()[$field]; - if (is_array($data)) - { - return Arr::get($data, 1); - } - return null; - } - - /** - * @param $key - * @return bool - */ - public function hasGetMutator($key) - { - if ($this->hasImageField($key)) - { - return true; - } - if ($this->hasFileField($key)) - { - return true; - } - return parent::hasGetMutator($key); - } - - /** - * @param $key - * @return bool - */ - public function hasSetMutator($key) - { - if ($this->hasImageField($key)) - { - return true; - } - if ($this->hasFileField($key)) - { - return true; - } - return parent::hasSetMutator($key); - } - - /** - * @param $method - * @param $parameters - * @return Image|void - */ - public function __call($method, $parameters) - { - if (preg_match('/set(?[a-zA-Z0-9]+)Attribute/', $method, $attr)) - { - $fields = [Str::lower($attr['field']), Str::camel($attr['field']), Str::snake($attr['field'])]; - foreach ($fields as $field) - { - if ($this->hasImageField($field)) - { - return $this->setImage($field, $parameters[0]); - } - if ($this->hasFileField($field)) - { - return $this->setFile($field, $parameters[0]); - } - } - } - if (preg_match('/get(?[a-zA-Z]+)Attribute/', $method, $attr)) - { - $fields = [Str::lower($attr['field']), Str::camel($attr['field']), Str::snake($attr['field'])]; - foreach ($fields as $field) - { - if ($this->hasImageField($field)) - { - return $this->getImage($field); - } - if ($this->hasFileField($field)) - { - return $this->getFile($field); - } - } - } - return parent::__call($method, $parameters); - } - -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Traits/ModelWithOrderFieldTrait.php b/src/SleepingOwl/Models/Traits/ModelWithOrderFieldTrait.php deleted file mode 100644 index 1a220b36..00000000 --- a/src/SleepingOwl/Models/Traits/ModelWithOrderFieldTrait.php +++ /dev/null @@ -1,75 +0,0 @@ -updateSortFieldOnCreate(); - }); - - static::deleted(function ($row) - { - $row->updateSortFieldOnDelete(); - }); - } - - public function getOrderValue() - { - return $this->{$this->getSortField()}; - } - - public function moveUp() - { - $this->move(1); - } - - public function moveDown() - { - $this->move(-1); - } - - /** - * @param $destination -1 (move down) or 1 (move up) - */ - protected function move($destination) - { - $previousRow = static::sortModel()->where($this->getSortField(), $this->{$this->getSortField()} - $destination)->first(); - $previousRow->{$this->getSortField()} += $destination; - $previousRow->save(); - - $this->{$this->getSortField()} -= $destination; - $this->save(); - } - - protected function updateSortFieldOnCreate() - { - $this->{$this->getSortField()} = static::sortModel()->count(); - } - - protected function updateSortFieldOnDelete() - { - static::sortModel()->where($this->getSortField(), '>', $this->{$this->getSortField()})->update([$this->getSortField() => DB::raw($this->getSortField() . ' - 1')]); - } - - public function scopeSortModel($query) - { - return $query; - } - - public function scopeDefaultSort($query) - { - return $query->orderBy($this->getSortField(), 'asc'); - } - - /** - * @return string - */ - public function getSortField() - { - return 'sort'; - } -} \ No newline at end of file diff --git a/src/SleepingOwl/Models/Traits/ValidationModelTrait.php b/src/SleepingOwl/Models/Traits/ValidationModelTrait.php deleted file mode 100644 index 9bb22145..00000000 --- a/src/SleepingOwl/Models/Traits/ValidationModelTrait.php +++ /dev/null @@ -1,53 +0,0 @@ -mergeValidationRules($rules); - $validator = Validator::make($data, $rules, Lang::get('admin::validation'), ['id' => $this->id]); - - if ($validator->fails()) - { - throw new ValidationException($validator->errors()); - } - return true; - } - - /** - * @param $rules - * @return array - */ - protected function mergeValidationRules($rules) - { - foreach ($this->getValidationRules() as $field => $rule) - { - if (!is_array($rule)) - { - $rule = explode('|', $rule); - } - $rules[$field] = array_merge($rules[$field], $rule); - } - return $rules; - } - - public function getValidationRules() - { - return []; - } -} \ No newline at end of file diff --git a/src/SleepingOwl/RandomFilenamer/RandomFilenamer.php b/src/SleepingOwl/RandomFilenamer/RandomFilenamer.php deleted file mode 100644 index 27ce61ad..00000000 --- a/src/SleepingOwl/RandomFilenamer/RandomFilenamer.php +++ /dev/null @@ -1,27 +0,0 @@ - 'Sleeping Owl administrator', + 'title' => 'Sleeping Owl administrator', /* * Admin url prefix */ - 'prefix' => 'admin', + 'prefix' => 'admin', /* - * Before filters to protect admin from unauthorized users + * Middleware to use in admin routes */ - 'beforeFilters' => ['admin.auth'], + 'middleware' => ['admin.auth'], /* - * Path to admin bootstrap files directory in app directory - * Default: 'app/admin' + * Path to admin bootstrap files directory + * Default: app_path('Admin') */ - 'bootstrapDirectory' => app_path('admin'), + 'bootstrapDirectory' => app_path('Admin'), /* - * Path to images directory - * Default: 'public/images' + * Directory to upload images to (relative to public directory) */ - 'imagesDirectory' => public_path('images'), - - /* - * Path to files directory - * Default: 'public/files' - */ - 'filesDirectory' => public_path('files'), - - /* - * Path to images upload directory within 'imagesDirectory' - * Default: 'uploads' - */ - 'imagesUploadDirectory' => 'uploads', + 'imagesUploadDirectory' => 'images/uploads', /* * Authentication config */ - 'auth' => [ - 'model' => '\SleepingOwl\AdminAuth\Entities\Administrator', + 'auth' => [ + 'model' => '\SleepingOwl\AdminAuth\Entities\Administrator', 'rules' => [ 'username' => 'required', 'password' => 'required', ] ], - /* - * Blade template prefix, default admin:: + /* + * Template to use + */ + 'template' => 'SleepingOwl\Admin\Templates\TemplateDefault', + + /* + * Default date and time formats + */ + 'datetimeFormat' => 'd.m.Y H:i', + 'dateFormat' => 'd.m.Y', + 'timeFormat' => 'H:i', + + /* + * If you want, you can extend ckeditor default configuration + * with this PHP Hash variable. + * + * Checkout http://docs.ckeditor.com/#!/api/CKEDITOR.config for more information. */ - 'bladePrefix' => 'admin::', + 'ckeditor' => [], ]; diff --git a/src/docs/00_Introduction.md b/src/docs/00_Introduction.md deleted file mode 100644 index a95e9e1c..00000000 --- a/src/docs/00_Introduction.md +++ /dev/null @@ -1,33 +0,0 @@ -### Overview - -SleepingOwl Admin is administrative interface builder for Laravel. - -For each model you can define which filters applied in table view, which columns to display, which form elements to display in create and edit forms. - -It includes: - - - [sb-admin-2 template](http://startbootstrap.com/template-overviews/sb-admin-2/) - - [jQuery 1.11.0](http://jquery.org) - - [Bootstrap v3.2.0](http://getbootstrap.com) - - [Bootstrap Multiselect v0.9.8](https://github.com/davidstutz/bootstrap-multiselect) - - [DataTables 1.10.0-dev](http://www.datatables.net) - - [Lightbox for Bootstrap 3](https://github.com/ashleydw/lightbox) - - [Font Awesome 4.1.0](http://fontawesome.io) - - [Metismenu 1.0.3](https://github.com/onokumus/metisMenu) - - [morris.js v0.5.0]() - - [bootbox.js v4.3.0](http://bootboxjs.com) - - [Bootstrap datetimepicker](http://eonasdan.github.io/bootstrap-datetimepicker/) - - [CKEditor](http://ckeditor.com) - -### Installation - -See [installation](Getting_Started/Installation.html). - -### Configuration - -You need to create your admin [menu configuration](Getting_Started/Menu_Configuration.html) and [model configuration](Getting_Started/Model_Configuration.html) for every Eloquent model you want to manage with SleepingOwl Admin. - -### Authentication - -SleepingOwl Admin built with separate authentication module. Default credentials is `admin` / `SleepingOwl`. For details see [authentication documentation](Getting_Started/Authentication.html). - diff --git a/src/docs/01_Getting_Started/00_Installation.md b/src/docs/01_Getting_Started/00_Installation.md deleted file mode 100644 index d1380ebf..00000000 --- a/src/docs/01_Getting_Started/00_Installation.md +++ /dev/null @@ -1,29 +0,0 @@ - 1. Require this package in your composer.json and run composer update (or run `composer require sleeping-owl/admin:2.x` directly): - - ```json - "sleeping-owl/admin": "2.*" - ``` - - 2. After composer update, add service providers to the `config/app.php` - - 'SleepingOwl\Admin\AdminServiceProvider', - 'Illuminate\Html\HtmlServiceProvider', - - 3. Add this to the facades in `config/app.php`: - - 'Admin' => 'SleepingOwl\Admin\Admin', - 'AdminAuth' => 'SleepingOwl\AdminAuth\Facades\AdminAuth', - 'AssetManager' => 'SleepingOwl\Admin\AssetManager\AssetManager', - 'Column' => 'SleepingOwl\Admin\Columns\Column', - 'FormItem' => 'SleepingOwl\Admin\Models\Form\FormItem', - 'ModelItem' => 'SleepingOwl\Admin\Models\ModelItem', - - 'Form' => 'Illuminate\Html\FormFacade', - 'Html' => 'Illuminate\Html\HtmlFacade', - - 4. Run this command in terminal (if you want to know what exactly this command makes, see [install command documentation](../Commands/Install.html)): - - ```bash - $ php artisan admin:install - ``` - 5. All done! Now go to the `/admin` and use default credentials `admin` / `SleepingOwl`. \ No newline at end of file diff --git a/src/docs/01_Getting_Started/01_Configuration.md b/src/docs/01_Getting_Started/01_Configuration.md deleted file mode 100644 index da47f1b2..00000000 --- a/src/docs/01_Getting_Started/01_Configuration.md +++ /dev/null @@ -1,47 +0,0 @@ -[Install command](../Commands/Install.html) publishes SleepingOwl Admin config automatically. If you want to publish config manually you must run this command in terminal: - -```bash -$ php artisan vendor:publish --provider="SleepingOwl\Admin\AdminServiceProvider" --tag="config" -``` - -## Config Attributes - -### title - -String to display in page title and header. - -### prefix - -Url prefix for admin module. - -Default: `admin` - -### beforeFilters - -Filters that protects admin module from unauthorized users - -Default: `['admin.auth']` - -### bootstrapDirectory - -Path to SleepingOwl Admin bootstrap directory. You must place your models configuration, menu configuration, custom columns and form elements there. Every `.php` file in that directory will be included. - -Default: `app_path('admin')` - -### imagesDirectory - -Path to images directory. Images from [image form elements](../Form_Elements/image.html) will be uploaded there. - -Default: `public_path('images')` - -### filesDirectory - -Path to files directory. Files from [file form elements](../Form_Elements/file.html) will be uploaded there. - -Default: `public_path('files')` - -### imagesUploadDirectory - -Path to images upload directory within `imagesDirectory`. CKEditor will upload images there. - -Default: `'uploads'` \ No newline at end of file diff --git a/src/docs/01_Getting_Started/02_Menu_Configuration.md b/src/docs/01_Getting_Started/02_Menu_Configuration.md deleted file mode 100644 index 4fcc0aaa..00000000 --- a/src/docs/01_Getting_Started/02_Menu_Configuration.md +++ /dev/null @@ -1,64 +0,0 @@ -SleepingOwl Admin menu configuration default placement is in `app/admin/menu.php`. - -Here is simple example how your menu configuration might look like: - -``` -Admin::menu()->url('/')->label('Start Page')->icon('fa-dashboard')->uses('\App\HTTP\Controllers\AdminController@getIndex'); -Admin::menu(\App\User::class)->icon('fa-user'); -Admin::menu()->label('Subitems')->icon('fa-book')->items(function () -{ - Admin::menu(\Acme\Models\Bar\User::class)->icon('fa-user'); - Admin::menu(\Acme\Models\Foo::class)->label('my label'); -}); -``` - -### Create Menu Item for Model - -```php -Admin::menu(\Foo\Bar\Model::class) -``` - -If you are running PHP under 5.5 you can use strings: - -```php -Admin::menu('\Foo\Bar\Model') -``` - -Model must be registered in SleepingOwl Admin. For details see [model configuration](Model_Configuration.html). - -Label for this menu item will be model title, but you can provide custom label using `label()` method. - -Url for this item will be a link to the model. - -### Create Menu Item for Custom Controller Action - -```php -Admin::menu()->url('my-url')->uses('\App\HTTP\Controllers\MyController@getAction') -``` - -You must provide url for this item using `url()` and controller action using `uses()`. - -### Set Label - -```php -->label('My Label') -``` - -### Set Icon - -```php -->icon('fa-bank') -``` - -You can use [Font Awesome 4.1.0](http://fontawesome.io) icon classes. - -### Nested Menus - -```php -->items(function() -{ - // ... -}) -``` - -You can create submenus. There is no depth limit. \ No newline at end of file diff --git a/src/docs/01_Getting_Started/03_Model_Configuration.md b/src/docs/01_Getting_Started/03_Model_Configuration.md deleted file mode 100644 index 43fe5482..00000000 --- a/src/docs/01_Getting_Started/03_Model_Configuration.md +++ /dev/null @@ -1,173 +0,0 @@ -SleepingOwl Admin model configurations must be stored within `bootstrapDirectory` (*default: `app/admin`*). - -You can store all your model configurations in one file or split it as you want. - -Here is example how your model configuration might look like: - -```php -Admin::model(\App\District::class) - ->title('City Districts') - ->with('streets', 'schools', 'city') - ->filters(function () -{ - ModelItem::filter('city_id')->title()->from(\App\City:class); -}) - ->columns(function () -{ - Column::string('title', 'Title'); - Column::string('city.title', 'City') - ->append(Column::filter('city_id')->value('city.id')); - Column::string('stub', 'Url stub'); - Column::count('streets', 'Streets') - ->append(Column::filter('district_id')->model(\App\Street::class)); -}) - ->form(function () -{ - FormItem::text('title', 'Title'); - FormItem::text('url', 'Url stub'); - FormItem::text('zoom', 'Zoom level'); - FormItem::text('latitude', 'Center (latitude)'); - FormItem::text('longitude', 'Center (longitude)'); - FormItem::view('admin.districts.my_custom_view_with_script'); -}); -``` - -### Provide Model - -```php -Admin::model(\Foo\Bar\Model::class) -``` - -Or if you are running PHP under 5.5 you can use strings: - -```php -Admin::model('\Foo\Bar\Model') -``` - -### Set Title - -```php -->title('My Model Title') -``` - -Title will be displayed in headers and menu label. - -### Set Alias - -```php -->as('districts') -``` - -Alias will be used in urls. Default alias is lowercase plural form of model class. - -### Set Async mode - -```php -->async() -``` - -You can enable async mode (default is disabled). - -### Each Column Filter - -```php -->columnFilter() -``` - -This will add filter input field at the bottom of each column that will filter only this column values. - -### Eager Loading - -```php -->with('city', 'schools') -``` - -Or you can provide arguments as an array: - -```php -->with(['city', 'schools']) -``` - -Model will be loaded with this relations. - -### Restrict Creating - -You can deny creating new entities at all: - -```php -->denyCreating() -``` - -or provide a callback to decide: - -```php -->denyCreating(function () -{ - return (date('d') <= 15); // deny creating in first 15 days of month -}) -``` - -### Restrict Editing and Deleting - -You can deny editing and/or deleting at all: - -```php -->denyEditing() -``` - -```php -->denyDeleting() -``` - -```php -->denyEditingAndDeleting() -``` - -or provide a callback to decide: - -```php -->denyEditing(function ($instance) -{ - return ($instance->title === 'Dont edit this'); // deny editing of entities by condition -}) -``` - -```php -->denyEditingAndDeleting(function ($instance) -{ - return ($instance->id == 1); -}) -``` - -### Filters - -```php -->filters(function () -{ - // create filters for this model here -}) -``` - -For details see [filters](../Filters/Overview.html). - -### Columns - -```php -->columns(function () -{ - // create columns for this model here -}) -``` - -For details see [columns](../Columns/Overview.html). - -### Form - -```php -->form(function () -{ - // create form for this model here -}) -``` - -For details see [form elements](../Form_Elements/Overview.html). \ No newline at end of file diff --git a/src/docs/01_Getting_Started/04_Authentication.md b/src/docs/01_Getting_Started/04_Authentication.md deleted file mode 100644 index 36eb59bf..00000000 --- a/src/docs/01_Getting_Started/04_Authentication.md +++ /dev/null @@ -1,15 +0,0 @@ -SleepingOwl Admin uses own authentication method. You can use native laravel authentication or any other in your frontend. - -Administrators separated from any other users of your website and stores in `administrators` database table. Any administrator can access admin module, but nobody else. - -### Default Credentials - -Default username/password is `admin` / `SleepingOwl`. - -### Manage Administrators - -You can manage your administrators with [administrators command](../Commands/Administrators.html). - -### Logined Administrator - -You can get current logined administrator using `AdminAuth::user()`. \ No newline at end of file diff --git a/src/docs/01_Getting_Started/05_Validation.md b/src/docs/01_Getting_Started/05_Validation.md deleted file mode 100644 index 5a4c4cda..00000000 --- a/src/docs/01_Getting_Started/05_Validation.md +++ /dev/null @@ -1,30 +0,0 @@ -There is two easy ways to perform validation in your models, you can combine them if you want. And there is one hard way. First of all you must extend your models from `SleepingOwl\Models\SleepingOwlModel`. - -## Easy Ways - -### 1. In Form Elements - -You can add validation rules to your form elements: - -```php -FormItem::text('title')->required()->unique()->validationRule('my-custom-rule') -``` - -`required()` accepts one parameter: `true` if required only on create, `false` if always required. No parameter equals `false`. - -Use `unique()` to set this field to be unique in this model. - -You can use `validationRule($rule)` to add any rule you want. You can use pipe delimiter `|`. - -### 2. In Your Model - -You can implement `public function getValidationRules()` method in your model, that must return validation rules, and thats all. - -## Hard Way - -The other way is to implement `SleepingOwl\Models\Interfaces\ValidationModelInterface` interface. It declares 2 methods: `validate($data)` and `getValidationRules()`. You must manually write validation there. If validation fails method must throw `SleepingOwl\Admin\Exceptions\ValidationException`. - -## New Validation Rules - - - `url_stub` – check if field is valid url stub (without slashes) - - `url_stub_full` – check if field is valid url stub (with slashes) \ No newline at end of file diff --git a/src/docs/01_Getting_Started/06_Localization.md b/src/docs/01_Getting_Started/06_Localization.md deleted file mode 100644 index 95508155..00000000 --- a/src/docs/01_Getting_Started/06_Localization.md +++ /dev/null @@ -1,10 +0,0 @@ -SleepingOwl Admin uses locale from your `app.php` locale configuration. - -###Supported Locales - - - en - - ru - -### Your Own Locales - -You can add your localization. Just create file `resources/lang/packages/{your_locale}/admin/lang.php`, paste everything from `vendor/sleeping-owl/admin/src/lang/en/lang.php` and make your changes. Feel free to send me your locale to add it to the main branch. \ No newline at end of file diff --git a/src/docs/03_Commands/00_Install.md b/src/docs/03_Commands/00_Install.md deleted file mode 100644 index c8a65765..00000000 --- a/src/docs/03_Commands/00_Install.md +++ /dev/null @@ -1,26 +0,0 @@ -Use this command to run initial configuration of SleepingOwl Admin. It creates all necessary files and directories. - -### Usage - -```bash -$ php artisan admin:install --title="My Admin Title" -``` - -### Options - -#### --title - -Set title for your admin model. For details see [configuration](../Getting_Started/Configuration.html). - -### What It Does - - - Publish migration for `administrator` table, migrate database and seed by default administrator (*username: `admin`, password: `SleepingOwl`*). - - Publish [Intervention Imagecache](http://image.intervention.io/) config and set its route to `img/cache`. - - Publish SleepingOwl Admin config and set title. - - Publish SleepingOwl Admin assets. - - Create bootstrap directory. - - Create initial menu configuration file. - - Create initial bootstrap file. - - Create dummy user file (*as example*). - - Create structure for public directory (*create `images`, `files` and `images/uploads` directories*). - \ No newline at end of file diff --git a/src/docs/03_Commands/01_Model_Configuration_Generation.md b/src/docs/03_Commands/01_Model_Configuration_Generation.md deleted file mode 100644 index ffd90c82..00000000 --- a/src/docs/03_Commands/01_Model_Configuration_Generation.md +++ /dev/null @@ -1,53 +0,0 @@ -Use this command to create new model configuration. For details see [model configuration](../Getting_Started/Model_Configuration.html). - -You can specify model title and columns for table view. Form elements will be grabbed from your model table structure. - -### Usage - -```bash -$ php artisan admin:model "\Foo\MyModel" --title="My Model Title" --columns="title, image, date, entries" -``` -```bash -$ php artisan admin:model Foo/MyModel --columns="title,image,date,entries" -``` - -### Arguments - -#### modelClass - -Provide full model class name with namespace. You can write it in quotes with backslash or without quotes with forward slash. - -### Options - -#### --title - -Set title for your model. - -#### --columns - -Comma-separated list of all columns in table view. Type of columns will be guessed from your model. - -### What It Does - -This command creates new file with model configuration within `bootstrapDirectory`, called `{modelClass}.php`. Eager relations, column types, filters and form elements will be guessed from provided data, your model class and database structure. - -### Column Type Guesser - - - [image](../Columns/image.html) – if model implements `ModelWithImageFieldsInterface` and this column marked as image field. See details in [Model With Image Fields](../Models/With_Image_Fields.html). - - [count](../Columns/count.html) – if model has relation `has-many` on this field. - - [lists](../Columns/lists.html) – if model has relation `belongs-to-many` on this field (*you must provide field to display in list, e.g. `entries.title`, where `entries` is you eager relation*). - - [date](../Columns/date.html) – if this column has `date`, `time` or `timestamp` type in database. - - [string](../Columns/string.html) – in other cases. - -### Form Element Guesser - - - [image](../Form_Elements/image.html) – if model implements `ModelWithImageFieldsInterface` and this field marked as image field. See details in [Model With Image Fields](../Models/With_Image_Fields.html). - - [file](../Form_Elements/file.html) – if model implements `ModelWithFileFieldsInterface` and this field marked as file field. See details in [Model With File Fields](../Models/With_File_Fields.html). - - [select](../Form_Elements/select.html) – if model has `belongs-to` relation on this field or this field is enum. - - [text](../Form_Elements/text.html) – if field type in database is `varchar`, `int` or `float`. - - [ckeditor](../Form_Elements/ckeditor.html) – if field type in database is `text`. - - [checkbox](../Form_Elements/checkbox.html) – if field type in database is `boolean` (*`tinyint(1)`*). - - [date](../Form_Elements/date.html) – if field type in database is `date`. - - [time](../Form_Elements/time.html) – if field type in database is `time`. - - [timestamp](../Form_Elements/timestamp.html) – if field type in database is `timestamp`. - diff --git a/src/docs/03_Commands/02_Administrators.md b/src/docs/03_Commands/02_Administrators.md deleted file mode 100644 index 9b60dc96..00000000 --- a/src/docs/03_Commands/02_Administrators.md +++ /dev/null @@ -1,27 +0,0 @@ -Use this command to show administrators list, create new administrator or delete existing one. - -### Usage - -Display administrators list: - -```bash -$ php artisan admin:administrators -``` - -Create new administrator: - -```bash -$ php artisan admin:administrators --new -``` - -Change password for administrator: - -```bash -$ php artisan admin:administrators --password -``` - -Delete existing administrator: - -```bash -$ php artisan admin:administrators --delete -``` \ No newline at end of file diff --git a/src/docs/03_Models/00_SleepingOwlModel.md b/src/docs/03_Models/00_SleepingOwlModel.md deleted file mode 100644 index 6ce982f9..00000000 --- a/src/docs/03_Models/00_SleepingOwlModel.md +++ /dev/null @@ -1,55 +0,0 @@ -Your models can extend `SleepingOwl\Models\SleepingOwlModel`. It gives you some benefits: - -### Validation - -Validation method included. You dont need to implement it by yourself. For details see [validation](../Getting_Started/Validation.html). - -### Default Order - -Override `scopeDefaultSort($query)` to set your own default sort for this model. - -```php -class Person extends SleepingOwlModel -{ - public function scopeDefaultSort($query) - { - return $query->orderBy('last_name', 'asc'); - } -} -``` - -Now you can use - -```php -Person::all() -``` - -and results will be ordered by last name. - -If you want to override order you can use - -```php -Person::withoutOrders() -``` - -to get query builder without default order. - -### Random Entity - -```php -Person::random() -``` - -Returns random entity. - -### Delete All - -You can delete all entities with your deletion logic (*deleting stored images, files or related entities*). - -```php -MyModel::deleteAll() -``` - -### Supported Date Formats - -Eloquent cant automatically parse custom date format into database date format. If your class extends `SleepingOwlModel` you can use any date format PHP supports. \ No newline at end of file diff --git a/src/docs/03_Models/01_With_Image_Fields.md b/src/docs/03_Models/01_With_Image_Fields.md deleted file mode 100644 index d745cc40..00000000 --- a/src/docs/03_Models/01_With_Image_Fields.md +++ /dev/null @@ -1,66 +0,0 @@ -If you want to use SleepingOwl Admin image column or form element you must prepare your model: - - Implement `SleepingOwl\Models\Interfaces\ModelWithImageFieldsInterface` in your model. - - Add `SleepingOwl\Models\Traits\ModelWithImageOrFileFieldsTrait` trait (*if your model extends `SleepingOwlModel` you dont have to add the trait*). - - Add `public function getImageFields()`. - -### Example - -```php - 'monuments/', - 'photo' => '', - 'other' => ['other_images/', function($directory, $originalName, $extension) - { - return $originalName; - }] - ]; - } -} -``` - -### Provide Image Fields - -`getImageFields()` must return array, where keys is model image fields and values is path to directory within `imagesDirectory` (*see [configuration](../Getting_Started/Configuration.html)*). - -If path is empty images will be stored in `imagesDirectory`. - -### Custom File Naming Function - -Array value can be either string or array: - -- `string` — directory to upload images to, filename generates randomly. -- `array` — first item in array is directory to upload images to, second item is naming function closure (`function($directory, $originalName, $extension){}`). Closure must return new filename for the uploaded file. - - `$directory` — absolute path to the upload directory - - `$originalName` — uploaded file original name - - `$extension` — uploaded file extension - -### Field Usage - -Accessing fields of your model - -```php -$monument->image -``` - -will return instance of `SleepingOwl\Models\Attributes\Image`. - -You can use - -```php -$monument->image->thumbnail('original') -``` - -to get frontend url to image with original size. - -You can create your own image resizing templates in `app/config/packages/intervention/imagecache/config.php`. For details see [Intervention Imagecache](http://image.intervention.io/). \ No newline at end of file diff --git a/src/docs/03_Models/02_With_File_Fields.md b/src/docs/03_Models/02_With_File_Fields.md deleted file mode 100644 index 05091b87..00000000 --- a/src/docs/03_Models/02_With_File_Fields.md +++ /dev/null @@ -1,63 +0,0 @@ -If you want to use SleepingOwl Admin file form element you must prepare your model: - - Implement `SleepingOwl\Models\Interfaces\ModelWithFileFieldsInterface` in your model. - - Add `SleepingOwl\Models\Traits\ModelWithImageOrFileFieldsTrait` trait (*if your model extends `SleepingOwlModel` you dont have to add the trait*). - - Add `public function getFileFields()`. - -### Example - -```php - 'documents/', - 'other' => ['other_files/', function($directory, $originalName, $extension) - { - return $originalName; - }] - ]; - } -} -``` - -### Provide File Fields - -`getFileFields()` must return array, where keys is model file fields and values is path to directory within `filesDirectory` (*see [configuration](../Getting_Started/Configuration.html)*). - -If path is empty files will be stored in `filesDirectory`. - -### Custom File Naming Function - -Array value can be either string or array: - -- `string` — directory to upload files to, filename generates randomly. -- `array` — first item in array is directory to upload files to, second item is naming function closure (`function($directory, $originalName, $extension){}`). Closure must return new filename for the uploaded file. - - `$directory` — absolute path to the upload directory - - `$originalName` — uploaded file original name - - `$extension` — uploaded file extension - -### Field Usage - -Accessing fields of your model - -```php -$document->file -``` - -will return instance of `SleepingOwl\Models\Attributes\File`. - -You can use - -```php -$document->file->link() -``` - -to get frontend url to file. \ No newline at end of file diff --git a/src/docs/03_Models/03_Orderable_Model.md b/src/docs/03_Models/03_Orderable_Model.md deleted file mode 100644 index f6def911..00000000 --- a/src/docs/03_Models/03_Orderable_Model.md +++ /dev/null @@ -1,27 +0,0 @@ -Orderable model — model, that contains integer field that represents order of entities. - -You can add ↑ and ↓ buttons to table view to move entities up and down. - -### How To Make Your Orderable Model - - - Implement `SleepingOwl\Models\Interfaces\ModelWithOrderFieldInterface` interface in your model. - - Add `SleepingOwl\Models\Traits\ModelWithOrderFieldTrait` trait. - - Default order field name is `sort`. If you have other name add `getSortField()` method to your model. - -### Example - -```php -use SleepingOwl\Models\SleepingOwlModel; -use SleepingOwl\Models\Interfaces\ModelWithOrderFieldInterface; -use SleepingOwl\Models\Traits\ModelWithOrderFieldTrait; - -class Category extends SleepingOwlModel implements ModelWithOrderFieldInterface -{ - use ModelWithOrderFieldTrait; - - public function getSortField() - { - return 'sort_field'; - } -} -``` \ No newline at end of file diff --git a/src/docs/04_Routes.md b/src/docs/04_Routes.md deleted file mode 100644 index 0334d43f..00000000 --- a/src/docs/04_Routes.md +++ /dev/null @@ -1,25 +0,0 @@ -SleepingOwl admin module creates RESTful-style controller for your models. - -Additional routes, that will be registered (*you could use it in your code as well if you need*): - -URI | Method | Name ---------------------------- | :----: | ----------------------- -admin/login | get | sleeping-owl-admin.login -admin/login | post | sleeping-owl-admin.login.post -admin/logout | get | sleeping-owl-admin.logout -admin | get | sleeping-owl-admin.home -admin/{model} | get | sleeping-owl-admin.table.table -admin/{model}/create | get | sleeping-owl-admin.table.create -admin/{model} | post | sleeping-owl-admin.table.store -admin/{model}/{id}/edit | get | sleeping-owl-admin.table.edit -admin/{model}/{id}/update | put | sleeping-owl-admin.table.update -admin/{model}/{id} | delete | sleeping-owl-admin.table.destroy -admin/{model}/{id}/moveup | patch | sleeping-owl-admin.table.moveup -admin/{model}/{id}/movedown | patch | sleeping-owl-admin.table.movedown -admin/js/{locale}/lang.js | get | sleeping-owl-admin.lang -images/all | get |   -images/upload | post |   - - - *All routes, except `admin/login` and `admin/logout`, use before filter (`admin.auth` is default).* - - *All routes with `post`, `put`, `patch`, `delete` methods have `csrf` before filter.* - - *You can change url prefix in config (`admin` is default). See [configuration page](Getting_Started/Configuration.html).* diff --git a/src/docs/05_FIlters/00_Overview.md b/src/docs/05_FIlters/00_Overview.md deleted file mode 100644 index 35ddc36c..00000000 --- a/src/docs/05_FIlters/00_Overview.md +++ /dev/null @@ -1,34 +0,0 @@ -### Filter by Field - - -```php -ModelItem::filter('article_category_id') -``` - -Creates filter by `article_category_id` field. You can add `?article_category_id=5` parameter to the query to filter by field. - -### Filter Alias - -```php -ModelItem::filter('article_category_id')->as('category') -``` - -Creates filter by `article_category_id` field, but searches for `category` parameter in query. You can add `?category=5` parameter to the query to filter by field. - -### Apply Scope - -```php -ModelItem::filter('withEmptyCategories')->scope('withoutCategories') -``` - -This will apply scope `withoutCategories` (*`scopeWithoutCategories($query)` in model*) to the query. - -### Override Query Parameter - -```php -ModelItem::filter('title')->as('todo')->value('TODO category') -``` - -Creates filter by `title` field with `todo` alias. It ignores parameter value from query and overrides it with `'TODO category'`. - -**Important:** query parameter must have value. You can\`t access this filter using `categories?todo`, but `categories?todo=1` or `categories?todo=something_else` will work. \ No newline at end of file diff --git a/src/docs/05_FIlters/01_Filter_Title.md b/src/docs/05_FIlters/01_Filter_Title.md deleted file mode 100644 index 552a8331..00000000 --- a/src/docs/05_FIlters/01_Filter_Title.md +++ /dev/null @@ -1,23 +0,0 @@ -Filter title displays as page subtitle when applied. - -### Static Title - -```php -ModelItem::filter('category_id')->title('with category filter') -``` - -### Load Title from Model - -```php -ModelItem::filter('category_id')->title()->from(Category::class) -``` - -It will load `Category` model by provided in query parameter value as id. Field to display as a title is `'title'`. - -### Load Title from Model Custom Field - -```php -ModelItem::filter('category_id')->title()->from(Category::class, 'label') -``` - -Default field to display is `'title'`, but you can provide your own. \ No newline at end of file diff --git a/src/docs/06_Columns/00_Overview.md b/src/docs/06_Columns/00_Overview.md deleted file mode 100644 index d101c4c6..00000000 --- a/src/docs/06_Columns/00_Overview.md +++ /dev/null @@ -1,34 +0,0 @@ -```php -Column::{type}('{field name}', '{column label}') -``` - -Creates new column and adds it to the current model configuration. - -### Supported Types - - - [string](string.html) - - [lists](lists.html) - - [count](count.html) - - [image](image.html) - - [date](date.html) - - [action](action.html) - -### Register Custom Type - -See [custom columns](Custom_Columns.html). - -### Restrict Column Sort - -```php -Column::string('my_field')->sortable(false) -``` - -### Mark Column as Default Sortable - -```php -Column::string('title')->sortableDefault() -``` - -### Column Appendants - -See [column appendants](Column_Appendants.html). \ No newline at end of file diff --git a/src/docs/06_Columns/01_Column_Appendants.md b/src/docs/06_Columns/01_Column_Appendants.md deleted file mode 100644 index 3630c83c..00000000 --- a/src/docs/06_Columns/01_Column_Appendants.md +++ /dev/null @@ -1,41 +0,0 @@ -## Filter - -### Filter Appendant - -```php -Column::filter('{filter_alias}')->model(\Foo\Model::class)->value('{field to grab filter value from}') -``` - -It will add filter button to every column cell, that links to model table view filter. - -### Filter Appendant in current Model - -```php -Column::filter('{filter_alias}'))->value('{field to grab filter value from}') -``` - -### Example - -```php -Column::string('category.title', 'Category')->append( - Column::filter('category_id')->value('category.id') -) -``` - ----------- - -## Url - -```php -Column::url('{field to grab url from}') -``` - -It Will add button to every column cell, that links to provided in model field url. - -### Example - -```php -Column::string('url', 'Url')->append( - Column::url('full_url) -) -``` \ No newline at end of file diff --git a/src/docs/06_Columns/02_Custom_Columns.md b/src/docs/06_Columns/02_Custom_Columns.md deleted file mode 100644 index 9e3897d5..00000000 --- a/src/docs/06_Columns/02_Custom_Columns.md +++ /dev/null @@ -1,88 +0,0 @@ -You can register your own column types in `bootstrap.php` file within `bootstrapDirectory` (*default is `app/admin/bootstrap.php`*). - -```php -Column::register('{type}', \Foo\Bar\MyColumn::class) -``` - -Your class must implement `SleepingOwl\Admin\Columns\Interfaces\ColumnInterface` or extend `SleepingOwl\Admin\Columns\Column\BaseColumn` class. - -### Example - -bootstrap.php - -```php -Column::register('yesNo', \Acme\YesNoColumn::class) -``` - -#### 1. Acme/YesNoColumn.php using interface implementation - -```php -use SleepingOwl\Admin\Columns\Interfaces\ColumnInterface; - -class YesNoColumn implements ColumnInterface -{ - - public function renderHeader() - { - return 'Yes/no'; - } - - public function render($instance, $totalCount) - { - $content = ($instance->bool) ? 'yes' : 'no'; - return '' . $content . ''; - } - - public function getName() - { - return 'columng-name'; - } - - public function isHidden() - { - // return false to display this column - // return true to hide this column (used for column appendants) - return false; - } - - public function myCustomMethod() - { - } - -} -``` - -Usage in model configuration - -```php -->columns(function () -{ - Column::yesNo()->myCustomMethod(); -}) -``` - -#### 2. Acme/YesNoColumn.php using BaseColumn extend - -```php -use SleepingOwl\Admin\Columns\Column\BaseColumn; - -class YesNoColumn extends BaseColumn -{ - - public function render($instance, $totalCount) - { - $content = ($instance->{$this->name}) ? 'yes' : 'no'; - return parent::render($instance, $totalCount, $content); - } - -} -``` - -Usage in model configuration - -```php -->columns(function () -{ - Column::yesNo('bool', 'Label')->sortable(false); -}) -``` diff --git a/src/docs/06_Columns/03_string.md b/src/docs/06_Columns/03_string.md deleted file mode 100644 index 9224655a..00000000 --- a/src/docs/06_Columns/03_string.md +++ /dev/null @@ -1,37 +0,0 @@ -Cell content will be simple field value from your model or one of related models. - -```php -Column::string('{field name}', '{column label}') -``` - -### Field Name - -Field name can be one of the following: - - - Field from your model (from database or using mutators). - - ```php - Column::string('title') - ``` - - ```php - Column::string('url') - ``` - - - Field from your model relations - - ```php - Column::string('category.title') // category() creates belongs-to relation - ``` - - ```php - Column::string('city.state.title') // you can use nested relations - ``` - -### Order by Custom Value - -```php -Column::string('full_name')->orderBy('last_name') -``` - -Displays `full_name` as cell content, but orders by `last_name`. \ No newline at end of file diff --git a/src/docs/06_Columns/04_lists.md b/src/docs/06_Columns/04_lists.md deleted file mode 100644 index 6b4b6101..00000000 --- a/src/docs/06_Columns/04_lists.md +++ /dev/null @@ -1,9 +0,0 @@ -Cell content will be list of related models. Used in `many-to-many` relations. - -```php -Column::lists('categories.title', 'Categories') -``` - -It will display list of all category titles associated with current entity. - -`categories()` must create `belongs-to-many` relation in this case. \ No newline at end of file diff --git a/src/docs/06_Columns/05_count.md b/src/docs/06_Columns/05_count.md deleted file mode 100644 index 1c501825..00000000 --- a/src/docs/06_Columns/05_count.md +++ /dev/null @@ -1,13 +0,0 @@ -Cell content will be count of related models. Used in `has-many` relations. - -```php -Column::count('images') -``` - -```php -Column::count('images')->append( - Column::filter('school_id')->model(SchoolImage::class) -) -``` - -`images()` must create `has-many` relation in this case. \ No newline at end of file diff --git a/src/docs/06_Columns/06_image.md b/src/docs/06_Columns/06_image.md deleted file mode 100644 index 780a0e55..00000000 --- a/src/docs/06_Columns/06_image.md +++ /dev/null @@ -1,9 +0,0 @@ -Cell content will be an image thumbnail. - -```php -Column::image('photo') -``` - -`photo` must be marked as image field in your model. For details see [models with image fields](../Models/With_Image_Fields.html). - -Image columns can\`t be sortable. \ No newline at end of file diff --git a/src/docs/06_Columns/07_date.md b/src/docs/06_Columns/07_date.md deleted file mode 100644 index ca9d792b..00000000 --- a/src/docs/06_Columns/07_date.md +++ /dev/null @@ -1,30 +0,0 @@ -Cell content will be date or time value. - -```php -Column::date('{field}') -``` - -**Important**: you must have [intl](http://php.net/manual/en/book.intl.php) php extension installed to use this column. - -### Format Date and Time - -```php -Column::date('created_at')->format('{date format}', '{time format}') -``` - -```php -Column::date('created_at')->formatDate('{date format}') -``` - -```php -Column::date('created_at')->formatTime('{time format}') -``` - -Supported date and time formats: - - - none - - full - - long - - medium - - short - diff --git a/src/docs/06_Columns/08_action.md b/src/docs/06_Columns/08_action.md deleted file mode 100644 index 47e45240..00000000 --- a/src/docs/06_Columns/08_action.md +++ /dev/null @@ -1,72 +0,0 @@ -Cell content will be button with custom action. - -```php -Column::action('{name}', '{label}') -``` - -### Button Styling - -You can specify icon class to use (from FontAwesome): - -```php -Column::action('show', 'Label')->icon('fa-globe') -``` - -2 styles are available: `short` and `long` - -```php - # This will create button without label, only with icon. Label will popup on hover. -Column::action('show', 'Label')->icon('fa-globe')->style('short') - - # This will create button with icon and label -Column::action('show', 'Label')->icon('fa-globe')->style('long') -``` - -**Defaults:** default style is `long` without icon. - -### Button Target - -You can specify target for button: - -```php -Column::action('show', 'Label')->url('http://test.com/:id')->target('_blank') -``` - -### URL Usage - -You can specify url for button, `:id` will be replaced for the clicked row id: - -```php -Column::action('show', 'Label')->url('http://test.com/:id') -``` - -or you can provide callback to generate url: - -```php -Column::action('show', 'Label')->url(function ($instance) -{ - return URL::route('my-route', [$instance->id]); -}) -``` - -### Custom Actions Usage - -Use `->callback()` method to set custom action: - -```php -Column::action('show', 'Label')->callback(function ($instance) -{ - # Any code you want -}) -``` - -Closure can return redirect: - -```php -Column::action('show', 'Label')->callback(function ($instance) -{ - return Redirect::route('my-route', [$instance->id]); -}) -``` - -*Note:* If there is no return statement in your closure user will be redirected back. \ No newline at end of file diff --git a/src/docs/07_Form_Elements/00_Overview.md b/src/docs/07_Form_Elements/00_Overview.md deleted file mode 100644 index 7f6b644a..00000000 --- a/src/docs/07_Form_Elements/00_Overview.md +++ /dev/null @@ -1,41 +0,0 @@ -```php -FormItem::{type}('{field name}', '{label}') -``` - -Creates new form element and adds it to the current model configuration. - -### Supported Types - - - [text](text.html) - - [textAddon](textAddon.html) - - [checkbox](checkbox.html) - - [date](date.html) - - [time](time.html) - - [timestamp](timestamp.html) - - [file](file.html) - - [image](image.html) - - [select](select.html) - - [multiSelect](multiSelect.html) - - [textarea](textarea.html) - - [ckeditor](ckeditor.html) - - [view](view.html) - -### Validation - -```php -FormItem::text('title')->required()->unique()->validationRule('my-custom-rule') -``` - -See [details](../Getting_Started/Validation.html) about validation. - -### Custom HTML attributes - -You can add custom html attributes to the form element. - -```php -FormItem::text('title')->attributes(['class' => 'my-class', 'my-attribute' => 1]) -``` - -### Register Custom Type - -See [custom form elements](Custom_Form_Elements.html). \ No newline at end of file diff --git a/src/docs/07_Form_Elements/01_Custom_Form_Elements.md b/src/docs/07_Form_Elements/01_Custom_Form_Elements.md deleted file mode 100644 index 72430aaf..00000000 --- a/src/docs/07_Form_Elements/01_Custom_Form_Elements.md +++ /dev/null @@ -1,113 +0,0 @@ -You can register your own form elements in `bootstrap.php` file within `bootstrapDirectory` (*default is `app/admin/bootstrap.php`*). - -```php -FormItem::register('{type}', \Foo\Bar\MyColumn::class) -``` - -Your class must implement `SleepingOwl\Admin\Models\Form\Interfaces\FormItemInterface`. - -```php -FormItem::register('{type}', function ($instance) -{ - // implement your form element code here - if ($instance->exists) - { - // creating form - } else - { - // editing form - } - return 'my element'; -}) -``` - -### Adding Custom Scripts and Styles - -You can add custom scripts and styles to the page header, that uses your custom form element. - -```php -FormItem::register('my', function ($instance) -{ - AssetManager::addScript(URL::asset('js/my.js')); - AssetManager::addScript('//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js'); - AssetManager::addStyle(URL::asset('css/my.css')); - - return 'anything'; -}) -``` - -### Example using Closure - -bootstrap.php - -```php -FormItem::register('myItem', function ($instance) -{ - if ($instance->exists) - { - return 'You are creating new entity.'; - } else - { - return 'You are editing existing entity.'; - } -}) -``` - -Usage in model configuration - -```php -->form(function () -{ - FormItem::myItem(); -}) -``` - -You can\`t provide additional data to your form element using closure. If you want more flexible solution - use classes instead. - -### Example using Class - -bootstrap.php - -```php -FormItem::register('myItem', \Acme\MyItem::class) -``` - -Acme/MyItem.php - -```php -use SleepingOwl\Admin\Models\Form\Interfaces\FormItemInterface; - -class MyItem implements FormItemInterface -{ - - protected $label; - - public function render() - { - $instance = Admin::instance()->formBuilder->getModel(); - if ($instance->exists) - { - return "You are creating new {$this->label}."; - } else - { - return "You are editing existing {$this->label}."; - } - } - - public function setLabel($label) - { - $this->label = $label; - return $this; - } - -} -``` - -Usage in model configuration - -```php -->form(function () -{ - FormItem::myItem()->setLabel('category'); -}) -``` \ No newline at end of file diff --git a/src/docs/07_Form_Elements/02_text.md b/src/docs/07_Form_Elements/02_text.md deleted file mode 100644 index 67032ae9..00000000 --- a/src/docs/07_Form_Elements/02_text.md +++ /dev/null @@ -1,7 +0,0 @@ -Creates text input. - -```php -FormItem::text('title', 'Title') -``` - -![](/img/text.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/03_textAddon.md b/src/docs/07_Form_Elements/03_textAddon.md deleted file mode 100644 index c7dc75d6..00000000 --- a/src/docs/07_Form_Elements/03_textAddon.md +++ /dev/null @@ -1,16 +0,0 @@ -Creates text input with addon in front or end. - -Default placement is `before`. - -```php -FormItem::textAddon('url', 'Url')->addon('http://my-site.com/')->placement('before') -``` - -![](/img/text_addon.png) - - -```php -FormItem::textAddon('price', 'Price')->addon('$')->placement('after') -``` - -![](/img/text_addon_after.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/04_checkbox.md b/src/docs/07_Form_Elements/04_checkbox.md deleted file mode 100644 index 2314b394..00000000 --- a/src/docs/07_Form_Elements/04_checkbox.md +++ /dev/null @@ -1,7 +0,0 @@ -Creates checkbox with label. - -```php -FormItem::checkbox('active', 'Active') -``` - -![](/img/checkbox.png) diff --git a/src/docs/07_Form_Elements/05_date.md b/src/docs/07_Form_Elements/05_date.md deleted file mode 100644 index a13192a9..00000000 --- a/src/docs/07_Form_Elements/05_date.md +++ /dev/null @@ -1,14 +0,0 @@ -Creates date input. - -```php -FormItem::date('date', 'Date') -``` - -**Important**: you must have [intl](http://php.net/manual/en/book.intl.php) php extension installed to use this form element. - - -![](/img/date.png) - -### Opened State - -![](/img/date_opened.png) diff --git a/src/docs/07_Form_Elements/06_time.md b/src/docs/07_Form_Elements/06_time.md deleted file mode 100644 index 0e2deda2..00000000 --- a/src/docs/07_Form_Elements/06_time.md +++ /dev/null @@ -1,21 +0,0 @@ -Creates time input. - -```php -FormItem::time('time', 'Time') -``` - -**Important**: you must have [intl](http://php.net/manual/en/book.intl.php) php extension installed to use this form element. - -![](/img/time.png) - -### Opened State - -![](/img/time_opened.png) - -### Display Seconds - -```php -FormItem::time('time', 'Time')->seconds(true) -``` - -![](/img/time_with_seconds.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/07_timestamp.md b/src/docs/07_Form_Elements/07_timestamp.md deleted file mode 100644 index fe12c9c8..00000000 --- a/src/docs/07_Form_Elements/07_timestamp.md +++ /dev/null @@ -1,21 +0,0 @@ -Creates time input. - -```php -FormItem::timestamp('timestamp', 'DateTime') -``` - -**Important**: you must have [intl](http://php.net/manual/en/book.intl.php) php extension installed to use this form element. - -![](/img/timestamp.png) - -### Opened State - -![](/img/timestamp_opened.png) - -### Display Seconds - -```php -FormItem::timestamp('timestamp', 'DateTime')->seconds(true) -``` - -![](/img/timestamp_with_seconds.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/08_file.md b/src/docs/07_Form_Elements/08_file.md deleted file mode 100644 index b1f4d61a..00000000 --- a/src/docs/07_Form_Elements/08_file.md +++ /dev/null @@ -1,7 +0,0 @@ -Creates file input. Your model must mark this field as file. For details see [model with file fields](../Models/With_File_Fields.html). - -```php -FormItem::file('file', 'File') -``` - -![](/img/file.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/09_image.md b/src/docs/07_Form_Elements/09_image.md deleted file mode 100644 index fc95e0a6..00000000 --- a/src/docs/07_Form_Elements/09_image.md +++ /dev/null @@ -1,9 +0,0 @@ -Creates image file input. Your model must mark this field as image. For details see [model with image fields](../Models/With_Image_Fields.html). - -```php -FormItem::image('image', 'Image') -``` - -![](/img/image.png) - -![](/img/image_uploaded.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/10_select.md b/src/docs/07_Form_Elements/10_select.md deleted file mode 100644 index 2428e16c..00000000 --- a/src/docs/07_Form_Elements/10_select.md +++ /dev/null @@ -1,32 +0,0 @@ -Creates select input. - -```php -FormItem::select('category_id', 'Category') -``` - -### Providing Data - -With array: - -```php -->list(['First', 'Second', 'Third]) -``` - -With enum (use array values as keys): - -```php -->enum(['First', 'Second', 'Third]) -``` - -With class: - -```php -->list(\Foo\MyModel::class) -``` - -`MyModel` must implement `public static function getList()` and return array. - - -![](/img/select.png) - -![](/img/select_opened.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/11_multiSelect.md b/src/docs/07_Form_Elements/11_multiSelect.md deleted file mode 100644 index e96ac46e..00000000 --- a/src/docs/07_Form_Elements/11_multiSelect.md +++ /dev/null @@ -1,52 +0,0 @@ -Creates multiple select input. - -```php -FormItem::multiSelect('categories', 'Categories') -``` - -### Providing Data - -With array: - -```php -->list(['First', 'Second', 'Third]) -``` - -With enum (use array values as keys): - -```php -->enum(['First', 'Second', 'Third]) -``` - -With class: - -```php -->list(\Foo\MyModel::class) -``` - -`MyModel` must implement `public static function getList()` and return array. - -### Providing Selected Items - -```php -->value('categories.article_id') -``` - -![](/img/multiselect.png) - -### Saving Data - -Create new mutator method in your model. Here is an example: - -```php -public function setCategoriesAttribute($categories) -{ - $this->categories()->detach(); - if ( ! $categories) return; - if ( ! $this->exists) $this->save(); - - $this->categories()->attach($categories); -} -``` - -`categories()` method creates `belongs-to-many` relation in this case. \ No newline at end of file diff --git a/src/docs/07_Form_Elements/12_textarea.md b/src/docs/07_Form_Elements/12_textarea.md deleted file mode 100644 index 47988f56..00000000 --- a/src/docs/07_Form_Elements/12_textarea.md +++ /dev/null @@ -1,7 +0,0 @@ -Creates textarea. - -```php -FormItem::textarea('text', 'Text') -``` - -![](/img/textarea.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/13_ckeditor.md b/src/docs/07_Form_Elements/13_ckeditor.md deleted file mode 100644 index 3736bea8..00000000 --- a/src/docs/07_Form_Elements/13_ckeditor.md +++ /dev/null @@ -1,7 +0,0 @@ -Creates ckeditor instance. - -```php -FormItem::ckeditor('text', 'Text') -``` - -![](/img/ckeditor.png) \ No newline at end of file diff --git a/src/docs/07_Form_Elements/14_view.md b/src/docs/07_Form_Elements/14_view.md deleted file mode 100644 index cd8f6fd8..00000000 --- a/src/docs/07_Form_Elements/14_view.md +++ /dev/null @@ -1,13 +0,0 @@ -Insert your custom view. You can write there anything you want and insert scripts. - -```php -FormItem::view('admin.article.view') -``` - -![](/img/view.png) - -`admin/article/view.blade.php` in this case contains: - -```html -

Hello world!

-``` \ No newline at end of file diff --git a/src/docs/08_Troubleshooting.md b/src/docs/08_Troubleshooting.md deleted file mode 100644 index a7febca2..00000000 --- a/src/docs/08_Troubleshooting.md +++ /dev/null @@ -1,13 +0,0 @@ -### Error: `admin/js/en/lang.js` file not found - -**Solution:** - -Add this code to your nginx configuration: -``` -location ~* ^(!?admin\/).+\.(jpg|jpeg|gif|css|png|js|ico|bmp)$ { - log_not_found off; - access_log off; - expires 10d; - break; -} -``` diff --git a/src/docs/09_License.md b/src/docs/09_License.md deleted file mode 100644 index 20fd52f3..00000000 --- a/src/docs/09_License.md +++ /dev/null @@ -1,22 +0,0 @@ -```AsciiDoc -The MIT License (MIT) - -Copyright 2014 SleepingOwl - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` \ No newline at end of file diff --git a/src/lang/en/lang.php b/src/lang/en/lang.php index 4a894b69..522c7400 100644 --- a/src/lang/en/lang.php +++ b/src/lang/en/lang.php @@ -30,11 +30,13 @@ 'table' => [ 'new-entry' => 'New Entry', 'edit' => 'Edit', + 'restore' => 'Restore', 'delete' => 'Delete', 'delete-confirm' => 'Are you sure want to delete this entry?', 'delete-error' => 'Error while deleting this entry. You must delete all linked entries first.', 'moveUp' => 'Move Up', 'moveDown' => 'Move Down', + 'error' => 'There was an error during your request', 'filter' => 'Show similar entries', 'filter-goto' => 'Show', 'save' => 'Save', @@ -60,7 +62,17 @@ ] ], 'select' => [ - 'nothing' => 'Nothing selected', - 'selected' => 'selected' - ] + 'nothing' => 'Nothing selected', + 'selected' => 'selected', + 'placeholder' => 'Select from the list', + ], + 'image' => [ + 'browse' => 'Select Image', + 'browseMultiple' => 'Select Images', + 'remove' => 'Remove Image', + ], + 'file' => [ + 'browse' => 'Select File', + 'remove' => 'Remove File', + ], ]; \ No newline at end of file diff --git a/src/lang/es/lang.php b/src/lang/es/lang.php new file mode 100644 index 00000000..14b7c8c1 --- /dev/null +++ b/src/lang/es/lang.php @@ -0,0 +1,66 @@ + 'Página no encontrada.', + 'auth' => [ + 'title' => 'Autorización', + 'username' => 'Usuario', + 'password' => 'Contraseña', + 'login' => 'Iniciar sesión', + 'logout' => 'Cerrar sesión', + 'wrong-username' => 'Usuario', + 'wrong-password' => 'o contraseña incorrectos' + ], + 'ckeditor' => [ + 'upload' => [ + 'success' => 'El archivo ha sido subido: \\n- Tamaño: :size kb \\n- ancho/alto: :width x :height', + 'error' => [ + 'common' => 'No se ha podido subir el archivo.', + 'wrong_extension' => 'El archivo ":file" tiene una extensión incorrecta.', + 'filesize_limit' => 'El tamaño máximo de archivo permitido es :size kb.', + 'imagesize_max_limit' => 'Ancho x Alto = :width x :height \\n El Ancho x Alto máximo debe ser: :maxwidth x :maxheight', + 'imagesize_min_limit' => 'Ancho x Alto = :width x :height \\n El Ancho x Alto mínimo debe ser: :minwidth x :minheight', + ] + ], + 'image_browser' => [ + 'title' => 'Insertar imágen desde el servidor', + 'subtitle' => 'Selecciona imágen a insertar', + ], + ], + 'table' => [ + 'new-entry' => 'Nuevo registro', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + 'delete-confirm' => '¿Confirmas eliminar este registro?', + 'delete-error' => 'No se ha podido eliminar este registro. Primero debes eliminar las entradas relacionadas a esta.', + 'moveUp' => 'Mover arriba', + 'moveDown' => 'Mover abajo', + 'filter' => 'Mostrar registros similiares', + 'filter-goto' => 'Mostrar', + 'save' => 'Guardar', + 'cancel' => 'Cancelar', + 'download' => 'Descargar', + 'all' => 'Todos', + 'processing' => '', + 'loadingRecords' => 'Cargando...', + 'lengthMenu' => 'Mostrar registros de _MENU_ ', + 'zeroRecords' => 'No se han encontrado resultados.', + 'info' => 'Mostrando de _START_ a _END_ de _TOTAL_ registros', + 'infoEmpty' => 'Mostrando de 0 a 0 de 0 registros', + 'infoFiltered' => '(filtrado de un total de _MAX_ registros)', + 'infoThousands' => ',', + 'infoPostFix' => '', + 'search' => 'Buscar: ', + 'emptyTable' => 'No hay información disponible.', + 'paginate' => [ + 'first' => 'Primera', + 'previous' => '←', + 'next' => '→', + 'last' => 'Última' + ] + ], + 'select' => [ + 'nothing' => 'No hay nada seleccionado', + 'selected' => 'seleccionados' + ] +]; diff --git a/src/lang/es/validation.php b/src/lang/es/validation.php new file mode 100644 index 00000000..7648b641 --- /dev/null +++ b/src/lang/es/validation.php @@ -0,0 +1,68 @@ + "El campo :attribute debe ser aceptado.", + "active_url" => "El campo :attribute no contiene una URL válida.", + "after" => "El campo :attribute debe ser una fecha posterior a :date.", + "alpha" => "El campo :attribute sólo puede contener letras.", + "alpha_dash" => "El campo :attribute sólo puede contener letras, números y guiones.", + "alpha_num" => "El campo :attribute sólo puede contener letras y números.", + "array" => "El campo :attribute debe ser un array.", + "before" => "El campo :attribute debe ser una fecha previa a :date.", + "confirmed" => "La confirmación del campo :attribute no concuerda.", + "date" => "La fecha en :attribute no es válida.", + "date_format" => "El campo :attribute no concuerda con el formato :format.", + "different" => "Los campos :attribute y :other deben ser diferentes.", + "digits" => "El campo :attribute debe contener :digits dígitos.", + "digits_between" => "El campo :attribute debe contener entre :min y :max dígitos.", + "email" => "El campo :attribute debe ser una dirección de correo electrónico válida.", + "exists" => "El campo selected :attribute no es válido.", + "image" => "El campo :attribute debe ser una imágen.", + "in" => "El campo selected :attribute is invalid.", + "integer" => "El campo :attribute debe ser un número entero.", + "ip" => "El campo :attribute debe ser una dirección IP válida.", + "mimes" => "El tipo de archivo para :attribute debe ser del tipo: :values.", + "not_in" => "El campo selected :attribute is invalid.", + "not_php" => "Tipo de archivo no válido.", + "numeric" => "El campo :attribute debe ser numérico.", + "regex" => "El format del campo :attribute no es válido.", + "required" => "El campo :attribute es requerido.", + "required_only_on_create" => "El campo :attribute es requerido.", + "required_if" => "El campo :attribute es requerido cuando :other es :value.", + "required_with" => "El campo :attribute es requerido cuando :values está presente.", + "required_with_all" => "El campo :attribute es requerido cuando :values están presentes.", + "required_without" => "El campo :attribute es requerido cuando :values no está presente.", + "required_without_all" => "El campo :attribute es requerido cuando ninguno de :values están presentes.", + "same" => "Los campos :attribute y :other deben ser iguales.", + "unique" => "Este :attribute ya existe.", + "url" => "El formato de :attribute no es válido.", + "url_stub" => "El formato de :attribute no es válido.", + "url_stub_full" => "El formato de :attribute no es válido.", + + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; diff --git a/src/lang/pt_BR/lang.php b/src/lang/pt_BR/lang.php new file mode 100644 index 00000000..6a421086 --- /dev/null +++ b/src/lang/pt_BR/lang.php @@ -0,0 +1,78 @@ + 'Página não encontrada.', + 'auth' => [ + 'title' => 'Autorização', + 'username' => 'Usuário', + 'password' => 'Senha', + 'login' => 'Login', + 'logout' => 'Logout', + 'wrong-username' => 'Nome de usuário errado', + 'wrong-password' => 'ou senha' + ], + 'ckeditor' => [ + 'upload' => [ + 'success' => 'Arquivo enviado: \\n- Tamanho: :size kb \\n- largura/altura: :width x :height', + 'error' => [ + 'common' => 'Não é possível enviar o arquivo.', + 'wrong_extension' => 'Arquivo ":file" está com a extensão errada.', + 'filesize_limit' => 'O tamanho máximo permitido para arquivo é :size kb.', + 'imagesize_max_limit' => 'Largura x Altura = :width x :height \\n As dimensões máximas para Largura x Altura devem ser: :maxwidth x :maxheight', + 'imagesize_min_limit' => 'Largura x Altura = :width x :height \\n As dimensões máximas para Largura x Altura devem ser: :minwidth x :minheight', + ] + ], + 'image_browser' => [ + 'title' => 'Inserir imagem do servidor', + 'subtitle' => 'Escolha a imagem para inserir', + ], + ], + 'table' => [ + 'new-entry' => 'Nova entrada', + 'edit' => 'Editar', + 'restore' => 'Restaurar', + 'delete' => 'Excluir', + 'delete-confirm' => 'Tem certeza que deseja excluir este registro', + 'delete-error' => 'Ocorreu um erro ao excluir este registro. Você deve excluir todos os registros relacionados antes.', + 'moveUp' => 'Mover p/cima', + 'moveDown' => 'Mover p/baixo', + 'error' => 'Ocorreu um erro ao processar sua solicitação', + 'filter' => 'Mostrar entradas similares', + 'filter-goto' => 'Mostrar', + 'save' => 'Salvar', + 'cancel' => 'Cancelar', + 'download' => 'Download', + 'all' => 'Todos', + 'processing' => '', + 'loadingRecords' => 'Carregando...', + 'lengthMenu' => 'Mostrar _MENU_ entradas', + 'zeroRecords' => 'Nenhum registro encontrado.', + 'info' => 'Mostrando _START_ a _END_ de _TOTAL_ registros', + 'infoEmpty' => 'Mostrando 0 a 0 de 0 registros', + 'infoFiltered' => '(filtrado de _MAX_ registros no total)', + 'infoThousands' => '.', + 'infoPostFix' => '', + 'search' => 'Pesquisar: ', + 'emptyTable' => 'Nenhum informação na tabela', + 'paginate' => [ + 'first' => 'Primeiro', + 'previous' => '←', + 'next' => '→', + 'last' => 'Último' + ] + ], + 'select' => [ + 'nothing' => 'Nada selecionado', + 'selected' => 'selecionado', + 'placeholder' => 'Selecione da lista', + ], + 'image' => [ + 'browse' => 'Seleciona a imagem', + 'browseMultiple' => 'Selecione as imagens', + 'remove' => 'Remover a imagem', + ], + 'file' => [ + 'browse' => 'Selecionar o arquivo', + 'remove' => 'Remover o arquivo', + ], +]; diff --git a/src/lang/pt_BR/validation.php b/src/lang/pt_BR/validation.php new file mode 100644 index 00000000..185d82a9 --- /dev/null +++ b/src/lang/pt_BR/validation.php @@ -0,0 +1,94 @@ + ":attribute deve ser aceito.", + "active_url" => ":attribute não é uma URL válida.", + "after" => ":attribute deve ser uma data depois de :date.", + "alpha" => ":attribute somente pode conter letras.", + "alpha_dash" => ":attribute somente pode conter letras, números, e traços.", + "alpha_num" => ":attribute somente pode conter letras e números.", + "array" => ":attribute deve ser um array.", + "before" => ":attribute deve ser uma data antes de :date.", + "between" => [ + "numeric" => ":attribute deve estar entre :min e :max.", + "file" => ":attribute deve estar entre :min e :max kilobytes.", + "string" => ":attribute deve estar entre :min e :max caracteres.", + "array" => ":attribute deve estar entre :min e :max items.", + ], + "confirmed" => ":attribute confirmação não combina.", + "date" => ":attribute não é uma data válida.", + "date_format" => ":attribute não combina com o formato :format.", + "different" => ":attribute e :other devem ser diferentes.", + "digits" => ":attribute deve ter :digits dígitos.", + "digits_between" => ":attribute deve ter entre :min e :max dígitos.", + "email" => ":attribute deve ser um endereço de email válido.", + "exists" => "A seleção :attribute é inválida.", + "image" => ":attribute deve ser uma imagem.", + "in" => "A seleção :attribute é inválida.", + "integer" => ":attribute deve ser um inteiro.", + "ip" => ":attribute deve ser um endereço de IP válido.", + "max" => [ + "numeric" => ":attribute não pode ser maior que :max.", + "file" => ":attribute não pode ser maior que :max kilobytes.", + "string" => ":attribute não pode ser maior que :max caracteres.", + "array" => ":attribute não pode ter mais que :max items.", + ], + "mimes" => ":attribute deve ser um campo do tipo: :values.", + "min" => [ + "numeric" => ":attribute dever ser no mínimo :min.", + "file" => ":attribute dever ter no mínimo :min kilobytes.", + "string" => ":attribute dever ter no mínimo :min caracteres.", + "array" => ":attribute dever ter no mínimo :min items.", + ], + "not_in" => "A seleção :attribute é inválida.", + "not_php" => "Tipo de arquivo errado.", + "numeric" => ":attribute deve ser um número.", + "regex" => ":attribute com formato inválido.", + "required" => "Campo :attribute é obrigatório.", + "required_only_on_create" => "Campo :attribute é obrigatório.", + "required_if" => "Campo :attribute é obrigatório quando :other é :value.", + "required_with" => "Campo :attribute é obrigatório quando :values está presente.", + "required_with_all" => "Campo :attribute é obrigatório quando :values está presente.", + "required_without" => "Campo :attribute é obrigatório quando :values não está presente.", + "required_without_all" => "Campo :attribute é obrigatório quando nenhum :values está resente.", + "same" => ":attribute e :other devem combinar.", + "size" => [ + "numeric" => ":attribute deve ser :size.", + "file" => ":attribute deve ter :size kilobytes.", + "string" => ":attribute deve ter :size caracteres.", + "array" => ":attribute deve conter :size items.", + ], + "unique" => ":attribute já foi utilizado.", + "url" => ":attribute esté com o formato inválido.", + "url_stub" => ":attribute esté com o formato inválido.", + "url_stub_full" => ":attribute esté com o formato inválido.", + + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap attribute place-holders + | with something more reader friendly such as E-Mail Address instead + | of "email". This simply helps us make messages a little cleaner. + | + */ + + 'attributes' => [], + +]; + diff --git a/src/lang/ru/lang.php b/src/lang/ru/lang.php index 8979e7f6..3a80fa0c 100644 --- a/src/lang/ru/lang.php +++ b/src/lang/ru/lang.php @@ -30,11 +30,13 @@ 'table' => [ 'new-entry' => 'Новая запись', 'edit' => 'Редактировать', + 'restore' => 'Восстановить', 'delete' => 'Удалить', 'delete-confirm' => 'Вы уверены, что хотите удалить эту запись?', 'delete-error' => 'Невозможно удалить эту запись. Необходимо предварительно удалить все связанные записи.', 'moveUp' => 'Подвинуть вверх', 'moveDown' => 'Подвинуть вниз', + 'error' => 'В процессе обработки вашего запроса возникла ошибка', 'filter' => 'Показать подобные записи', 'filter-goto' => 'Перейти', 'save' => 'Сохранить', @@ -60,7 +62,17 @@ ] ], 'select' => [ - 'nothing' => 'Ничего не выбрано', - 'selected' => 'выбрано' - ] + 'nothing' => 'Ничего не выбрано', + 'selected' => 'выбрано', + 'placeholder' => 'Выберите из списка', + ], + 'image' => [ + 'browse' => 'Выбор изображения', + 'browseMultiple' => 'Выбор изображений', + 'remove' => 'Удалить', + ], + 'file' => [ + 'browse' => 'Выбор файла', + 'remove' => 'Удалить', + ], ]; \ No newline at end of file diff --git a/src/lang/uk/lang b/src/lang/uk/lang new file mode 100644 index 00000000..13d42c16 --- /dev/null +++ b/src/lang/uk/lang @@ -0,0 +1,77 @@ + 'Сторінка не знайдена., + 'auth' => [ + 'title' => 'Авторизація', + 'username' => 'Логін', + 'password' => 'Пароль', + 'login' => 'Увійти', + 'logout' => 'Вийти', + 'wrong-username' => 'Не вірний логін', + 'wrong-password' => 'або пароль' + ], + 'ckeditor' => [ + 'upload' => [ + 'success' => 'Файл був успішно завантажений: \\n- Розмір: :size кб \\n- ширина/висота: :width x :height', + 'error' => [ + 'common' => 'Появилась помилка при спробі загрузити файл.', + 'wrong_extension' => 'Файл ":file" має не вырний тип.', + 'filesize_limit' => 'Максимальний розмір файлу: :size кб.', + 'imagesize_max_limit' => 'Ширина x Висота = :width x :height \\n Максимальний розмір зображеня повинен бути: :maxwidth x :maxheight', + 'imagesize_min_limit' => 'Ширина x Висота = :width x :height \\n Мінімальний розмір зображеня повинен бути: :minwidth x :minheight', + ] + ], + 'image_browser' => [ + 'title' => 'Вставка зображеня с сервера', + 'subtitle' => 'Виберіт зображеня для вставки', + ], + ], + 'table' => [ + 'new-entry' => 'Новий запис', + 'edit' => 'Редагувати', + 'restore' => 'Востановити', + 'delete' => 'Видалити', + 'delete-confirm' => 'Ви впевнені що хочете видалити цей запис?', + 'delete-error' => 'Неможливо видалити цей запис. Потрібно спочатку видалити всі связані записи.', + 'moveUp' => 'Підвинути вверх', + 'moveDown' => 'Підвинути вниз', + 'error' => 'В процесі обробки вашого запросу з'явилась помилка', + 'filter' => 'Показати подобні записи', + 'filter-goto' => 'Перейти', + 'save' => 'Сохранити', + 'cancel' => 'Скасувати', + 'download' => 'Завантажити', + 'all' => 'Все', + 'processing' => '', + 'loadingRecords' => 'Підождіть...', + 'lengthMenu' => 'Відображати _MENU_ записів', + 'zeroRecords' => 'Не найдено підходящих записів.', + 'info' => 'Записи починаючи з _START_ до _END_ з _TOTAL_', + 'infoEmpty' => 'Записи починаючи з 0 по 0 з 0', + 'infoFiltered' => '(відфільтровано з _MAX_ записів)', + 'infoThousands' => '', + 'infoPostFix' => '', + 'search' => 'Пошук: ', + 'emptyTable' => 'Немає записів', + 'paginate' => [ + 'first' => 'Перша', + 'previous' => '←', + 'next' => '→', + 'last' => 'Остання' + ] + ], + 'select' => [ + 'nothing' => 'Нічого не вибрано', + 'selected' => 'вибрано', + 'placeholder' => 'Виберіть зі списку', + ], + 'image' => [ + 'browse' => 'Вибір зображеня', + 'browseMultiple' => 'Вибір зображеня', + 'remove' => 'Видалити', + ], + 'file' => [ + 'browse' => 'Вибір файлу', + 'remove' => 'Видалити', + ], +]; diff --git a/src/views/_layout/inner.blade.php b/src/views/_layout/inner.blade.php deleted file mode 100644 index 90545980..00000000 --- a/src/views/_layout/inner.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@extends('admin::_layout.base') - -@section('content') -
- -
- @yield('innerContent') -
-
-@stop \ No newline at end of file diff --git a/src/views/_partials/user.blade.php b/src/views/_partials/user.blade.php deleted file mode 100644 index 8634f288..00000000 --- a/src/views/_partials/user.blade.php +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/src/views/_layout/base.blade.php b/src/views/default/_layout/base.blade.php similarity index 90% rename from src/views/_layout/base.blade.php rename to src/views/default/_layout/base.blade.php index 519fc8f2..50c1e998 100644 --- a/src/views/_layout/base.blade.php +++ b/src/views/default/_layout/base.blade.php @@ -4,8 +4,9 @@ + - {{{ $pageTitle }}} + {{{ $title }}} @foreach (\SleepingOwl\Admin\AssetManager\AssetManager::styles() as $style) diff --git a/src/views/default/_layout/inner.blade.php b/src/views/default/_layout/inner.blade.php new file mode 100644 index 00000000..b3aa55fa --- /dev/null +++ b/src/views/default/_layout/inner.blade.php @@ -0,0 +1,23 @@ +@extends(AdminTemplate::view('_layout.base')) + +@section('content') +
+ +
+
+
+

{{{ $title }}}

+
+
+
+
+ {!! $content !!} +
+
+
+
+@stop \ No newline at end of file diff --git a/src/views/_partials/header.blade.php b/src/views/default/_partials/header.blade.php similarity index 74% rename from src/views/_partials/header.blade.php rename to src/views/default/_partials/header.blade.php index a3785171..a1343e31 100644 --- a/src/views/_partials/header.blade.php +++ b/src/views/default/_partials/header.blade.php @@ -5,5 +5,5 @@ - {{{ $adminTitle }}} + {{{ config('admin.title') }}}
diff --git a/src/views/_partials/menu.blade.php b/src/views/default/_partials/menu.blade.php similarity index 70% rename from src/views/_partials/menu.blade.php rename to src/views/default/_partials/menu.blade.php index a7a8cc1b..1198323c 100644 --- a/src/views/_partials/menu.blade.php +++ b/src/views/default/_partials/menu.blade.php @@ -1,8 +1,8 @@