diff --git a/.bowerrc b/.bowerrc new file mode 100755 index 0000000..1669168 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory" : "vendor/bower" +} diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..c346f28 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# yii console command +/yii + +# phpstorm project files +.idea + +# netbeans project files +nbproject + +# zend studio for eclipse project files +.buildpath +.project +.settings + +# windows thumbnail cache +Thumbs.db + +# composer vendor dir +/vendor + +# composer itself is not needed +composer.phar + +# Mac DS_Store Files +.DS_Store + +# phpunit itself is not needed +phpunit.phar +# local phpunit config +/phpunit.xml + +# vagrant runtime +/.vagrant diff --git a/.htaccess b/.htaccess new file mode 100755 index 0000000..f261e70 --- /dev/null +++ b/.htaccess @@ -0,0 +1,160 @@ +AddDefaultCharset utf-8 + + + + Options +FollowSymlinks + + RewriteEngine On + + + + + + RewriteBase / + # deal with admin first + + + + RewriteRule ^storage/(.*)?$ /storage/$1 [L,PT] + + RewriteCond %{REQUEST_URI} ^/(admin) + + + + RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L] + + RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L] + + RewriteRule ^admin/js/(.*)$ backend/web/js/$1 [L] + + RewriteRule ^admin/images/(.*)$ backend/web/images/$1 [L] + + RewriteRule ^admin/fonts/(.*)$ backend/web/fonts/$1 [L] + + + + + + RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css|js|images|fonts)/ + + RewriteCond %{REQUEST_URI} ^/(admin) + + RewriteRule ^.*$ backend/web/index.php [L] + + + RewriteCond %{REQUEST_URI} ^/(assets|css) + + RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L] + + RewriteRule ^css/(.*)$ frontend/web/css/$1 [L] + + RewriteRule ^js/(.*)$ frontend/web/js/$1 [L] + + RewriteRule ^images/(.*)$ frontend/web/images/$1 [L] + + RewriteRule ^libraries/(.*)$ frontend/web/libraries/$1 [L] + + RewriteRule ^img/(.*)$ frontend/web/img/$1 [L] + + RewriteRule ^files/(.*)$ frontend/web/files/$1 [L] + + RewriteRule ^fonts/(.*)$ frontend/web/fonts/$1 [L] + + RewriteRule robots.txt$ frontend/web/robots.txt [L] + + + RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css|txt|js|images|fonts|img|files)/ + + RewriteCond %{REQUEST_URI} !index.php + + RewriteCond %{REQUEST_FILENAME} !-f [OR] + + RewriteCond %{REQUEST_FILENAME} !-d + + RewriteCond %{HTTP_HOST} ^www\.(.*) + RewriteRule ^(.*)$ frontend/web/index.php + + + RewriteCond %{HTTP_HOST} ^([^www].*)$ + RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + + RewriteCond %{THE_REQUEST} \s/+(.+?)/+[?\s] + RewriteRule /$ /%1 [R,L] + + + + RewriteCond %{HTTP_HOST} ^([^www].*)$ + RewriteRule ^(.*)$ http://www.%1/$1 [R=301] + + + +#для возможности загрузки файлов парсера + + php_value upload_max_filesize 20M + php_value post_max_size 30M + + + +# кеширование в браузере на стороне пользователя + + + ExpiresActive On + ExpiresDefault "access 7 days" + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType text/html "access plus 7 day" + ExpiresByType text/x-javascript "access 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/jpg "access plus 1 year" + ExpiresByType image/x-icon "access 1 year" + ExpiresByType application/x-shockwave-flash "access 1 year" + + +AddOutputFilterByType DEFLATE text/plain +AddOutputFilterByType DEFLATE text/html +AddOutputFilterByType DEFLATE text/xml +AddOutputFilterByType DEFLATE text/css +AddOutputFilterByType DEFLATE application/xml +AddOutputFilterByType DEFLATE application/xhtml+xml +AddOutputFilterByType DEFLATE application/rss+xml +AddOutputFilterByType DEFLATE application/javascript +AddOutputFilterByType DEFLATE application/x-javascript +BrowserMatch ^Mozilla/4 gzip-only-text/html +BrowserMatch ^Mozilla/4\.0[678] no-gzip +BrowserMatch \bMSIE !no-gzip !gzip-only-text/html +Header append Vary User-Agent +RewriteEngine On +AddEncoding gzip .gz +RewriteCond %{HTTP:Accept-encoding} gzip +RewriteCond %{REQUEST_FILENAME}.gz -f +RewriteRule ^(.*)$ $1.gz [QSA,L] + +# Cache-Control + +# 30 дней + + Header set Cache-Control "max-age=2592000, public" + + # 30 дней + + Header set Cache-Control "max-age=2592000, public" + + # 2 дня + + Header set Cache-Control "max-age=172800, public, must-revalidate" + + # 1 день + + Header set Cache-Control "max-age=172800, private, must-revalidate" + + + +#Запрет отдачи HTTP-заголовков Vary браузерам семейства MSIE + +BrowserMatch "MSIE" force-no-vary +BrowserMatch "Mozilla/4.[0-9]{2}" force-no-vary + + diff --git a/LICENSE.md b/LICENSE.md new file mode 100755 index 0000000..e98f03d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100755 index 0000000..45e56ad --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +Yii 2 Advanced Project Template +=============================== + +Yii 2 Advanced Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for +developing complex Web applications with multiple tiers. + +The template includes three tiers: front end, back end, and console, each of which +is a separate Yii application. + +The template is designed to work in a team development environment. It supports +deploying the application in different environments. + +Documentation is at [docs/guide/README.md](docs/guide/README.md). + +[![Latest Stable Version](https://poser.pugx.org/yiisoft/yii2-app-advanced/v/stable.png)](https://packagist.org/packages/yiisoft/yii2-app-advanced) +[![Total Downloads](https://poser.pugx.org/yiisoft/yii2-app-advanced/downloads.png)](https://packagist.org/packages/yiisoft/yii2-app-advanced) +[![Build Status](https://travis-ci.org/yiisoft/yii2-app-advanced.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-advanced) + +DIRECTORY STRUCTURE +------------------- + +``` +common + config/ contains shared configurations + mail/ contains view files for e-mails + models/ contains model classes used in both backend and frontend +console + config/ contains console configurations + controllers/ contains console controllers (commands) + migrations/ contains database migrations + models/ contains console-specific model classes + runtime/ contains files generated during runtime +backend + assets/ contains application assets such as JavaScript and CSS + config/ contains backend configurations + controllers/ contains Web controller classes + models/ contains backend-specific model classes + runtime/ contains files generated during runtime + views/ contains view files for the Web application + web/ contains the entry script and Web resources +frontend + assets/ contains application assets such as JavaScript and CSS + config/ contains frontend configurations + controllers/ contains Web controller classes + models/ contains frontend-specific model classes + runtime/ contains files generated during runtime + views/ contains view files for the Web application + web/ contains the entry script and Web resources + widgets/ contains frontend widgets +vendor/ contains dependent 3rd-party packages +environments/ contains environment-based overrides +tests contains various tests for the advanced application + codeception/ contains tests developed with Codeception PHP Testing Framework +``` diff --git a/Vagrantfile b/Vagrantfile new file mode 100755 index 0000000..689a92c --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,72 @@ +require 'yaml' +require 'fileutils' + +domains = { + frontend: 'y2aa-frontend.dev', + backend: 'y2aa-backend.dev' +} + +config = { + local: './vagrant/config/vagrant-local.yml', + example: './vagrant/config/vagrant-local.example.yml' +} + +# copy config from example if local config not exists +FileUtils.cp config[:example], config[:local] unless File.exist?(config[:local]) +# read config +options = YAML.load_file config[:local] + +# check github token +if options['github_token'].nil? || options['github_token'].to_s.length != 40 + puts "You must place REAL GitHub token into configuration:\n/yii2-app-advancded/vagrant/config/vagrant-local.yml" + exit +end + +# vagrant configurate +Vagrant.configure(2) do |config| + # select the box + config.vm.box = 'ubuntu/trusty64' + + # should we ask about box updates? + config.vm.box_check_update = options['box_check_update'] + + config.vm.provider 'virtualbox' do |vb| + # machine cpus count + vb.cpus = options['cpus'] + # machine memory size + vb.memory = options['memory'] + # machine name (for VirtualBox UI) + vb.name = options['machine_name'] + end + + # machine name (for vagrant console) + config.vm.define options['machine_name'] + + # machine name (for guest machine console) + config.vm.hostname = options['machine_name'] + + # network settings + config.vm.network 'private_network', ip: options['ip'] + + # sync: folder 'yii2-app-advanced' (host machine) -> folder '/app' (guest machine) + config.vm.synced_folder './', '/app', owner: 'vagrant', group: 'vagrant' + + # disable folder '/vagrant' (guest machine) + config.vm.synced_folder '.', '/vagrant', disabled: true + + # hosts settings (host machine) + config.vm.provision :hostmanager + config.hostmanager.enabled = true + config.hostmanager.manage_host = true + config.hostmanager.ignore_private_ip = false + config.hostmanager.include_offline = true + config.hostmanager.aliases = domains.values + + # provisioners + config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone']] + config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false + config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always' + + # post-install message (vagrant console) + config.vm.post_up_message = "Frontend URL: http://#{domains[:frontend]}\nBackend URL: http://#{domains[:backend]}" +end diff --git a/backend/assets/AppAsset.php b/backend/assets/AppAsset.php new file mode 100755 index 0000000..940c0af --- /dev/null +++ b/backend/assets/AppAsset.php @@ -0,0 +1,23 @@ + 'app-backend', + 'basePath' => dirname(__DIR__), + 'controllerNamespace' => 'backend\controllers', + 'bootstrap' => ['log'], + 'components' => [ + 'user' => [ + 'identityClass' => 'common\models\User', + 'enableAutoLogin' => true, + ], + 'log' => [ + 'traceLevel' => YII_DEBUG ? 3 : 0, + 'targets' => [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ], + ], + 'errorHandler' => [ + 'errorAction' => 'site/error', + ], + 'request'=>[ + 'cookieValidationKey' => 'j4iuot9u5894e7tu8reyh78g9y54sy7i', + 'csrfParam' => '_backendCSRF', + + 'class' => 'common\components\Request', + + 'web'=> '/backend/web', + + 'adminUrl' => '/admin' + + ], + 'urlManager' => [ + 'baseUrl' => '/admin', + 'enablePrettyUrl' => true, + 'showScriptName' => false, + ] + + ], + 'params' => $params, + ]; diff --git a/backend/config/params.php b/backend/config/params.php new file mode 100755 index 0000000..7f754b9 --- /dev/null +++ b/backend/config/params.php @@ -0,0 +1,4 @@ + 'admin@example.com', +]; diff --git a/backend/controllers/CarController.php b/backend/controllers/CarController.php new file mode 100755 index 0000000..706aadf --- /dev/null +++ b/backend/controllers/CarController.php @@ -0,0 +1,159 @@ + [ + 'class' => AccessControl::className(), + 'rules' => [ + [ + 'actions' => ['error'], + 'allow' => true, + ], + [ + 'allow' => true, + 'roles' => ['@'], + ], + ], + ], + 'verbs' => [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => [ 'POST' ], + ], + ], + ]; + } + + /** + * Lists all Car models. + * @return mixed + */ + public function actionIndex() + { + $searchModel = new CarSearch(); + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); + + return $this->render('index', [ + 'searchModel' => $searchModel, + 'dataProvider' => $dataProvider, + ]); + } + + /** + * Displays a single Car model. + * + * @param integer $id + * + * @return mixed + */ + public function actionView($id) + { + return $this->render('view', [ + 'model' => $this->findModel($id), + ]); + } + + /** + * Creates a new Car model. + * If creation is successful, the browser will be redirected to the 'view' page. + * @return mixed + */ + public function actionCreate() + { + $model = new Car(); + + if($model->load(Yii::$app->request->post()) && $model->validate()) { + $model->upload(); + $model->save(false); + return $this->redirect([ + 'view', + 'id' => $model->car_id, + ]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } + + /** + * Updates an existing Car model. + * If update is successful, the browser will be redirected to the 'view' page. + * + * @param integer $id + * + * @return mixed + */ + public function actionUpdate($id) + { + $model = $this->findModel($id); + + if($model->load(Yii::$app->request->post())) { + if($model->validate()) { + $model->upload(); + $model->save(false); + return $this->redirect([ + 'view', + 'id' => $model->car_id, + ]); + } + } + return $this->render('update', [ + 'model' => $model, + ]); + } + + /** + * Deletes an existing Car model. + * If deletion is successful, the browser will be redirected to the 'index' page. + * + * @param integer $id + * + * @return mixed + */ + public function actionDelete($id) + { + $this->findModel($id) + ->delete(); + + return $this->redirect([ 'index' ]); + } + + /** + * Finds the Car model based on its primary key value. + * If the model is not found, a 404 HTTP exception will be thrown. + * + * @param integer $id + * + * @return Car the loaded model + * @throws NotFoundHttpException if the model cannot be found + */ + protected function findModel($id) + { + if(( $model = Car::findOne($id) ) !== NULL) { + return $model; + } else { + throw new NotFoundHttpException('The requested page does not exist.'); + } + } + } diff --git a/backend/controllers/SiteController.php b/backend/controllers/SiteController.php new file mode 100755 index 0000000..9624dcc --- /dev/null +++ b/backend/controllers/SiteController.php @@ -0,0 +1,98 @@ + [ + 'class' => AccessControl::className(), + 'rules' => [ + [ + 'actions' => ['login', 'error'], + 'allow' => true, + ], + [ + 'actions' => ['logout', 'index'], + 'allow' => true, + 'roles' => ['@'], + ], + ], + ], + 'verbs' => [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'logout' => ['post'], + ], + ], + ]; + } + + /** + * @inheritdoc + */ + public function actions() + { + return [ + 'error' => [ + 'class' => 'yii\web\ErrorAction', + ], + ]; + } + + /** + * Displays homepage. + * + * @return string + */ + public function actionIndex() + { + return $this->render('index'); + } + + /** + * Login action. + * + * @return string + */ + public function actionLogin() + { + if (!Yii::$app->user->isGuest) { + return $this->goHome(); + } + + $model = new LoginForm(); + if ($model->load(Yii::$app->request->post()) && $model->login()) { + return $this->goBack(); + } else { + return $this->render('login', [ + 'model' => $model, + ]); + } + } + + /** + * Logout action. + * + * @return string + */ + public function actionLogout() + { + Yii::$app->user->logout(); + + return $this->goHome(); + } +} diff --git a/backend/models/.gitkeep b/backend/models/.gitkeep new file mode 100755 index 0000000..72e8ffc --- /dev/null +++ b/backend/models/.gitkeep @@ -0,0 +1 @@ +* diff --git a/backend/runtime/.gitignore b/backend/runtime/.gitignore new file mode 100755 index 0000000..c96a04f --- /dev/null +++ b/backend/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/backend/views/car/_form.php b/backend/views/car/_form.php new file mode 100755 index 0000000..df1a0de --- /dev/null +++ b/backend/views/car/_form.php @@ -0,0 +1,81 @@ + 'Nissan Leaf S', + 'Nissan Leaf SV' => 'Nissan Leaf SV', + 'Nissan Leaf SL' => 'Nissan Leaf SL', + ]; + $years = [ ]; + for($year = 2013; $year <= date('Y'); $year++) { + $years[ $year ] = $year; + } +?> + +
+ + ['enctype' => 'multipart/form-data']]); ?> + + field($model, 'model') + ->dropDownList($models) ?> + + field($model, 'year') + ->dropDownList($years) ?> + + field($model, 'image') + ->widget(FileInput::className(), [ + 'options' => [ 'accept' => 'image/*' ], + 'pluginOptions' => [ + 'allowedFileExtensions' => ['jpg', 'png'], + 'initialPreview' => ($model->image?(Html::img($model->image, ['width' => '240px'])):false), + 'initialPreviewConfig' => [ + 'width' => '120px', + ], + 'overwriteInitial' => true, + 'showUpload' => false, + 'previewFileType' => 'image', + ], + ]) ?> + + field($model, 'color') + ->textInput([ 'maxlength' => true ]) ?> + + field($model, 'mileage') + ->textInput() + ->label('Пробег (тыс. км.)') ?> + + field($model, 'build') + ->widget(DatePicker::className(), [ + 'dateFormat' => 'MM/yyyy', + 'clientOptions' => [ + 'changeMonth' => true, + 'changeYear' => true, + 'yearRange' => '2013:' . date('Y'), + ], + 'options' => [ + 'class' => 'form-control', + ], + ]) + ->label('Дата выпуска (выбор дня не влияет)') ?> + + field($model, 'option') + ->textarea([ 'rows' => 6 ]) ?> + + field($model, 'price') + ->textInput() ?> + +
+ isNewRecord ? 'Create' : 'Update', [ 'class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ]) ?> +
+ + + +
diff --git a/backend/views/car/_search.php b/backend/views/car/_search.php new file mode 100755 index 0000000..7f9f735 --- /dev/null +++ b/backend/views/car/_search.php @@ -0,0 +1,43 @@ + + + diff --git a/backend/views/car/create.php b/backend/views/car/create.php new file mode 100755 index 0000000..7776bb1 --- /dev/null +++ b/backend/views/car/create.php @@ -0,0 +1,21 @@ +title = 'Добавить автомобиль'; +$this->params['breadcrumbs'][] = ['label' => 'Автомобили', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ + render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/backend/views/car/index.php b/backend/views/car/index.php new file mode 100755 index 0000000..9e44d7f --- /dev/null +++ b/backend/views/car/index.php @@ -0,0 +1,76 @@ +title = 'Автомобили'; + $this->params[ 'breadcrumbs' ][] = $this->title; +?> +
+ +

title) ?>

+ render('_search', ['model' => $searchModel]); ?> + +

+ 'btn btn-success' ]) ?> +

+ $dataProvider, + 'filterModel' => $searchModel, + 'columns' => [ + [ 'class' => 'yii\grid\ActionColumn' ], + [ + 'attribute' => 'car_id', + 'headerOptions' => [ + 'style' => 'word-break: break-all', + ], + ], + 'model', + 'year', + [ + 'attribute' => 'image', + 'format' => [ + 'image', + [ + 'style' => [ 'max-width' => '300px' ], + ], + ], + ], + 'color', + [ + 'attribute' => 'mileage', + 'value' => function ($model) { + /** + * @var Car $model + */ + return $model->mileage . ' тыс. км.'; + }, + ], + 'build', + [ + 'attribute' => 'option', + 'format' => 'ntext', + 'contentOptions' => [ + 'style' => 'white-space: normal', + ], + ], + [ + 'attribute' => 'price', + 'value' => function ($model) { + /** + * @var Car $model + */ + return '$' . number_format($model->price, 3); + }, + ], + + ], + ] + ); ?> +
diff --git a/backend/views/car/update.php b/backend/views/car/update.php new file mode 100755 index 0000000..17500c3 --- /dev/null +++ b/backend/views/car/update.php @@ -0,0 +1,21 @@ +title = 'Обновить автомобиль: ' . $model->model; +$this->params['breadcrumbs'][] = ['label' => 'Автомобили', 'url' => ['index']]; +$this->params['breadcrumbs'][] = ['label' => $model->model, 'url' => ['view', 'id' => $model->car_id]]; +$this->params['breadcrumbs'][] = 'Обновить'; +?> +
+ +

title) ?>

+ + render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/backend/views/car/view.php b/backend/views/car/view.php new file mode 100755 index 0000000..af49ef4 --- /dev/null +++ b/backend/views/car/view.php @@ -0,0 +1,43 @@ +title = $model->car_id; +$this->params['breadcrumbs'][] = ['label' => 'Cars', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ +

+ $model->car_id], ['class' => 'btn btn-primary']) ?> + $model->car_id], [ + 'class' => 'btn btn-danger', + 'data' => [ + 'confirm' => 'Are you sure you want to delete this item?', + 'method' => 'post', + ], + ]) ?> +

+ + $model, + 'attributes' => [ + 'car_id', + 'model', + 'year', + 'image', + 'color', + 'mileage', + 'build', + 'option:ntext', + 'price', + ], + ]) ?> + +
diff --git a/backend/views/layouts/main.php b/backend/views/layouts/main.php new file mode 100755 index 0000000..b6beed7 --- /dev/null +++ b/backend/views/layouts/main.php @@ -0,0 +1,80 @@ + +beginPage() ?> + + + + + + + <?= Html::encode($this->title) ?> + head() ?> + + +beginBody() ?> + +
+ 'My Company', + 'brandUrl' => Yii::$app->homeUrl, + 'options' => [ + 'class' => 'navbar-inverse navbar-fixed-top', + ], + ]); + $menuItems = [ + ['label' => 'Home', 'url' => ['site/index']], + ['label' => 'Каталог автомобилей', 'url' => ['car/index']], + ]; + if (Yii::$app->user->isGuest) { + $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']]; + } else { + $menuItems[] = '
  • ' + . Html::beginForm(['/site/logout'], 'post') + . Html::submitButton( + 'Logout (' . Yii::$app->user->identity->username . ')', + ['class' => 'btn btn-link'] + ) + . Html::endForm() + . '
  • '; + } + echo Nav::widget([ + 'options' => ['class' => 'navbar-nav navbar-right'], + 'items' => $menuItems, + ]); + NavBar::end(); + ?> + +
    + isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], + ]) ?> + + +
    +
    + + + +endBody() ?> + + +endPage() ?> diff --git a/backend/views/site/error.php b/backend/views/site/error.php new file mode 100755 index 0000000..0ba2574 --- /dev/null +++ b/backend/views/site/error.php @@ -0,0 +1,27 @@ +title = $name; +?> +
    + +

    title) ?>

    + +
    + +
    + +

    + The above error occurred while the Web server was processing your request. +

    +

    + Please contact us if you think this is a server error. Thank you. +

    + +
    diff --git a/backend/views/site/index.php b/backend/views/site/index.php new file mode 100755 index 0000000..f780610 --- /dev/null +++ b/backend/views/site/index.php @@ -0,0 +1,53 @@ +title = 'My Yii Application'; +?> +
    + +
    +

    Congratulations!

    + +

    You have successfully created your Yii-powered application.

    + +

    Get started with Yii

    +
    + +
    + +
    +
    +

    Heading

    + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur.

    + +

    Yii Documentation »

    +
    +
    +

    Heading

    + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur.

    + +

    Yii Forum »

    +
    +
    +

    Heading

    + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu + fugiat nulla pariatur.

    + +

    Yii Extensions »

    +
    +
    + +
    +
    diff --git a/backend/views/site/login.php b/backend/views/site/login.php new file mode 100755 index 0000000..20f3f78 --- /dev/null +++ b/backend/views/site/login.php @@ -0,0 +1,35 @@ +title = 'Login'; +$this->params['breadcrumbs'][] = $this->title; +?> +
    +

    title) ?>

    + +

    Please fill out the following fields to login:

    + +
    +
    + 'login-form']); ?> + + field($model, 'username')->textInput(['autofocus' => true]) ?> + + field($model, 'password')->passwordInput() ?> + + field($model, 'rememberMe')->checkbox() ?> + +
    + 'btn btn-primary', 'name' => 'login-button']) ?> +
    + + +
    +
    +
    diff --git a/backend/web/.gitignore b/backend/web/.gitignore new file mode 100755 index 0000000..25c74e6 --- /dev/null +++ b/backend/web/.gitignore @@ -0,0 +1,2 @@ +/index.php +/index-test.php diff --git a/backend/web/assets/.gitignore b/backend/web/assets/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/backend/web/assets/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/backend/web/css/site.css b/backend/web/css/site.css new file mode 100755 index 0000000..49ee8fb --- /dev/null +++ b/backend/web/css/site.css @@ -0,0 +1,111 @@ +html, +body { + height: 100%; +} + +.wrap { + min-height: 100%; + height: auto; + margin: 0 auto -60px; + padding: 0 0 60px; +} + +.wrap > .container { + padding: 70px 15px 20px; +} + +.footer { + height: 60px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + padding-top: 20px; +} + +.jumbotron { + text-align: center; + background-color: transparent; +} + +.jumbotron .btn { + font-size: 21px; + padding: 14px 24px; +} + +.not-set { + color: #c55; + font-style: italic; +} + +/* add sorting icons to gridview sort links */ +a.asc:after, a.desc:after { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + padding-left: 5px; +} + +a.asc:after { + content: /*"\e113"*/ "\e151"; +} + +a.desc:after { + content: /*"\e114"*/ "\e152"; +} + +.sort-numerical a.asc:after { + content: "\e153"; +} + +.sort-numerical a.desc:after { + content: "\e154"; +} + +.sort-ordinal a.asc:after { + content: "\e155"; +} + +.sort-ordinal a.desc:after { + content: "\e156"; +} + +.grid-view td { + white-space: nowrap; +} + +.grid-view .filters input, +.grid-view .filters select { + min-width: 50px; +} + +.hint-block { + display: block; + margin-top: 5px; + color: #999; +} + +.error-summary { + color: #a94442; + background: #fdf7f7; + border-left: 3px solid #eed3d7; + padding: 10px 20px; + margin: 0 0 15px 0; +} + +/* align the logout "link" (button in form) of the navbar */ +.nav > li > form { + padding: 8px; +} + +@media(max-width:768px) { + .nav li > form { + padding: 3px; + } +} + +.nav > li > form > button:hover { + text-decoration: none; +} diff --git a/backend/web/favicon.ico b/backend/web/favicon.ico new file mode 100755 index 0000000..580ed73 Binary files /dev/null and b/backend/web/favicon.ico differ diff --git a/backend/web/robots.txt b/backend/web/robots.txt new file mode 100755 index 0000000..1f53798 --- /dev/null +++ b/backend/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/common/components/Request.php b/common/components/Request.php new file mode 100755 index 0000000..c6c47a8 --- /dev/null +++ b/common/components/Request.php @@ -0,0 +1,40 @@ +web, "", parent::getBaseUrl()) . $this->adminUrl; + + } + + + + public function resolvePathInfo() + + { + + if ($this->getUrl() === $this->adminUrl) { + + return ""; + + } else { + + return parent::resolvePathInfo(); + + } + + } + +} \ No newline at end of file diff --git a/common/components/urlManager/.htaccess b/common/components/urlManager/.htaccess new file mode 100755 index 0000000..2fa0d38 --- /dev/null +++ b/common/components/urlManager/.htaccess @@ -0,0 +1,10 @@ +AddDefaultCharset WINDOWS-1251 +#php_value display_errors 1 +#php_value error_reporting 2047 + +RewriteEngine on + + + +RewriteRule ^(.*)(date\.php|votebar|spam|\.css|uploaded|img|rating\.php|forum_comment\.php|js|admin|googlec87a9150150cf5d3.html)(.*)$ $1$2$3 [L] +RewriteRule ^(.*)$ index.php [L] diff --git a/common/components/urlManager/LangRequest.php b/common/components/urlManager/LangRequest.php new file mode 100755 index 0000000..91c6582 --- /dev/null +++ b/common/components/urlManager/LangRequest.php @@ -0,0 +1,17 @@ +urlManager->languages as $lang){ + if(strpos($_SERVER['PHP_SELF'], '/'.$lang))Yii::$app->language = $lang; + } + return parent::resolvePathInfo(); + } +} \ No newline at end of file diff --git a/common/components/urlManager/LangUrlManager.php b/common/components/urlManager/LangUrlManager.php new file mode 100755 index 0000000..1283d03 --- /dev/null +++ b/common/components/urlManager/LangUrlManager.php @@ -0,0 +1,30 @@ +langParam])){ if(Yii::$app->language != $this->lang)$params[$this->langParam]=Yii::$app->language;} + else if($params[$this->langParam] == $this->lang)unset($params[$this->langParam]); + return parent::createUrl($params); + } + //put your code here +} \ No newline at end of file diff --git a/common/components/urlManager/LangUrlRule.php b/common/components/urlManager/LangUrlRule.php new file mode 100755 index 0000000..2814797 --- /dev/null +++ b/common/components/urlManager/LangUrlRule.php @@ -0,0 +1,61 @@ +getRequest()->getPreferredLanguage(); + //if language pass via url use it + if(isset($_GET[$this->langParam])&&in_array($_GET[$this->langParam],$this->languages)){ + Yii::app()->language=$_GET[$this->langParam]; + //else if preffered language is allowed + }elseif(in_array($userLang,$this->languages)) { + Yii::app()->language=$userLang; + //else use the first language from the list + }else Yii::app()->language=$this->lang; + + }*/ + //put your code here + + public function init(){ + print '=='; + print Yii::$app->getRequest()->getQueryParam('language'); + return parent::init(); + } + public function createUrl($params=array()){ + $userLang=Yii::$app->getRequest()->getPreferredLanguage(); + //if language pass via url use it + if(isset($_GET[$this->langParam])&&in_array($_GET[$this->langParam],$this->languages)){ + Yii::$app->language=$_GET[$this->langParam]; + //else if preffered language is allowed + }elseif(in_array($userLang,$this->languages)) { + Yii::$app->language=$userLang; + //else use the first language from the list + }else Yii::$app->language=$this->lang; + + //print_r($_GET); + if(!isset($params[$this->langParam])){ if(Yii::$app->language != $this->lang)$params[$this->langParam]=Yii::$app->language;} + else if($params[$this->langParam] == $this->lang)unset($params[$this->langParam]); + //print_r($params); + return parent::createUrl($params); + } + //put your code here +} \ No newline at end of file diff --git a/common/config/.gitignore b/common/config/.gitignore new file mode 100755 index 0000000..97c0f01 --- /dev/null +++ b/common/config/.gitignore @@ -0,0 +1,2 @@ +main-local.php +params-local.php diff --git a/common/config/bootstrap.php b/common/config/bootstrap.php new file mode 100755 index 0000000..4530243 --- /dev/null +++ b/common/config/bootstrap.php @@ -0,0 +1,7 @@ + 'ru', + 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', + 'components' => [ + 'cache' => [ + 'class' => 'yii\caching\FileCache', + ], + ], +]; diff --git a/common/config/params.php b/common/config/params.php new file mode 100755 index 0000000..4ec9ba6 --- /dev/null +++ b/common/config/params.php @@ -0,0 +1,6 @@ + 'admin@example.com', + 'supportEmail' => 'support@example.com', + 'user.passwordResetTokenExpire' => 3600, +]; diff --git a/common/mail/layouts/html.php b/common/mail/layouts/html.php new file mode 100755 index 0000000..bddbc61 --- /dev/null +++ b/common/mail/layouts/html.php @@ -0,0 +1,22 @@ + +beginPage() ?> + + + + + <?= Html::encode($this->title) ?> + head() ?> + + + beginBody() ?> + + endBody() ?> + + +endPage() ?> diff --git a/common/mail/layouts/text.php b/common/mail/layouts/text.php new file mode 100755 index 0000000..7087cea --- /dev/null +++ b/common/mail/layouts/text.php @@ -0,0 +1,12 @@ + +beginPage() ?> +beginBody() ?> + +endBody() ?> +endPage() ?> diff --git a/common/mail/passwordResetToken-html.php b/common/mail/passwordResetToken-html.php new file mode 100755 index 0000000..f3daf49 --- /dev/null +++ b/common/mail/passwordResetToken-html.php @@ -0,0 +1,15 @@ +urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]); +?> +
    +

    Hello username) ?>,

    + +

    Follow the link below to reset your password:

    + +

    +
    diff --git a/common/mail/passwordResetToken-text.php b/common/mail/passwordResetToken-text.php new file mode 100755 index 0000000..244c0cb --- /dev/null +++ b/common/mail/passwordResetToken-text.php @@ -0,0 +1,12 @@ +urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]); +?> +Hello username ?>, + +Follow the link below to reset your password: + + diff --git a/common/models/Buys.php b/common/models/Buys.php new file mode 100755 index 0000000..9e94b80 --- /dev/null +++ b/common/models/Buys.php @@ -0,0 +1,75 @@ + 2, + 'max' => 255, + ], + + [ + 'email', + 'email', + ], + [ + [ + 'email', + 'phone', + ], + 'string', + 'max' => 255, + ], + + [ + 'phone', + 'required', + ], + [ + [ + 'phone', + 'model_name', + 'model_year', + 'model_color', + ], + 'safe', + ], + + ]; + } + + public function attributeLabels() + { + return [ + 'username' => 'Имя', + 'phone' => 'телефон', + 'email' => 'e-mail', + 'model_name' => '', + 'model_year' => '', + 'model_color' => '', + ]; + } + + } \ No newline at end of file diff --git a/common/models/Car.php b/common/models/Car.php new file mode 100755 index 0000000..8cb4040 --- /dev/null +++ b/common/models/Car.php @@ -0,0 +1,112 @@ + 255, + ], + [ + [ 'image' ], + 'safe', + ], + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'car_id' => Yii::t('app', 'Ідентификатор'), + 'model' => Yii::t('app', 'Модель'), + 'year' => Yii::t('app', 'Год производства'), + 'image' => Yii::t('app', 'Изображение'), + 'color' => Yii::t('app', 'Цвет'), + 'mileage' => Yii::t('app', 'Пробег'), + 'build' => Yii::t('app', 'Дата выпуска'), + 'option' => Yii::t('app', 'Доп. опции'), + 'price' => Yii::t('app', 'Цена'), + ]; + } + + public function upload() + { + /** + * @var UploadedFile $image + */ + $this->image = UploadedFile::getInstance($this, 'image'); + $image = $this->image; + if(!empty( $image )) { + $fullName = $image->baseName . time() . '.' . $image->extension; + $path = Yii::getAlias('@storage') . '/' . $fullName; + $image->saveAs($path); + $image->name = '/storage/' . $fullName; + } else { + $this->image = $this->getOldAttribute('image'); + } + return true; + } + } diff --git a/common/models/CarSearch.php b/common/models/CarSearch.php new file mode 100755 index 0000000..50ca4c4 --- /dev/null +++ b/common/models/CarSearch.php @@ -0,0 +1,127 @@ + $query, + 'pagination' => false, + ]); + + $this->load($params); + + if(!$this->validate()) { + // uncomment the following line if you do not want to return any records when validation fails + // $query->where('0=1'); + return $dataProvider; + } + + if($this->scenario == self::SCENARIO_PUBLIC) { + if(empty( $this->model )) { + $this->model = self::DEFAULT_MODEL; + }; + if(empty( $this->year )) { + $this->year = self::DEFAULT_YEAR; + }; + } + + // grid filtering conditions + $query->andFilterWhere([ + 'car_id' => $this->car_id, + 'year' => $this->year, + 'mileage' => $this->mileage, + 'build' => $this->build, + 'price' => $this->price, + 'model' => $this->model, + ]); + + $query->andFilterWhere([ + 'like', + 'image', + $this->image, + ]) + ->andFilterWhere([ + 'like', + 'color', + $this->color, + ]) + ->andFilterWhere([ + 'like', + 'option', + $this->option, + ]); + + return $dataProvider; + } + } diff --git a/common/models/Emails.php b/common/models/Emails.php new file mode 100755 index 0000000..bb0a4bb --- /dev/null +++ b/common/models/Emails.php @@ -0,0 +1,123 @@ + [ + 'username', + 'email', + 'phone', + ], + self::SCENARIO_QUESTION => [ + 'username', + 'email', + 'phone', + 'message' + ], + self::SCENARIO_BOOKING => [ + 'username', + 'email', + 'phone', + 'date_from', + 'date_to', + ], + self::SCENARIO_KEY => [ + 'username', + 'email', + 'phone', + 'date_count', + ], + ]; + return array_merge($scenario, $new_scenarios); + } + + public function rules() + { + return [ + [ + [ 'username' ], + 'string', + 'min' => 2, + 'max' => 255, + ], + + [ + 'email', + 'email', + ], + [ + [ + 'email', + 'phone', + ], + 'string', + 'max' => 255, + ], + + [ + 'phone', + 'required', + ], + [ + 'message', + 'string', + ], + [ + ['date_from', 'date_to'], + 'safe', + ], + [ + ['date_from', 'date_to'], + 'filter', + 'filter' => function($value) { + return strtotime($value); + } + ], + [ + 'date_count', + 'integer', + ], + ]; + } + + public function attributeLabels() + { + return [ + 'username' => \Yii::t('app', 'Имя'), + 'phone' => \Yii::t('app', 'телефон'), + 'email' => \Yii::t('app', 'e-mail'), + 'message' => \Yii::t('app', 'сообщение'), + 'date_to' => \Yii::t('app', 'дата проката до'), + 'date_from' => \Yii::t('app', 'дата проката с'), + 'date_count' => \Yii::t('app', 'количество дней'), + ]; + } + + } \ No newline at end of file diff --git a/common/models/LoginForm.php b/common/models/LoginForm.php new file mode 100755 index 0000000..afc1c23 --- /dev/null +++ b/common/models/LoginForm.php @@ -0,0 +1,78 @@ +hasErrors()) { + $user = $this->getUser(); + if (!$user || !$user->validatePassword($this->password)) { + $this->addError($attribute, 'Incorrect username or password.'); + } + } + } + + /** + * Logs in a user using the provided username and password. + * + * @return boolean whether the user is logged in successfully + */ + public function login() + { + if ($this->validate()) { + return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); + } else { + return false; + } + } + + /** + * Finds user by [[username]] + * + * @return User|null + */ + protected function getUser() + { + if ($this->_user === null) { + $this->_user = User::findByUsername($this->username); + } + + return $this->_user; + } +} diff --git a/common/models/Quest.php b/common/models/Quest.php new file mode 100755 index 0000000..73deeb4 --- /dev/null +++ b/common/models/Quest.php @@ -0,0 +1,41 @@ + 2, 'max' => 255], + + ['email', 'email'], + [['email','phone'], 'string', 'max' => 255], + + ['phone', 'required'], + [['phone','model_name','model_year','model_color'], 'safe'] + + ]; + } + + public function attributeLabels() + { + return [ + 'username' =>'Имя', + 'phone' =>'телефон', + 'email' =>'e-mail', + 'model_name' =>'', + 'model_year' =>'', + 'model_color' =>'', + ]; + } + + + + +} \ No newline at end of file diff --git a/common/models/Question.php b/common/models/Question.php new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/common/models/Question.php diff --git a/common/models/User.php b/common/models/User.php new file mode 100755 index 0000000..1c47566 --- /dev/null +++ b/common/models/User.php @@ -0,0 +1,189 @@ + self::STATUS_ACTIVE], + ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], + ]; + } + + /** + * @inheritdoc + */ + public static function findIdentity($id) + { + return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); + } + + /** + * @inheritdoc + */ + public static function findIdentityByAccessToken($token, $type = null) + { + throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); + } + + /** + * Finds user by username + * + * @param string $username + * @return static|null + */ + public static function findByUsername($username) + { + return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]); + } + + /** + * Finds user by password reset token + * + * @param string $token password reset token + * @return static|null + */ + public static function findByPasswordResetToken($token) + { + if (!static::isPasswordResetTokenValid($token)) { + return null; + } + + return static::findOne([ + 'password_reset_token' => $token, + 'status' => self::STATUS_ACTIVE, + ]); + } + + /** + * Finds out if password reset token is valid + * + * @param string $token password reset token + * @return boolean + */ + public static function isPasswordResetTokenValid($token) + { + if (empty($token)) { + return false; + } + + $timestamp = (int) substr($token, strrpos($token, '_') + 1); + $expire = Yii::$app->params['user.passwordResetTokenExpire']; + return $timestamp + $expire >= time(); + } + + /** + * @inheritdoc + */ + public function getId() + { + return $this->getPrimaryKey(); + } + + /** + * @inheritdoc + */ + public function getAuthKey() + { + return $this->auth_key; + } + + /** + * @inheritdoc + */ + public function validateAuthKey($authKey) + { + return $this->getAuthKey() === $authKey; + } + + /** + * Validates password + * + * @param string $password password to validate + * @return boolean if password provided is valid for current user + */ + public function validatePassword($password) + { + return Yii::$app->security->validatePassword($password, $this->password_hash); + } + + /** + * Generates password hash from password and sets it to the model + * + * @param string $password + */ + public function setPassword($password) + { + $this->password_hash = Yii::$app->security->generatePasswordHash($password); + } + + /** + * Generates "remember me" authentication key + */ + public function generateAuthKey() + { + $this->auth_key = Yii::$app->security->generateRandomString(); + } + + /** + * Generates new password reset token + */ + public function generatePasswordResetToken() + { + $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); + } + + /** + * Removes password reset token + */ + public function removePasswordResetToken() + { + $this->password_reset_token = null; + } +} diff --git a/common/modules/language/Module.php b/common/modules/language/Module.php new file mode 100755 index 0000000..683c729 --- /dev/null +++ b/common/modules/language/Module.php @@ -0,0 +1,11 @@ +_language_url === NULL) { + $this->_language_url = $this->getUrl(); + + $url_list = explode('/', $this->_language_url); + + $language_url = isset( $url_list[ 1 ] ) ? $url_list[ 1 ] : NULL; + Language::setCurrent($language_url); + + if($language_url !== NULL && $language_url === Language::getCurrent()->url && strpos($this->_language_url, Language::getCurrent()->url) === 1) { + $this->_language_url = substr($this->_language_url, strlen(Language::getCurrent()->url) + 1); + } + } + + + return $this->_language_url; + } + + protected function resolvePathInfo() + { + $pathInfo = $this->getLanguageUrl(); + + if(( $pos = strpos($pathInfo, '?') ) !== false) { + $pathInfo = substr($pathInfo, 0, $pos); + } + + $pathInfo = urldecode($pathInfo); + + if(!preg_match('%^(?: + [\x09\x0A\x0D\x20-\x7E] + | [\xC2-\xDF][\x80-\xBF] + | \xE0[\xA0-\xBF][\x80-\xBF] + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} + | \xED[\x80-\x9F][\x80-\xBF] + | \xF0[\x90-\xBF][\x80-\xBF]{2} + | [\xF1-\xF3][\x80-\xBF]{3} + | \xF4[\x80-\x8F][\x80-\xBF]{2} + )*$%xs', $pathInfo) + ) { + $pathInfo = utf8_encode($pathInfo); + } + + $scriptUrl = $this->getScriptUrl(); + $baseUrl = $this->getBaseUrl(); + + if(strpos($pathInfo, $scriptUrl) === 0) { + $pathInfo = substr($pathInfo, strlen($scriptUrl)); + } elseif($baseUrl === '' || strpos($pathInfo, $baseUrl) === 0) { + $pathInfo = substr($pathInfo, strlen($baseUrl)); + } elseif(isset( $_SERVER[ 'PHP_SELF' ] ) && strpos($_SERVER[ 'PHP_SELF' ], $scriptUrl) === 0) { + $pathInfo = substr($_SERVER[ 'PHP_SELF' ], strlen($scriptUrl)); + } else { + throw new InvalidConfigException('Unable to determine the path info of the current request.'); + } + + if($pathInfo === '/') { + $pathInfo = substr($pathInfo, 1); + } + + return (string) $pathInfo; + } + } \ No newline at end of file diff --git a/common/modules/language/components/LanguageUrlManager.php b/common/modules/language/components/LanguageUrlManager.php new file mode 100755 index 0000000..54f7a29 --- /dev/null +++ b/common/modules/language/components/LanguageUrlManager.php @@ -0,0 +1,36 @@ +url; + } else { + return '/'.$language->url.$url; + } + } + } \ No newline at end of file diff --git a/common/modules/language/migrations/m160829_104745_create_table_language.php b/common/modules/language/migrations/m160829_104745_create_table_language.php new file mode 100755 index 0000000..9394178 --- /dev/null +++ b/common/modules/language/migrations/m160829_104745_create_table_language.php @@ -0,0 +1,24 @@ +createTable('{{%language}}', [ + 'language_id' => $this->primaryKey(), + 'url' => $this->string()->notNull(), + 'local' => $this->string()->notNull(), + 'name' => $this->string()->notNull(), + 'default' => $this->boolean()->notNull()->defaultValue(false), + 'date_create' => $this->integer()->notNull(), + 'date_update' => $this->integer()->notNull(), + ]); + } + + public function down() + { + $this->dropTable('{{%language}}'); + } +} diff --git a/common/modules/language/migrations/m160829_105345_add_default_languages.php b/common/modules/language/migrations/m160829_105345_add_default_languages.php new file mode 100755 index 0000000..299e77d --- /dev/null +++ b/common/modules/language/migrations/m160829_105345_add_default_languages.php @@ -0,0 +1,43 @@ +batchInsert('{{%language}}', [ + 'language_id', + 'url', + 'local', + 'name', + 'default', + 'date_create', + 'date_update', + ], [ + [ + 1, + 'en', + 'en-EN', + 'English', + 0, + time(), + time(), + ], + [ + 2, + 'ru', + 'ru-RU', + 'Русский', + 1, + time(), + time(), + ], + ]); + } + + public function down() + { + $this->delete('{{%language}}', ['language_id' => [1, 2]]); + } +} diff --git a/common/modules/language/migrations/m160901_140639_add_ukrainian_language.php b/common/modules/language/migrations/m160901_140639_add_ukrainian_language.php new file mode 100755 index 0000000..0b33bfe --- /dev/null +++ b/common/modules/language/migrations/m160901_140639_add_ukrainian_language.php @@ -0,0 +1,34 @@ +batchInsert('{{%language}}', [ + 'language_id', + 'url', + 'local', + 'name', + 'default', + 'date_create', + 'date_update', + ], [ + [ + 3, + 'ua', + 'ua-UA', + 'Українська', + 0, + time(), + time(), + ], + ]); + } + + public function down() + { + $this->delete('{{%language}}', ['language_id' => [3]]); + } +} diff --git a/common/modules/language/models/Language.php b/common/modules/language/models/Language.php new file mode 100755 index 0000000..a542c54 --- /dev/null +++ b/common/modules/language/models/Language.php @@ -0,0 +1,166 @@ + [ + 'class' => 'yii\behaviors\TimestampBehavior', + 'attributes' => [ + ActiveRecord::EVENT_BEFORE_INSERT => [ + 'date_create', + 'date_update', + ], + ActiveRecord::EVENT_BEFORE_UPDATE => [ + 'date_update', + ], + ], + ], + ]; + } + + /** + * @inheritdoc + */ + public function rules() + { + return [ + [ + [ + 'url', + 'local', + 'name', + 'date_create', + 'date_update', + ], + 'required', + ], + [ + [ 'default' ], + 'boolean', + ], + [ + [ + 'date_create', + 'date_update', + ], + 'integer', + ], + [ + [ + 'url', + 'local', + 'name', + ], + 'string', + 'max' => 255, + ], + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'language_id' => Yii::t('app', 'Language ID'), + 'url' => Yii::t('app', 'Url'), + 'local' => Yii::t('app', 'Local'), + 'name' => Yii::t('app', 'Name'), + 'default' => Yii::t('app', 'Default'), + 'date_create' => Yii::t('app', 'Date Create'), + 'date_update' => Yii::t('app', 'Date Update'), + ]; + } + + /** + * Get current language + * + * @return null|Language + */ + public static function getCurrent() + { + if(self::$current === null) { + self::$current = self::getDefaultLanguage(); + } + return self::$current; + } + + /** + * Set current language by Url param + * + * @param null|string $url Language url param + */ + public static function setCurrent($url = null) { + $language = self::getLanguageByUrl($url); + self::$current = ($language === null) ? self::getDefaultLanguage() : $language; + Yii::$app->language = self::$current->local; + } + + /** + * Get default language + * + * @return null|Language + */ + public static function getDefaultLanguage() { + /** + * @var null|Language $language + */ + $language = self::find()->where(['default' => true])->one(); + return $language; + } + + /** + * Get language by Url param + * + * @param null|string $url Language url param + * + * @return null|Language + */ + public static function getLanguageByUrl($url = null) { + if($url === NULL) { + return NULL; + } else { + /** + * @var null|Language $language + */ + $language = self::find()->where(['url' => $url])->one(); + if($language === NULL) { + return NULL; + } else { + return $language; + } + } + } + } diff --git a/common/modules/language/readme.txt b/common/modules/language/readme.txt new file mode 100755 index 0000000..b16841a --- /dev/null +++ b/common/modules/language/readme.txt @@ -0,0 +1,32 @@ +1. Запускаем миграцию: php yii migrate --migrationPath=common/modules/language/migrations +2. Добавляем в файл конфигурации: +'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'class'=>'common\modules\language\components\LanguageUrlManager', + 'rules'=>[ + '/' => 'site/index', + '//*'=>'/', + ] +], +3. Добавляем в файл конфигурации: +'request' => [ + 'class' => 'common\modules\language\components\LanguageRequest' +], +4. Добавляем в файл конфигурации: +'language'=>'ru-RU', +'i18n' => [ + 'translations' => [ + '*' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@frontend/messages', + 'sourceLanguage' => 'en', + 'fileMap' => [ + ], + ], + ], +], +5. Переводы писать в файл frontend\messages\{language}\app.php, где {language} - нужный язык, например ru. +6. Для вывода на странице сообщения с переводом используем функцию: Yii::t('app', {message}, $params = [], $language = null), + где {message} - нужное сообщение, $params - массив параметров, $language - нужный язык (по умолчанию используется текущий язык). +7. В наличие также виджет переключения языка: LanguagePicker::widget() \ No newline at end of file diff --git a/common/modules/language/widgets/LanguagePicker.php b/common/modules/language/widgets/LanguagePicker.php new file mode 100755 index 0000000..fe4621f --- /dev/null +++ b/common/modules/language/widgets/LanguagePicker.php @@ -0,0 +1,22 @@ +render('view', [ + 'current' => Language::getCurrent(), + 'languages' => Language::find()->where(['!=', 'language_id', Language::getCurrent()->language_id])->all(), + ]); + } + } \ No newline at end of file diff --git a/common/modules/language/widgets/views/view.php b/common/modules/language/widgets/views/view.php new file mode 100755 index 0000000..892a796 --- /dev/null +++ b/common/modules/language/widgets/views/view.php @@ -0,0 +1,31 @@ + +
    + + name; + ?> + + +
      + +
    • + name, '/' . $language->url . Yii::$app->getRequest() + ->getLanguageUrl()); + ?> +
    • + +
    +
    diff --git a/common/translation/ru/app.php b/common/translation/ru/app.php new file mode 100755 index 0000000..922c563 --- /dev/null +++ b/common/translation/ru/app.php @@ -0,0 +1,154 @@ + 'ID', + 'username' => 'Имя', + 'surname' => 'Фамилия', + 'auth_key' => 'Auth Key', + 'password_hash' => 'Password Hash', + 'password_reset_token' => 'Password Reset Token', + 'email' => 'Логин (e-mail)', + 'phone' => 'Телефон', + 'status' => 'Статус', + 'created_at' => 'Created At', + 'updated_at' => 'Updated At', + 'verifyCode' => 'Код проверки', + 'password' => 'Пароль', + 'password_repeat' => 'Повторить пароль', + 'registration' => 'Регистрация', + 'message' => 'Этот {field} уже занят', + 'message_match_password' => 'Пароли не совпадают', + 'exit' => 'Выход', + 'enter' => 'Войти', + 'your_personal_area' => 'Вход в личный кабинет', + 'forgot_password' => 'Забыли пароль?', + 'rememberMe' => 'Запомнить меня', + 'articles' => 'Всего товаров', + 'code' => 'Код: {0}', + 'checkout' => 'оформить заказ', + 'sum' => 'Сумма', + 'continue_shopping' => 'продолжить покупки', + 'edit_personal_data' => 'Редактировать личные данные', + 'personal_data' => 'Личные данные', + 'my_orders' => 'Мои заказы', + 'bookmarks' => 'Закладки', + 'basket' => 'Корзина', + 'banner_id' => 'Banner ID', + 'image' => 'Изображение', + 'alt' => 'Описание', + 'title' => 'Заголовок', + 'url' => 'Ссылка', + 'width' => 'Ширина', + 'height' => 'Высота', + 'blog_id' => 'Blog ID', + 'user_id' => 'User ID', + 'name' => 'Название', + 'link' => 'Ссылка', + 'date_add' => 'Дата добавления', + 'user_add_id' => 'User Add ID', + 'view_count' => 'Количество просмотров', + 'description' => 'Описание', + 'cover' => 'Фото главное', + 'event_id' => 'Event ID', + 'alias' => 'Ссылка', + 'body' => 'Тело', + 'meta_title' => 'Мета заголовок', + 'h1' => 'H1', + 'seo_text' => 'Сео Текст', + 'end_at' => 'Срок действия по', + 'order_items_id' => 'Order Items ID', + 'order_id' => 'Order ID', + 'item_id' => 'Item ID', + 'item_count' => 'Количество', + 'price' => 'Цена', + 'customer_id' => 'Customer ID', + 'delivery' => 'Доставка', + 'payment' => 'Оплата', + 'seo_id' => 'Seo ID', + 'controller' => 'Controller', + 'seo_category_id' => 'Seo Category ID', + 'seo_dynamic_id' => 'Seo Dynamic ID', + 'action' => 'Action', + 'fields' => 'Поля', + 'param' => 'Параметры', + 'key' => 'Ключ', + 'service_id' => 'Service ID', + 'slider_id' => 'Slider ID', + 'speed' => 'Скорость', + 'duration' => 'Продолжительность', + 'slider_image_id' => 'Slider Image ID', + 'sort' => 'Сортировка', + 'Цвет' => 'Цвет', + 'year_made' => 'Год производства', + + 'citycar_chose' => 'Выбери свой
    идеальный
    CityCar', + 'enroll' => 'Записаться на тест драйв', + 'buy_leaf' => 'Купить Nissan Leaf', + 'why_leaf' => 'Почему Nissan Leaf', + 'why_leaf_line1' => '

    за 10 сек

    Разгон 0-100км/ч

    ', + 'why_leaf_line2' => '

    5 звезд

    Рейтинг безопасности

    ', + 'why_leaf_line3' => '

    152 км/ч

    Максимальная скорость

    ', + 'why_leaf_line4' => '

    от 5 до 7 часов

    Время полной зарядки

    ', + 'why_leaf_line5' => '

    от 15000 $

    Стоимость модели базовой комплектации

    ', + 'why_leaf_line6' => '

    по городу 150км в режиме эко 192 км

    Запас хода

    ', + 'why_we' => 'Почему мы', + 'why_we_line1' => '

    Лидер Украины в продаже и обслуживании электрокаров

    ', + 'why_we_line2' => '

    Производим экспертное консультирование

    ', + 'why_we_line3' => '

    Предлагаем тестирование перед осуществлением покупки

    ', + 'why_we_line4' => '

    Осуществляем полную проверку авто (подтверждаем карфаксом)

    ', + 'why_we_line5' => '

    Наиболее выгодные ценовые предложения

    ', + 'why_we_line6' => '

    Предоставляем полное гарантийное обслуживание

    ', + 'contacts' => 'Контакты', + 'contacts1' => 'проспект Степана Бандеры 9в', + 'kyiv' => 'Киев', + 'partners' => 'Наши партнеры', + 'rent_auto' => 'Аренда и прокат авто', + 'rent_auto1' => 'Выбери Nissan Leaf получи 3 дня аренды в подарок', + 'rent_auto2' => 'Почувствуй бесшумный ход, приятную езду, легкую управляемость автомобиля и нашу заботу. Только мы предоставляем нашим клиентам полную карту зарядных станций и подробно описываем условия доступа к разным операторам + осуществляем полную техническую помощь на дороге. Поэтому вам не придется ни о чем беспокоиться, а только наслаждаться поездкой в привычном для вас ритме жизни.', + 'rent_auto3' => 'Стоимость проката', + 'days' => 'дней', + 'week' => 'неделя', + 'weeks' => 'Недель', + 'month' => 'Месяц', + 'months' => 'месяцев', + + 'deposit' => 'Залоговый депозит', + 'dontforget1' => 'Не забудьте взять с собой', + 'dontforget2' => 'Паспорт', + 'dontforget3' => 'Идентификационный код', + 'dontforget4' => 'Водительские права', + 'rent1' => 'Что входит в стоимость проката', + 'rent2' => 'Страхование КАСКО', + 'rent3' => 'Профессиональная техническая помощь на дороге', + 'rent4' => 'Полный комплект необходимых аксессуаров', + 'rent_button' => 'Забронировать', + 'keytokey' => 'Акция "Ключ-на-ключ"', + 'keytokey11' => 'Специальное предложение от СЕО компании ElectroCars', + 'keytokey12' => 'Александра Кравцова для тех, кто решил познакомиться со всеми преимуществами электромобиля лично:', + 'keytokey2' => 'Два года существования проекта ElectroCars показали, что лучший аргумент перейти на электромобиль - дать попробовать пересесть на него хотя бы на несколько дней. После этого обычная машина кажется прошлым веком, а все страхи по имеющейся инфраструктуре для электромобилей и пробега на одном заряде исчезают.', + 'keytokey3' => 'Мы решили запустить проект "Ключ-на-ключ", чтобы дать возможность нашим друзьям попробовать электрокар, а нам вспомнить, что такое оставлять на заправке 1000 грн :)', + 'keytokey4' => 'Если вы имеете водительский стаж не менее 2-х лет, собственное авто и желание узнать, что значит водить электрокар, тогда вам нужно просто', + 'submit_but1' => 'Оставить заявку', + 'be_friend' => 'Стать
    нашим другом', + 'share_fb' => 'Поделиться вашими фото и впечатлениями от поездки на своей страничке в ФБ.', + 'chose_var' => 'Выбирайте оптимальный для себя вариант', + 'leaf_days3' => 'Leaf Викенд / 3 дня', + 'leaf_days5' => 'Leaf Будни / 5 дней', + + 'models' => 'Модельный ряд Nissan Leaf', + 'models2' => 'Модели Nissan Leaf в наличии', + + 'footer1' => 'Все права защищены.', + 'footer2' => 'Использование материалов сайта возможно только со ссылкой на источник.', + 'footer3' => 'Создание сайтов', + 'comment' => 'комментарий', + 'send' => 'отправить', + 'text_message' => 'Сообщение', + 'buy_but' => 'купить', + 'questions' => 'Остались вопросы?
    Напишите нам', + 'zapys' => 'записаться', + 'from' => 'с', + 'to' => 'по', + 'numdays' => 'Количество дней', + 'tsd_km' => 'тыс. км', + 'bron' => 'Дата брони', +]; \ No newline at end of file diff --git a/common/translation/ru/product.php b/common/translation/ru/product.php new file mode 100755 index 0000000..a237a7e --- /dev/null +++ b/common/translation/ru/product.php @@ -0,0 +1,30 @@ + 'Категории', + 'Create Category' => 'Создать Категорию', + 'Name' => 'Наименование', + 'Remote ID' => 'ID в 1С', + 'Search for "{keywords}"' => 'Поиск по "{keywords}"', + 'Search for "{keywords}" in category "{category}"' => 'Поиск по "{keywords}" в категории "{category}"', + 'Promo products' => 'Акционные товары', + 'New products' => 'Новинки', + 'Top products' => 'Популярные', + 'Similar products' => 'Похожие товары', + 'Brands' => 'Бренды', + 'Brand' => 'Бренд', + 'Categories' => 'Категории', + 'Category' => 'Категория', + 'Select brand' => 'Выберите бренд', + 'Select category' => 'Выберите категорию', + 'SKU' => 'Артикул', + 'Stock' => 'Остаток', + 'Price' => 'Цена', + 'Price Old' => 'Старая Цена', + 'Products' => 'Товары', + 'Product' => 'Товар', + 'Variants' => 'Модификации', + 'Variant' => 'Модификация', + 'Create Product' => 'Создать Товар', + 'Enable' => 'Доступно', + 'Disable' => 'Отсутсвует', +]; \ No newline at end of file diff --git a/common/translation/ua/app.php b/common/translation/ua/app.php new file mode 100755 index 0000000..21559fd --- /dev/null +++ b/common/translation/ua/app.php @@ -0,0 +1,169 @@ + 'ID', + 'username' => "Ім'я", + 'surname' => 'Фамилия', + 'auth_key' => 'Auth Key', + 'password_hash' => 'Password Hash', + 'password_reset_token' => 'Password Reset Token', + 'email' => 'Логин (e-mail)', + 'phone' => 'Телефон', + 'status' => 'Статус', + 'created_at' => 'Created At', + 'updated_at' => 'Updated At', + 'verifyCode' => 'Код проверки', + 'password' => 'Пароль', + 'password_repeat' => 'Повторить пароль', + 'registration' => 'Регистрация', + 'message' => 'Этот {field} уже занят', + 'message_match_password' => 'Пароли не совпадают', + 'exit' => 'Выход', + 'enter' => 'Войти', + 'your_personal_area' => 'Вход в личный кабинет', + 'forgot_password' => 'Забыли пароль?', + 'rememberMe' => 'Запомнить меня', + 'articles' => 'Всего товаров', + 'code' => 'Код: {0}', + 'checkout' => 'оформить заказ', + 'sum' => 'Сумма', + 'continue_shopping' => 'продолжить покупки', + 'edit_personal_data' => 'Редактировать личные данные', + 'personal_data' => 'Личные данные', + 'my_orders' => 'Мои заказы', + 'bookmarks' => 'Закладки', + 'basket' => 'Корзина', + 'banner_id' => 'Banner ID', + 'image' => 'Изображение', + 'alt' => 'Описание', + 'title' => 'Заголовок', + 'url' => 'Ссылка', + 'width' => 'Ширина', + 'height' => 'Высота', + 'blog_id' => 'Blog ID', + 'user_id' => 'User ID', + 'name' => 'Название', + 'link' => 'Ссылка', + 'date_add' => 'Дата добавления', + 'user_add_id' => 'User Add ID', + 'view_count' => 'Количество просмотров', + 'description' => 'Описание', + 'cover' => 'Фото главное', + 'event_id' => 'Event ID', + 'alias' => 'Ссылка', + 'body' => 'Тело', + 'meta_title' => 'Мета заголовок', + 'h1' => 'H1', + 'seo_text' => 'Сео Текст', + 'end_at' => 'Срок действия по', + 'order_items_id' => 'Order Items ID', + 'order_id' => 'Order ID', + 'item_id' => 'Item ID', + 'item_count' => 'Количество', + 'price' => 'Цена', + 'customer_id' => 'Customer ID', + 'delivery' => 'Доставка', + 'payment' => 'Оплата', + 'seo_id' => 'Seo ID', + 'controller' => 'Controller', + 'seo_category_id' => 'Seo Category ID', + 'seo_dynamic_id' => 'Seo Dynamic ID', + 'action' => 'Action', + 'fields' => 'Поля', + 'param' => 'Параметры', + 'key' => 'Ключ', + 'service_id' => 'Service ID', + 'slider_id' => 'Slider ID', + 'speed' => 'Скорость', + 'duration' => 'Продолжительность', + 'slider_image_id' => 'Slider Image ID', + 'sort' => 'Сортировка', + 'Цвет' => 'Колір', + 'Пробег' => 'Пробіг', + 'Дата выпуска' => 'Дата випуску', + 'Доп. опции' => 'Дод. опції', + 'черный' => 'Чорний', + 'year_made' => 'Рік виробництва', + + 'citycar_chose' => 'Обери
    свій ідеальний
    CityCar', + 'enroll' => 'Записатись на тест драйв', + 'buy_leaf' => 'Купити Nissan Leaf', + 'why_leaf' => 'Чому Nissan Leaf', + 'why_leaf_line1' => '

    за 10 сек

    Розгін 0-100км/ч

    ', + 'why_leaf_line2' => '

    5 зірок

    Рейтинг безпеки

    ', + 'why_leaf_line3' => '

    152 км/ч

    Максимальна швидкість

    ', + 'why_leaf_line4' => '

    від 5 до 7 годин

    Час повної зарядки

    ', + 'why_leaf_line5' => '

    запас ходу - по місту 150км в режимі еко 192 км

    Запас ходу

    ', + 'why_leaf_line6' => '

    від 15000 у.о.

    Вартість моделі базової комплектації

    ', + 'why_we' => 'Чому ми', + 'why_we_line1' => '

    Лідер України з продажу і обслуговування електрокарів

    ', + 'why_we_line2' => '

    Надаємо експертне консультування

    ', + 'why_we_line3' => '

    Пропонуємо тестування перед здійсненням покупки

    ', + 'why_we_line4' => '

    Здійснюємо повну перевірку авто (підтверджуємо карфаксом)

    ', + 'why_we_line5' => '

    Найбільш вигідні цінові пропозиції

    ', + 'why_we_line6' => '

    Надаємо повне гарантійне обслуговування

    ', + 'contacts' => 'Контакти', + 'contacts1' => 'вул. Набережно-Лугова, 4', + 'kyiv' => 'Київ', + 'partners' => 'Наші партнери', + 'rent_auto' => 'Оренда и прокат авто', + 'rent_auto1' => 'Обери Nissan Leaf отримай 3 дні оренди в подарунок', + 'rent_auto2' => 'Відчуй безшумний хід, приємну їзду, легку керованість автомобіля і нашу турботу. Тільки ми надаємо нашим клієнтам повну карту зарядних станцій і детально описуємо умови доступу до різних операторів + здійснюємо повну технічну допомогу на дорозі. Тож вам не доведеться ні про що турбуватися, а тільки насолоджуватися поїздкою в звичному для вас ритмі життя', + 'rent_auto3' => 'Вартість прокату', + 'days' => 'днів', + 'week' => 'тиждень', + 'weeks' => 'Тижнів', + 'month' => 'Місяць', + 'months' => 'місяців', + + 'deposit' => 'Заставний депозит', + 'dontforget1' => 'Не забудьте взяти з собою', + 'dontforget2' => 'Паспорт', + 'dontforget3' => 'Ідентифікаційний код', + 'dontforget4' => 'Водійські права', + 'rent1' => 'Що входить у вартість прокату', + 'rent2' => 'Страхування КАСКО', + 'rent3' => 'Професійна технічна допомога на дорозі', + 'rent4' => 'Повний Комплект необхідних аксесуарів', + 'rent_button' => 'Забронювати', + 'keytokey' => 'Акція "Ключ-на-ключ"', + 'keytokey11' => 'Спеціальна пропозиція
    від СЕО компанії ElectroCars', + 'keytokey12' => 'Олександра Кравцова для тих, хто вирішив познайомитися з усіма перевагами електромобіля особисто', + 'keytokey2' => 'Два роки проекту ElectroCars показали, що найкращий аргумент перейти на електромобіль - дати спробувати пересісти на нього бодай на кілька днів. Після цього звичайна автівка видається минулим століттям, а всі страхи щодо наявної інфраструктури для електромобілів, проїзду на одній зарядці зникають.', + 'keytokey3' => 'Ми вирішили запустити проект "Ключ-на-ключ", щоб дати змогу нашим друзям спробувати електрокар, а нам згадати, що таке залишати на заправці 1000 грн :)', + 'keytokey4' => 'Якщо ви маєте водійський стаж не менше 2-х років, власне авто і бажання дізнатися, що означає керувати електрокаром, тоді вам потрібно просто', + 'submit_but1' => 'Залишити заявку', + 'be_friend' => 'Стати
    нашим другом', + 'share_fb' => 'Поділитися вашими фото та враженнями від поїздки на своїй сторінці в ФБ.', + 'chose_var' => 'Обирайте оптимальний для себе варіант', + 'leaf_days3' => 'Leaf Вікенд / 3 дні', + 'leaf_days5' => 'Leaf Будні / 5 днів', + + 'models' => 'Модельний ряд Nissan Leaf', + 'models2' => 'Моделі Nissan Leaf в наявності', + + 'footer1' => 'Усі права захищені.', + 'footer2' => 'Використання матеріалів сайту можливо лише із посиланням на джерело.', + 'footer3' => 'Створення сайтів', + 'comment' => 'коментар', + 'send' => 'надіслати', + 'text_message' => 'повідомлення', + 'buy_but' => 'купити', + 'questions' => 'Залишились питання?
    Напишіть нам', + 'zapys' => 'записатись', + 'from' => 'з', + 'to' => 'по', + 'numdays' => 'кількість днів', + 'tsd_km' => 'тис. км', + 'Черный' => 'Чорний', + 'Белый' => 'Білий', + 'Графитовый' => 'Графітовий', + 'Голубой' => 'Блакитний', + 'Серебристый' => 'Сріблястий', + 'Красный' => 'Червоний', + 'Центральный замок, иммобилайзер, подушки безопасности (Airbag) 8 шт., ABS, ESP, электроусилитель руля, стеклоподъемники 4-ох окон, бортовой компьютер, климат-контроль, подогрев 4-ох сидений, бесключевой доступ, заводка с кнопки, подогрев руля, bluetooth, hands free, круиз-контроль, многофункциональная мультимедийная система Nissan Connect: AM/FM/CD/MP3, навигационная система, камера заднего вида, музыка BOSE, легкосплавные диски R16.' => 'Центральний замок, іммобілайзер, подушки безпеки (Airbag) 8 шт., ABS, ESP, електропідсилювач керма, склопідйомники 4-ох вікон, бортовий комп\'ютер, клімат-контроль, підігрів 4-ох сидінь, безключовий доступ, заводка з кнопки, підігрів керма, bluetooth, hands free, круїз-контроль, багатофункціональна мультимедійна система Nissan Connect: AM/FM/CD/MP3, навігаційна система, камера заднього виду, музика BOSE, легкосплавні диски R16.', + 'Центральный замок, иммобилайзер, подушки безопасности (Airbag) 8 шт., ABS, ESP, электроусилитель руля, стеклоподъемники 4-ох окон, бортовой компьютер, климат-контроль, подогрев 4-ох сидений, бесключевой доступ, заводка с кнопки, подогрев руля, bluetooth, hands free, камера заднего вида, круиз-контроль, многофункциональная мультимедийная система Nissan Connect: AM/FM/CD/MP3, навигационная система, камера заднего вида, легкосплавные диски R16.' => 'Центральний замок, іммобілайзер, подушки безпеки (Airbag) 8 шт., ABS, ESP, електропідсилювач керма, склопідйомники 4-ох вікон, бортовий комп\'ютер, клімат-контроль, підігрів 4-ох сидінь, безключовий доступ, заводка з кнопки, підігрів керма, bluetooth, hands free, круїз-контроль, багатофункціональна мультимедійна система Nissan Connect: AM/FM/CD/MP3, навігаційна система, камера заднього виду, легкосплавні диски R16.', + 'Центральный замок, иммобилайзер, подушки безопасности (Airbag) 8 шт., ABS, ESP, электроусилитель руля, стеклоподъемники 4-ох окон, бортовой компьютер, климат-контроль, подогрев 4-ох сидений, бесключевой доступ, заводка с кнопки, подогрев руля, bluetooth, hands free.' => 'Центральний замок, іммобілайзер, подушки безпеки (Airbag) 8 шт., ABS, ESP, електропідсилювач керма, склопідйомники 4-ох вікон, бортовий комп\'ютер, клімат-контроль, підігрів 4-ох сидінь, безключовий доступ, заводка з кнопки, підігрів керма, bluetooth, hands free.', + 'Центральный замок, иммобилайзер, подушки безопасности (Airbag) 8 шт., ABS, ESP, электроусилитель руля, стеклоподъемники 4-ох окон, бортовой компьютер, климат-контроль, подогрев 4-ох сидений, бесключевой доступ, заводка с кнопки, подогрев руля, bluetooth, hands free, камера заднего вида.' => 'Центральний замок, іммобілайзер, подушки безпеки (Airbag) 8 шт., ABS, ESP, електропідсилювач керма, склопідйомники 4-ох вікон, бортовий комп\'ютер, клімат-контроль, підігрів 4-ох сидінь, безключовий доступ, заводка з кнопки, підігрів керма, bluetooth, hands free, камера заднього виду.', + 'Центральный замок, иммобилайзер, 8 шт. подушек безопасности (Airbag), ABS, ESP, электроусилитель руля, стеклоподъемники 4-ох окон, бортовой компьютер, климат-контроль, подогрев 4-ох сидений, бесключевой доступ, подогрев руля, bluetooth, hands free, заводка с кнопки, камера заднего вида, порт CHADEMO.' => 'Центральний замок, іммобілайзер, подушки безпеки (Airbag) 8 шт., ABS, ESP, електропідсилювач керма, склопідйомники 4-ох вікон, бортовий комп\'ютер, клімат-контроль, підігрів 4-ох сидінь, безключовий доступ, підігрів керма, bluetooth, hands free, заводка з кнопки, камера заднього виду, порт CHADEMO.', + 'Камера заднего вида, порт CHADEMO' => 'Камера заднього виду, порт CHADEMO', +]; \ No newline at end of file diff --git a/common/translation/ua/product.php b/common/translation/ua/product.php new file mode 100755 index 0000000..a237a7e --- /dev/null +++ b/common/translation/ua/product.php @@ -0,0 +1,30 @@ + 'Категории', + 'Create Category' => 'Создать Категорию', + 'Name' => 'Наименование', + 'Remote ID' => 'ID в 1С', + 'Search for "{keywords}"' => 'Поиск по "{keywords}"', + 'Search for "{keywords}" in category "{category}"' => 'Поиск по "{keywords}" в категории "{category}"', + 'Promo products' => 'Акционные товары', + 'New products' => 'Новинки', + 'Top products' => 'Популярные', + 'Similar products' => 'Похожие товары', + 'Brands' => 'Бренды', + 'Brand' => 'Бренд', + 'Categories' => 'Категории', + 'Category' => 'Категория', + 'Select brand' => 'Выберите бренд', + 'Select category' => 'Выберите категорию', + 'SKU' => 'Артикул', + 'Stock' => 'Остаток', + 'Price' => 'Цена', + 'Price Old' => 'Старая Цена', + 'Products' => 'Товары', + 'Product' => 'Товар', + 'Variants' => 'Модификации', + 'Variant' => 'Модификация', + 'Create Product' => 'Создать Товар', + 'Enable' => 'Доступно', + 'Disable' => 'Отсутсвует', +]; \ No newline at end of file diff --git a/common/widgets/Alert.php b/common/widgets/Alert.php new file mode 100755 index 0000000..93d2736 --- /dev/null +++ b/common/widgets/Alert.php @@ -0,0 +1,81 @@ +session->setFlash('error', 'This is the message'); + * Yii::$app->session->setFlash('success', 'This is the message'); + * Yii::$app->session->setFlash('info', 'This is the message'); + * ``` + * + * Multiple messages could be set as follows: + * + * ```php + * Yii::$app->session->setFlash('error', ['Error 1', 'Error 2']); + * ``` + * + * @author Kartik Visweswaran + * @author Alexander Makarov + */ +class Alert extends \yii\bootstrap\Widget +{ + /** + * @var array the alert types configuration for the flash messages. + * This array is setup as $key => $value, where: + * - $key is the name of the session flash variable + * - $value is the bootstrap alert type (i.e. danger, success, info, warning) + */ + public $alertTypes = [ + 'error' => 'alert-danger', + 'danger' => 'alert-danger', + 'success' => 'alert-success', + 'info' => 'alert-info', + 'warning' => 'alert-warning' + ]; + /** + * @var array the options for rendering the close button tag. + */ + public $closeButton = []; + + + public function init() + { + parent::init(); + + $session = Yii::$app->session; + $flashes = $session->getAllFlashes(); + $appendCss = isset($this->options['class']) ? ' ' . $this->options['class'] : ''; + + foreach ($flashes as $type => $data) { + if (isset($this->alertTypes[$type])) { + $data = (array) $data; + foreach ($data as $i => $message) { + /* initialize css class for each alert box */ + $this->options['class'] = $this->alertTypes[$type] . $appendCss; + + /* assign unique id to each alert box */ + $this->options['id'] = $this->getId() . '-' . $type . '-' . $i; + + echo \yii\bootstrap\Alert::widget([ + 'body' => $message, + 'closeButton' => $this->closeButton, + 'options' => $this->options, + ]); + } + + $session->removeFlash($type); + } + } + } +} diff --git a/common/widgets/Mailer.php b/common/widgets/Mailer.php new file mode 100755 index 0000000..26332f8 --- /dev/null +++ b/common/widgets/Mailer.php @@ -0,0 +1,50 @@ +IsSMTP(); + $mail->CharSet = 'UTF-8'; +// $mail->SMTPDebug = 1; + $mail->SMTPAuth = true; + $mail->SMTPSecure = 'ssl'; + $mail->Host = "smtp.gmail.com"; + $mail->Port = 465; // or 587 + $mail->IsHTML(true); + $mail->Username = "login@gmail.com"; // Google email account + $mail->Password = "password"; // Password to this account + $mail->SetFrom("leaf@electrocars.ua"); + $mail->isHTML(true); + $mail->Subject = $this->subject; + $mail->Body = $this->render($this->type, ['params' => $this->params]); + $mail->AddAddress('zhegal@gmail.com'); + $mail->AddAddress('pmartweb1@gmail.com'); + if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; + } else { + echo "Message has been sent"; + } + } + +} + diff --git a/common/widgets/views/booking.php b/common/widgets/views/booking.php new file mode 100755 index 0000000..0865251 --- /dev/null +++ b/common/widgets/views/booking.php @@ -0,0 +1,5 @@ +Name:
    +Phone:
    +Email:
    +From:
    +To:
    \ No newline at end of file diff --git a/common/widgets/views/buy.php b/common/widgets/views/buy.php new file mode 100755 index 0000000..0e38417 --- /dev/null +++ b/common/widgets/views/buy.php @@ -0,0 +1,6 @@ +Name:
    +Phone:
    +Email:
    +Model:
    +Year:
    +Color: \ No newline at end of file diff --git a/common/widgets/views/keytokey.php b/common/widgets/views/keytokey.php new file mode 100755 index 0000000..63eaaa5 --- /dev/null +++ b/common/widgets/views/keytokey.php @@ -0,0 +1,4 @@ +Name:
    +Phone:
    +Email:
    +Days: days
    \ No newline at end of file diff --git a/common/widgets/views/question.php b/common/widgets/views/question.php new file mode 100755 index 0000000..dadd896 --- /dev/null +++ b/common/widgets/views/question.php @@ -0,0 +1,4 @@ +Name:
    +Phone:
    +Email:
    +Text:
    \ No newline at end of file diff --git a/common/widgets/views/questions.php b/common/widgets/views/questions.php new file mode 100755 index 0000000..8804ed4 --- /dev/null +++ b/common/widgets/views/questions.php @@ -0,0 +1,3 @@ +Name:
    +Phone:
    +Email:
    \ No newline at end of file diff --git a/common/widgets/views/test.php b/common/widgets/views/test.php new file mode 100755 index 0000000..aa959ad --- /dev/null +++ b/common/widgets/views/test.php @@ -0,0 +1,2 @@ +Name:
    +Phone:
    \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100755 index 0000000..1da9c36 --- /dev/null +++ b/composer.json @@ -0,0 +1,43 @@ +{ + "name": "yiisoft/yii2-app-advanced", + "description": "Yii 2 Advanced Project Template", + "keywords": ["yii2", "framework", "advanced", "project template"], + "homepage": "http://www.yiiframework.com/", + "type": "project", + "license": "BSD-3-Clause", + "support": { + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "forum": "http://www.yiiframework.com/forum/", + "wiki": "http://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/yii2" + }, + "minimum-stability": "dev", + "require": { + "php": ">=5.4.0", + "yiisoft/yii2": ">=2.0.6", + "phpmailer/phpmailer": "^5.2", + "yiisoft/yii2-bootstrap": "*", + "yiisoft/yii2-jui": "~2.0.0", + "yiisoft/yii2-swiftmailer": "*", + "kartik-v/yii2-widget-fileinput": "@dev" + }, + "require-dev": { + "yiisoft/yii2-codeception": "*", + "yiisoft/yii2-debug": "*", + "yiisoft/yii2-gii": "*", + "yiisoft/yii2-faker": "*" + }, + "config": { + "process-timeout": 1800 + }, + "extra": { + "asset-installer-paths": { + "npm-asset-library": "vendor/npm", + "bower-asset-library": "vendor/bower" + } + }, + "scripts": { + "post-install-cmd": "php init --env=Development --overwrite=n" + } +} diff --git a/composer.lock b/composer.lock new file mode 100755 index 0000000..4517d12 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1211 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "7ec2028a77e36e45dcb343058fbac059", + "content-hash": "b12c59124f1c9351d06c60758a6f1a3f", + "packages": [ + { + "name": "bower-asset/bootstrap", + "version": "v3.3.5", + "source": { + "type": "git", + "url": "https://github.com/twbs/bootstrap.git", + "reference": "16b48259a62f576e52c903c476bd42b90ab22482" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/16b48259a62f576e52c903c476bd42b90ab22482", + "reference": "16b48259a62f576e52c903c476bd42b90ab22482", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.9.1" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": [ + "less/bootstrap.less", + "dist/js/bootstrap.js" + ], + "bower-asset-ignore": [ + "/.*", + "_config.yml", + "CNAME", + "composer.json", + "CONTRIBUTING.md", + "docs", + "js/tests", + "test-infra" + ] + }, + "license": [ + "MIT" + ], + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "keywords": [ + "css", + "framework", + "front-end", + "js", + "less", + "mobile-first", + "responsive", + "web" + ] + }, + { + "name": "bower-asset/jquery", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/jquery/jquery-dist.git", + "reference": "c0185ab7c75aab88762c5aae780b9d83b80eda72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/c0185ab7c75aab88762c5aae780b9d83b80eda72", + "reference": "c0185ab7c75aab88762c5aae780b9d83b80eda72", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "dist/jquery.js", + "bower-asset-ignore": [ + "package.json" + ] + }, + "license": [ + "MIT" + ], + "keywords": [ + "browser", + "javascript", + "jquery", + "library" + ] + }, + { + "name": "bower-asset/jquery-ui", + "version": "1.11.4", + "source": { + "type": "git", + "url": "https://github.com/components/jqueryui.git", + "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1", + "reference": "c34f8dbf3ba57b3784b93f26119f436c0e8288e1", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.6" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": [ + "jquery-ui.js" + ], + "bower-asset-ignore": [] + } + }, + { + "name": "bower-asset/jquery.inputmask", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/RobinHerbots/jquery.inputmask.git", + "reference": "5a72c563b502b8e05958a524cdfffafe9987be38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/5a72c563b502b8e05958a524cdfffafe9987be38", + "reference": "5a72c563b502b8e05958a524cdfffafe9987be38", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.7" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": [ + "./dist/inputmask/inputmask.js" + ], + "bower-asset-ignore": [ + "**/*", + "!dist/*", + "!dist/inputmask/*", + "!dist/min/*", + "!dist/min/inputmask/*", + "!extra/bindings/*", + "!extra/dependencyLibs/*", + "!extra/phone-codes/*" + ] + }, + "license": [ + "http://opensource.org/licenses/mit-license.php" + ], + "description": "jquery.inputmask is a jquery plugin which create an input mask.", + "keywords": [ + "form", + "input", + "inputmask", + "jquery", + "mask", + "plugins" + ] + }, + { + "name": "bower-asset/punycode", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/bestiejs/punycode.js.git", + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "punycode.js", + "bower-asset-ignore": [ + "coverage", + "tests", + ".*", + "component.json", + "Gruntfile.js", + "node_modules", + "package.json" + ] + } + }, + { + "name": "bower-asset/yii2-pjax", + "version": "v2.0.6", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/jquery-pjax.git", + "reference": "60728da6ade5879e807a49ce59ef9a72039b8978" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978", + "reference": "60728da6ade5879e807a49ce59ef9a72039b8978", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.8" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "./jquery.pjax.js", + "bower-asset-ignore": [ + ".travis.yml", + "Gemfile", + "Gemfile.lock", + "CONTRIBUTING.md", + "vendor/", + "script/", + "test/" + ] + }, + "license": [ + "MIT" + ] + }, + { + "name": "cebe/markdown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "04bfcaa26356cf86c6c4a2420eb95857a86e03ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/04bfcaa26356cf86c6c4a2420eb95857a86e03ab", + "reference": "04bfcaa26356cf86c6c4a2420eb95857a86e03ab", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "time": "2016-06-20 21:09:53" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.7.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "ae1828d955112356f7677c465f94f7deb7d27a40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40", + "reference": "ae1828d955112356f7677c465f94f7deb7d27a40", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "time": "2015-08-05 01:03:42" + }, + { + "name": "kartik-v/bootstrap-fileinput", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/kartik-v/bootstrap-fileinput.git", + "reference": "8dd9021a6678d176bdbcd1e7cbb8c8b4169e50e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kartik-v/bootstrap-fileinput/zipball/8dd9021a6678d176bdbcd1e7cbb8c8b4169e50e8", + "reference": "8dd9021a6678d176bdbcd1e7cbb8c8b4169e50e8", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "kartik\\plugins\\fileinput\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kartik Visweswaran", + "email": "kartikv2@gmail.com", + "homepage": "http://www.krajee.com/" + } + ], + "description": "An enhanced HTML 5 file input for Bootstrap 3.x with features for file preview for many file types, multiple selection, ajax uploads, and more.", + "homepage": "https://github.com/kartik-v/bootstrap-fileinput", + "keywords": [ + "ajax", + "bootstrap", + "delete", + "file", + "image", + "input", + "jquery", + "multiple", + "preview", + "progress", + "upload" + ], + "time": "2016-07-11 09:07:59" + }, + { + "name": "kartik-v/yii2-krajee-base", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/kartik-v/yii2-krajee-base.git", + "reference": "473fb568ff1144dc49bdb74f40a5d7f025fc72e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kartik-v/yii2-krajee-base/zipball/473fb568ff1144dc49bdb74f40a5d7f025fc72e4", + "reference": "473fb568ff1144dc49bdb74f40a5d7f025fc72e4", + "shasum": "" + }, + "require": { + "yiisoft/yii2-bootstrap": "@dev" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "kartik\\base\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kartik Visweswaran", + "email": "kartikv2@gmail.com", + "homepage": "http://www.krajee.com/" + } + ], + "description": "Base library and foundation components for all Yii2 Krajee extensions.", + "homepage": "https://github.com/kartik-v/yii2-krajee-base", + "keywords": [ + "base", + "extension", + "foundation", + "krajee", + "widget", + "yii2" + ], + "time": "2016-06-02 16:20:24" + }, + { + "name": "kartik-v/yii2-widget-fileinput", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/kartik-v/yii2-widget-fileinput.git", + "reference": "b0fb41e4290fc4aa35a49a977bf4484cb30f8ff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kartik-v/yii2-widget-fileinput/zipball/b0fb41e4290fc4aa35a49a977bf4484cb30f8ff9", + "reference": "b0fb41e4290fc4aa35a49a977bf4484cb30f8ff9", + "shasum": "" + }, + "require": { + "kartik-v/bootstrap-fileinput": "~4.2", + "kartik-v/yii2-krajee-base": "~1.7" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "kartik\\file\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kartik Visweswaran", + "email": "kartikv2@gmail.com", + "homepage": "http://www.krajee.com/" + } + ], + "description": "An enhanced FileInput widget for Bootstrap 3.x with file preview, multiple selection, and more features (sub repo split from yii2-widgets)", + "homepage": "https://github.com/kartik-v/yii2-widget-fileinput", + "keywords": [ + "extension", + "file", + "form", + "input", + "jquery", + "plugin", + "upload", + "widget", + "yii2" + ], + "time": "2016-07-06 19:27:12" + }, + { + "name": "phpmailer/phpmailer", + "version": "v5.2.16", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "1d85f9ef3ecfc42bbc4f3c70d5e37ca9a65f629a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/1d85f9ef3ecfc42bbc4f3c70d5e37ca9a65f629a", + "reference": "1d85f9ef3ecfc42bbc4f3c70d5e37ca9a65f629a", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "*", + "phpunit/phpunit": "4.7.*" + }, + "suggest": { + "league/oauth2-google": "Needed for Google XOAUTH2 authentication" + }, + "type": "library", + "autoload": { + "classmap": [ + "class.phpmailer.php", + "class.phpmaileroauth.php", + "class.phpmaileroauthgoogle.php", + "class.smtp.php", + "class.pop3.php", + "extras/EasyPeasyICS.php", + "extras/ntlm_sasl_client.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "time": "2016-06-06 09:09:37" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "17ba8f8fc03074f90771e52b226698e37bc2c115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/17ba8f8fc03074f90771e52b226698e37bc2c115", + "reference": "17ba8f8fc03074f90771e52b226698e37bc2c115", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2016-07-09 18:06:48" + }, + { + "name": "yiisoft/yii2", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-framework.git", + "reference": "8c276b391701c3b5edfebc126da4e5361cfa0f01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/8c276b391701c3b5edfebc126da4e5361cfa0f01", + "reference": "8c276b391701c3b5edfebc126da4e5361cfa0f01", + "shasum": "" + }, + "require": { + "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", + "bower-asset/jquery.inputmask": "~3.2.2", + "bower-asset/punycode": "1.3.*", + "bower-asset/yii2-pjax": "~2.0.1", + "cebe/markdown": "~1.0.0 | ~1.1.0", + "ext-ctype": "*", + "ext-mbstring": "*", + "ezyang/htmlpurifier": "~4.6", + "lib-pcre": "*", + "php": ">=5.4.0", + "yiisoft/yii2-composer": "~2.0.4" + }, + "bin": [ + "yii" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "http://www.yiiframework.com/", + "role": "Founder and project lead" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "http://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "http://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "http://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" + }, + { + "name": "Dmitry Naumenko", + "email": "d.naumenko.a@gmail.com", + "role": "Core framework development" + } + ], + "description": "Yii PHP Framework Version 2", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "framework", + "yii2" + ], + "time": "2016-07-14 09:38:26" + }, + { + "name": "yiisoft/yii2-bootstrap", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-bootstrap.git", + "reference": "a7a9282477c9e5f0d63c16b94652fd0fe039e79e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/a7a9282477c9e5f0d63c16b94652fd0fe039e79e", + "reference": "a7a9282477c9e5f0d63c16b94652fd0fe039e79e", + "shasum": "" + }, + "require": { + "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*", + "yiisoft/yii2": ">=2.0.6" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "asset-installer-paths": { + "npm-asset-library": "vendor/npm", + "bower-asset-library": "vendor/bower" + } + }, + "autoload": { + "psr-4": { + "yii\\bootstrap\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The Twitter Bootstrap extension for the Yii framework", + "keywords": [ + "bootstrap", + "yii2" + ], + "time": "2016-07-12 10:21:49" + }, + { + "name": "yiisoft/yii2-composer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-composer.git", + "reference": "e882cc327a6935a41f2e8665b9ef0317f6852d4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/e882cc327a6935a41f2e8665b9ef0317f6852d4d", + "reference": "e882cc327a6935a41f2e8665b9ef0317f6852d4d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "yii\\composer\\Plugin", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\composer\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The composer plugin for Yii extension installer", + "keywords": [ + "composer", + "extension installer", + "yii2" + ], + "time": "2016-06-05 20:34:32" + }, + { + "name": "yiisoft/yii2-jui", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-jui.git", + "reference": "1612593ac710975c235e75708b69fa9ee375ab46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-jui/zipball/1612593ac710975c235e75708b69fa9ee375ab46", + "reference": "1612593ac710975c235e75708b69fa9ee375ab46", + "shasum": "" + }, + "require": { + "bower-asset/jquery-ui": "1.11.*@stable", + "yiisoft/yii2": ">=2.0.4" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "asset-installer-paths": { + "npm-asset-library": "vendor/npm", + "bower-asset-library": "vendor/bower" + } + }, + "autoload": { + "psr-4": { + "yii\\jui\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The Jquery UI extension for the Yii framework", + "keywords": [ + "jQuery UI", + "yii2" + ], + "time": "2016-06-11 22:54:20" + }, + { + "name": "yiisoft/yii2-swiftmailer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-swiftmailer.git", + "reference": "163b9c6273e133c43a596aef46a9f5b1537731f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/163b9c6273e133c43a596aef46a9f5b1537731f9", + "reference": "163b9c6273e133c43a596aef46a9f5b1537731f9", + "shasum": "" + }, + "require": { + "swiftmailer/swiftmailer": "~5.0", + "yiisoft/yii2": ">=2.0.4" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\swiftmailer\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com" + } + ], + "description": "The SwiftMailer integration for the Yii framework", + "keywords": [ + "email", + "mail", + "mailer", + "swift", + "swiftmailer", + "yii2" + ], + "time": "2016-04-14 08:50:13" + } + ], + "packages-dev": [ + { + "name": "bower-asset/typeahead.js", + "version": "v0.11.1", + "source": { + "type": "git", + "url": "https://github.com/twitter/typeahead.js.git", + "reference": "588440f66559714280628a4f9799f0c4eb880a4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/588440f66559714280628a4f9799f0c4eb880a4a", + "reference": "588440f66559714280628a4f9799f0c4eb880a4a", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.7" + }, + "require-dev": { + "bower-asset/jasmine-ajax": "~1.3.1", + "bower-asset/jasmine-jquery": "~1.5.2", + "bower-asset/jquery": "~1.7" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "dist/typeahead.bundle.js" + } + }, + { + "name": "fzaninotto/faker", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "039eeba8a61788df89c7800eccb2c56723a0db34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/039eeba8a61788df89c7800eccb2c56723a0db34", + "reference": "039eeba8a61788df89c7800eccb2c56723a0db34", + "shasum": "" + }, + "require": { + "php": "^5.3.3|^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2016-07-11 08:36:05" + }, + { + "name": "phpspec/php-diff", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "time": "2016-04-07 12:29:16" + }, + { + "name": "yiisoft/yii2-codeception", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-codeception.git", + "reference": "572a6d46d942cc5733c45931fdbd1d60228f3c89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-codeception/zipball/572a6d46d942cc5733c45931fdbd1d60228f3c89", + "reference": "572a6d46d942cc5733c45931fdbd1d60228f3c89", + "shasum": "" + }, + "require": { + "yiisoft/yii2": ">=2.0.4" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\codeception\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Mark Jebri", + "email": "mark.github@yandex.ru" + } + ], + "description": "The Codeception integration for the Yii framework", + "keywords": [ + "codeception", + "yii2" + ], + "time": "2016-04-14 08:46:27" + }, + { + "name": "yiisoft/yii2-debug", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-debug.git", + "reference": "07ad6f410eb60c57345e4c687e53b097c40b4a6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/07ad6f410eb60c57345e4c687e53b097c40b4a6c", + "reference": "07ad6f410eb60c57345e4c687e53b097c40b4a6c", + "shasum": "" + }, + "require": { + "yiisoft/yii2": ">=2.0.4", + "yiisoft/yii2-bootstrap": "*" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\debug\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The debugger extension for the Yii framework", + "keywords": [ + "debug", + "debugger", + "yii2" + ], + "time": "2016-06-06 19:17:49" + }, + { + "name": "yiisoft/yii2-faker", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-faker.git", + "reference": "6e6eb430809e3f9c05e367303909a05a4912d4c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/6e6eb430809e3f9c05e367303909a05a4912d4c0", + "reference": "6e6eb430809e3f9c05e367303909a05a4912d4c0", + "shasum": "" + }, + "require": { + "fzaninotto/faker": "~1.4", + "yiisoft/yii2": "*" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\faker\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Mark Jebri", + "email": "mark.github@yandex.ru" + } + ], + "description": "Fixture generator. The Faker integration for the Yii framework.", + "keywords": [ + "Fixture", + "faker", + "yii2" + ], + "time": "2016-04-14 08:47:34" + }, + { + "name": "yiisoft/yii2-gii", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-gii.git", + "reference": "4f7bece043b6e60571ad855cd937bf0e07e1891d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/4f7bece043b6e60571ad855cd937bf0e07e1891d", + "reference": "4f7bece043b6e60571ad855cd937bf0e07e1891d", + "shasum": "" + }, + "require": { + "bower-asset/typeahead.js": "0.10.* | ~0.11.0", + "phpspec/php-diff": ">=1.0.2", + "yiisoft/yii2": ">=2.0.4", + "yiisoft/yii2-bootstrap": "~2.0" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "asset-installer-paths": { + "npm-asset-library": "vendor/npm", + "bower-asset-library": "vendor/bower" + } + }, + "autoload": { + "psr-4": { + "yii\\gii\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The Gii extension for the Yii framework", + "keywords": [ + "code generator", + "gii", + "yii2" + ], + "time": "2016-07-07 16:09:06" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "kartik-v/yii2-widget-fileinput": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.4.0" + }, + "platform-dev": [] +} diff --git a/console/config/.gitignore b/console/config/.gitignore new file mode 100755 index 0000000..20da318 --- /dev/null +++ b/console/config/.gitignore @@ -0,0 +1,2 @@ +main-local.php +params-local.php \ No newline at end of file diff --git a/console/config/bootstrap.php b/console/config/bootstrap.php new file mode 100755 index 0000000..b3d9bbc --- /dev/null +++ b/console/config/bootstrap.php @@ -0,0 +1 @@ + 'app-console', + 'basePath' => dirname(__DIR__), + 'bootstrap' => ['log'], + 'controllerNamespace' => 'console\controllers', + 'components' => [ + 'log' => [ + 'targets' => [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ], + ], + ], + 'params' => $params, +]; diff --git a/console/config/params.php b/console/config/params.php new file mode 100755 index 0000000..7f754b9 --- /dev/null +++ b/console/config/params.php @@ -0,0 +1,4 @@ + 'admin@example.com', +]; diff --git a/console/controllers/.gitkeep b/console/controllers/.gitkeep new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/console/controllers/.gitkeep diff --git a/console/migrations/m130524_201442_init.php b/console/migrations/m130524_201442_init.php new file mode 100755 index 0000000..6b649f4 --- /dev/null +++ b/console/migrations/m130524_201442_init.php @@ -0,0 +1,33 @@ +db->driverName === 'mysql') { + // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci + $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; + } + + $this->createTable('{{%user}}', [ + 'id' => $this->primaryKey(), + 'username' => $this->string()->notNull()->unique(), + 'auth_key' => $this->string(32)->notNull(), + 'password_hash' => $this->string()->notNull(), + 'password_reset_token' => $this->string()->unique(), + 'email' => $this->string()->notNull()->unique(), + + 'status' => $this->smallInteger()->notNull()->defaultValue(10), + 'created_at' => $this->integer()->notNull(), + 'updated_at' => $this->integer()->notNull(), + ], $tableOptions); + } + + public function down() + { + $this->dropTable('{{%user}}'); + } +} diff --git a/console/migrations/m160714_124817_create_car.php b/console/migrations/m160714_124817_create_car.php new file mode 100755 index 0000000..a3b6cee --- /dev/null +++ b/console/migrations/m160714_124817_create_car.php @@ -0,0 +1,29 @@ +createTable('car', [ + 'car_id' => $this->primaryKey(), + 'model' => $this->string() + ->notNull(), + 'year' => $this->integer() + ->notNull(), + 'image' => $this->string(), + 'color' => $this->string(), + 'mileage' => $this->float(), + 'build' => $this->integer(), + 'option' => $this->text(), + 'price' => $this->float(), + ]); + } + + public function down() + { + $this->dropTable('car'); + } + } diff --git a/console/migrations/m160714_132243_change_build_format.php b/console/migrations/m160714_132243_change_build_format.php new file mode 100755 index 0000000..842ecc8 --- /dev/null +++ b/console/migrations/m160714_132243_change_build_format.php @@ -0,0 +1,16 @@ +alterColumn('car', 'build', $this->string()); + } + + public function down() + { + $this->alterColumn('car', 'build', $this->integer()); + } +} diff --git a/console/models/.gitkeep b/console/models/.gitkeep new file mode 100755 index 0000000..72e8ffc --- /dev/null +++ b/console/models/.gitkeep @@ -0,0 +1 @@ +* diff --git a/console/runtime/.gitignore b/console/runtime/.gitignore new file mode 100755 index 0000000..c96a04f --- /dev/null +++ b/console/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/environments/dev/backend/config/main-local.php b/environments/dev/backend/config/main-local.php new file mode 100755 index 0000000..d9a8ceb --- /dev/null +++ b/environments/dev/backend/config/main-local.php @@ -0,0 +1,25 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], +]; + +if (!YII_ENV_TEST) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => 'yii\debug\Module', + ]; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => 'yii\gii\Module', + ]; +} + +return $config; diff --git a/environments/dev/backend/config/params-local.php b/environments/dev/backend/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/dev/backend/config/params-local.php @@ -0,0 +1,3 @@ +run(); diff --git a/environments/dev/backend/web/index.php b/environments/dev/backend/web/index.php new file mode 100755 index 0000000..6038167 --- /dev/null +++ b/environments/dev/backend/web/index.php @@ -0,0 +1,18 @@ +run(); diff --git a/environments/dev/common/config/main-local.php b/environments/dev/common/config/main-local.php new file mode 100755 index 0000000..43db30e --- /dev/null +++ b/environments/dev/common/config/main-local.php @@ -0,0 +1,20 @@ + [ + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=yii2advanced', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + ], + 'mailer' => [ + 'class' => 'yii\swiftmailer\Mailer', + 'viewPath' => '@common/mail', + // send all mails to a file by default. You have to set + // 'useFileTransport' to false and configure a transport + // for the mailer to send real emails. + 'useFileTransport' => true, + ], + ], +]; diff --git a/environments/dev/common/config/params-local.php b/environments/dev/common/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/dev/common/config/params-local.php @@ -0,0 +1,3 @@ + ['gii'], + 'modules' => [ + 'gii' => 'yii\gii\Module', + ], +]; diff --git a/environments/dev/console/config/params-local.php b/environments/dev/console/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/dev/console/config/params-local.php @@ -0,0 +1,3 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], +]; + +if (!YII_ENV_TEST) { + // configuration adjustments for 'dev' environment + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = [ + 'class' => 'yii\debug\Module', + ]; + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = [ + 'class' => 'yii\gii\Module', + ]; +} + +return $config; diff --git a/environments/dev/frontend/config/params-local.php b/environments/dev/frontend/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/dev/frontend/config/params-local.php @@ -0,0 +1,3 @@ +run(); diff --git a/environments/dev/frontend/web/index.php b/environments/dev/frontend/web/index.php new file mode 100755 index 0000000..6038167 --- /dev/null +++ b/environments/dev/frontend/web/index.php @@ -0,0 +1,18 @@ +run(); diff --git a/environments/dev/tests/codeception/config/config-local.php b/environments/dev/tests/codeception/config/config-local.php new file mode 100755 index 0000000..c2a6a04 --- /dev/null +++ b/environments/dev/tests/codeception/config/config-local.php @@ -0,0 +1,11 @@ + [ + 'db' => [ + 'dsn' => 'mysql:host=localhost;dbname=yii2_advanced_tests', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + ], + ], +]; diff --git a/environments/dev/yii b/environments/dev/yii new file mode 100755 index 0000000..6f0c6d2 --- /dev/null +++ b/environments/dev/yii @@ -0,0 +1,28 @@ +#!/usr/bin/env php +run(); +exit($exitCode); diff --git a/environments/index.php b/environments/index.php new file mode 100755 index 0000000..19c989d --- /dev/null +++ b/environments/index.php @@ -0,0 +1,65 @@ + [ + * 'path' => 'directory storing the local files', + * 'skipFiles' => [ + * // list of files that should only copied once and skipped if they already exist + * ], + * 'setWritable' => [ + * // list of directories that should be set writable + * ], + * 'setExecutable' => [ + * // list of files that should be set executable + * ], + * 'setCookieValidationKey' => [ + * // list of config files that need to be inserted with automatically generated cookie validation keys + * ], + * 'createSymlink' => [ + * // list of symlinks to be created. Keys are symlinks, and values are the targets. + * ], + * ], + * ]; + * ``` + */ +return [ + 'Development' => [ + 'path' => 'dev', + 'setWritable' => [ + 'backend/runtime', + 'backend/web/assets', + 'frontend/runtime', + 'frontend/web/assets', + ], + 'setExecutable' => [ + 'yii', + 'tests/codeception/bin/yii', + ], + 'setCookieValidationKey' => [ + 'backend/config/main-local.php', + 'frontend/config/main-local.php', + ], + ], + 'Production' => [ + 'path' => 'prod', + 'setWritable' => [ + 'backend/runtime', + 'backend/web/assets', + 'frontend/runtime', + 'frontend/web/assets', + ], + 'setExecutable' => [ + 'yii', + ], + 'setCookieValidationKey' => [ + 'backend/config/main-local.php', + 'frontend/config/main-local.php', + ], + ], +]; diff --git a/environments/prod/backend/config/main-local.php b/environments/prod/backend/config/main-local.php new file mode 100755 index 0000000..af46ba3 --- /dev/null +++ b/environments/prod/backend/config/main-local.php @@ -0,0 +1,9 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], +]; diff --git a/environments/prod/backend/config/params-local.php b/environments/prod/backend/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/prod/backend/config/params-local.php @@ -0,0 +1,3 @@ +run(); diff --git a/environments/prod/common/config/main-local.php b/environments/prod/common/config/main-local.php new file mode 100755 index 0000000..84c4d9f --- /dev/null +++ b/environments/prod/common/config/main-local.php @@ -0,0 +1,16 @@ + [ + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=yii2advanced', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + ], + 'mailer' => [ + 'class' => 'yii\swiftmailer\Mailer', + 'viewPath' => '@common/mail', + ], + ], +]; diff --git a/environments/prod/common/config/params-local.php b/environments/prod/common/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/prod/common/config/params-local.php @@ -0,0 +1,3 @@ + [ + 'request' => [ + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => '', + ], + ], +]; diff --git a/environments/prod/frontend/config/params-local.php b/environments/prod/frontend/config/params-local.php new file mode 100755 index 0000000..d0b9c34 --- /dev/null +++ b/environments/prod/frontend/config/params-local.php @@ -0,0 +1,3 @@ +run(); diff --git a/environments/prod/tests/codeception/config/config-local.php b/environments/prod/tests/codeception/config/config-local.php new file mode 100755 index 0000000..c2a6a04 --- /dev/null +++ b/environments/prod/tests/codeception/config/config-local.php @@ -0,0 +1,11 @@ + [ + 'db' => [ + 'dsn' => 'mysql:host=localhost;dbname=yii2_advanced_tests', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + ], + ], +]; diff --git a/environments/prod/yii b/environments/prod/yii new file mode 100755 index 0000000..1fe0342 --- /dev/null +++ b/environments/prod/yii @@ -0,0 +1,28 @@ +#!/usr/bin/env php +run(); +exit($exitCode); diff --git a/frontend/assets/AppAsset.php b/frontend/assets/AppAsset.php new file mode 100755 index 0000000..5aa5098 --- /dev/null +++ b/frontend/assets/AppAsset.php @@ -0,0 +1,33 @@ + 'app-frontend', + 'basePath' => dirname(__DIR__), + 'bootstrap' => ['log'], + 'controllerNamespace' => 'frontend\controllers', + 'components' => [ + 'request'=>[ + 'baseUrl' => '', + 'cookieValidationKey' => 'ndahjhjjidasuidrqeswuiuirqw89', + 'csrfParam' => '_frontendCSRF', + 'class' => 'common\modules\language\components\LanguageRequest', + ], + 'user' => [ + 'identityClass' => 'common\models\User', + 'enableAutoLogin' => true, + 'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true], + ], + 'session' => [ + // this is the name of the session cookie used for login on the frontend + 'name' => 'advanced-frontend', + ], + 'log' => [ + 'traceLevel' => YII_DEBUG ? 3 : 0, + 'targets' => [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ], + ], + 'errorHandler' => [ + 'errorAction' => 'site/error', + ], + 'urlManager' => [ + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'class'=>'common\modules\language\components\LanguageUrlManager', + 'rules' => [ + 'buy' => 'site/buy', + 'testdrive' => 'site/testdrive', + '/' => 'site/index', + '//*'=>'/', + ], + ], + 'language'=>'ru-RU', + 'i18n' => [ + 'translations' => [ + 'app*' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'basePath' => '@common/translation', + 'sourceLanguage' => 'en', + 'fileMap' => [ + ], + ], + ], + ], + ], + 'params' => $params, +]; diff --git a/frontend/config/params.php b/frontend/config/params.php new file mode 100755 index 0000000..7f754b9 --- /dev/null +++ b/frontend/config/params.php @@ -0,0 +1,4 @@ + 'admin@example.com', +]; diff --git a/frontend/controllers/SiteController.php b/frontend/controllers/SiteController.php new file mode 100755 index 0000000..16c1dcc --- /dev/null +++ b/frontend/controllers/SiteController.php @@ -0,0 +1,320 @@ + [ + 'class' => AccessControl::className(), + 'only' => [ + 'logout', + 'signup', + ], + 'rules' => [ + [ + 'actions' => [ 'signup' ], + 'allow' => true, + 'roles' => [ '?' ], + ], + [ + 'actions' => [ 'logout' ], + 'allow' => true, + 'roles' => [ '@' ], + ], + ], + ], + 'verbs' => [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'logout' => [ 'post' ], + ], + ], + ]; + } + + /** + * @inheritdoc + */ + public function actions() + { + return [ + 'error' => [ + 'class' => 'yii\web\ErrorAction', + ], + 'captcha' => [ + 'class' => 'yii\captcha\CaptchaAction', + 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : NULL, + ], + ]; + } + + /** + * Displays homepage. + * @return mixed + */ + public function actionIndex() + { + $years = Car::find() + ->distinct() + ->select('year') + ->asArray() + ->column(); + $models = Car::find() + ->distinct() + ->select('model') + ->asArray() + ->column(); + if(\Yii::$app->request->isPost) { + $lang = \Yii::$app->request->post('lang'); + if(!empty($lang)) { + \Yii::$app->language = $lang; + } + } + $searchModel = new CarSearch(['scenario' => CarSearch::SCENARIO_PUBLIC]); + $dataProvider = $searchModel->search(\Yii::$app->request->queryParams); + return $this->render('index', [ + 'dataProvider' => $dataProvider, + 'searchModel' => $searchModel, + 'years' => $years, + 'models' => $models, + ]); + } + + /** + * Logs in a user. + * @return mixed + */ + public function actionLogin() + { + $this->layout = false; + if(!Yii::$app->user->isGuest) { + return $this->goHome(); + } + + $model = new LoginForm(); + if($model->load(Yii::$app->request->post()) && $model->login()) { + return $this->goBack(); + } else { + return $this->render('login', [ + 'model' => $model, + ]); + } + } + + /** + * Logs out the current user. + * @return mixed + */ + public function actionLogout() + { + Yii::$app->user->logout(); + + return $this->goHome(); + } + + /** + * Displays contact page. + * @return mixed + */ + public function actionContact() + { + $model = new ContactForm(); + if($model->load(Yii::$app->request->post()) && $model->validate()) { + if($model->sendEmail(Yii::$app->params[ 'adminEmail' ])) { + Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.'); + } else { + Yii::$app->session->setFlash('error', 'There was an error sending email.'); + } + + return $this->refresh(); + } else { + return $this->render('contact', [ + 'model' => $model, + ]); + } + } + + /** + * Displays about page. + * @return mixed + */ + public function actionAbout() + { + return $this->render('about'); + } + + /** + * Signs user up. + * @return mixed + */ + public function actionSignup() + { + $this->layout = false; + $model = new SignupForm(); + if($model->load(Yii::$app->request->post())) { + if($user = $model->signup()) { + if(Yii::$app->getUser() + ->login($user) + ) { + return $this->goHome(); + } + } + } + + return $this->render('signup', [ + 'model' => $model, + ]); + } + + /** + * Requests password reset. + * @return mixed + */ + public function actionRequestPasswordReset() + { + $model = new PasswordResetRequestForm(); + if($model->load(Yii::$app->request->post()) && $model->validate()) { + if($model->sendEmail()) { + Yii::$app->session->setFlash('success', 'Check your email for further instructions.'); + + return $this->goHome(); + } else { + Yii::$app->session->setFlash('error', 'Sorry, we are unable to reset password for email provided.'); + } + } + + return $this->render('requestPasswordResetToken', [ + 'model' => $model, + ]); + } + + /** + * Resets password. + * + * @param string $token + * + * @return mixed + * @throws BadRequestHttpException + */ + public function actionResetPassword($token) + { + try { + $model = new ResetPasswordForm($token); + } catch(InvalidParamException $e) { + throw new BadRequestHttpException($e->getMessage()); + } + + if($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) { + Yii::$app->session->setFlash('success', 'New password was saved.'); + + return $this->goHome(); + } + + return $this->render('resetPassword', [ + 'model' => $model, + ]); + } + + public function actionTestdrive() + { + echo Mailer::widget([ 'type' => 'test', + 'subject' => 'Запись на тест-драйв', + 'params' => Yii::$app->request->post('TestdriveForm'), + ]); + $model = new Emails(); + + $model->load(Yii::$app->request->post(), 'TestdriveForm'); + $model->save(); + + die(); + } + + /** + * @throws \Exception + */ + public function actionBuy() + { + Mailer::widget([ 'type' => 'buy', + 'subject' => 'Покупка автомобиля', + 'params' => Yii::$app->request->post('OrderForm'), + ]); + $model = new Buys(); + + $model->load(Yii::$app->request->post(), 'OrderForm'); + $model->save(); + + die(); + } + public function actionQuestion() + { + Mailer::widget([ 'type' => 'question', + 'subject' => 'Вопросы', + 'params' => Yii::$app->request->post('QuestionForm'), + ]); + $model = new Emails([ + 'scenario' => Emails::SCENARIO_QUESTION, + ]); + + $model->load(Yii::$app->request->post(), 'QuestionForm'); + $model->save(); + + die(); + } + public function actionBooking() + { + Mailer::widget([ 'type' => 'booking', + 'subject' => 'Бронирование авто', + 'params' => Yii::$app->request->post('BookingForm'), + ]); + $model = new Emails([ + 'scenario' => Emails::SCENARIO_BOOKING, + ]); + + $model->load(Yii::$app->request->post(), 'BookingForm'); + $model->save(); + die(); + } + public function actionKeytokey() + { + Mailer::widget([ 'type' => 'keytokey', + 'subject' => 'Акция Ключ-на-ключ', + 'params' => Yii::$app->request->post('KeytokeyForm'), + ]); + $model = new Emails([ + 'scenario' => Emails::SCENARIO_KEY, + ]); + + $model->load(Yii::$app->request->post(), 'KeytokeyForm'); + $model->save(); + + die(); + } + } diff --git a/frontend/models/BookingForm.php b/frontend/models/BookingForm.php new file mode 100755 index 0000000..3c288c4 --- /dev/null +++ b/frontend/models/BookingForm.php @@ -0,0 +1,51 @@ + 2, 'max' => 255], + + ['phone', 'required'], + [['phone','model'], 'safe'], + + ['email', 'email'], + [['email','phone'], 'string', 'max' => 255], + + [['date_from'],'string'], + [['date_to'],'string'], + + ]; + } + + public function attributeLabels() + { + return [ + 'username'=>Yii::t('app', 'username'), + 'phone'=>'Телефон', + 'email'=>'E-mail', + 'date_from'=>Yii::t('app', 'from'), + 'date_to'=>Yii::t('app', 'to'), + ]; + } + +} diff --git a/frontend/models/ContactForm.php b/frontend/models/ContactForm.php new file mode 100755 index 0000000..a716a53 --- /dev/null +++ b/frontend/models/ContactForm.php @@ -0,0 +1,60 @@ + 'Verification Code', + ]; + } + + /** + * Sends an email to the specified email address using the information collected by this model. + * + * @param string $email the target email address + * @return boolean whether the email was sent + */ + public function sendEmail($email) + { + return Yii::$app->mailer->compose() + ->setTo($email) + ->setFrom([$this->email => $this->name]) + ->setSubject($this->subject) + ->setTextBody($this->body) + ->send(); + } +} diff --git a/frontend/models/KeytokeyForm.php b/frontend/models/KeytokeyForm.php new file mode 100755 index 0000000..bc61166 --- /dev/null +++ b/frontend/models/KeytokeyForm.php @@ -0,0 +1,48 @@ + 2, 'max' => 255], + + ['email', 'email'], + [['email','phone'], 'string', 'max' => 255], + + ['phone', 'required'], + [['phone','model'], 'safe'], + + [['date_count'],'string'] + + ]; + } + + public function attributeLabels() + { + return [ + 'username'=>Yii::t('app', 'username'), + 'phone'=>'Телефон', + 'email'=>'E-мейл', + 'date_count'=>Yii::t('app', 'numdays'), + ]; + } + +} diff --git a/frontend/models/OrderForm.php b/frontend/models/OrderForm.php new file mode 100755 index 0000000..e4dfff1 --- /dev/null +++ b/frontend/models/OrderForm.php @@ -0,0 +1,51 @@ + 2, 'max' => 255], + + ['email', 'email'], + [['email','phone'], 'string', 'max' => 255], + + ['phone', 'required'], + [['phone','model_name','model_year','model_color'], 'safe'] + + ]; + } + + public function attributeLabels() + { + return [ + 'username'=>Yii::t('app', 'username'), + 'phone'=>'Телефон', + 'email'=>'Е-мейл', + 'model_name'=>'', + 'model_year' => '', + 'model_color' => '', + ]; + } + +} diff --git a/frontend/models/PasswordResetRequestForm.php b/frontend/models/PasswordResetRequestForm.php new file mode 100755 index 0000000..60111b9 --- /dev/null +++ b/frontend/models/PasswordResetRequestForm.php @@ -0,0 +1,68 @@ + '\common\models\User', + 'filter' => ['status' => User::STATUS_ACTIVE], + 'message' => 'There is no user with such email.' + ], + ]; + } + + /** + * Sends an email with a link, for resetting the password. + * + * @return boolean whether the email was send + */ + public function sendEmail() + { + /* @var $user User */ + $user = User::findOne([ + 'status' => User::STATUS_ACTIVE, + 'email' => $this->email, + ]); + + if (!$user) { + return false; + } + + if (!User::isPasswordResetTokenValid($user->password_reset_token)) { + $user->generatePasswordResetToken(); + if (!$user->save()) { + return false; + } + } + + return Yii::$app + ->mailer + ->compose( + ['html' => 'passwordResetToken-html', 'text' => 'passwordResetToken-text'], + ['user' => $user] + ) + ->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name . ' robot']) + ->setTo($this->email) + ->setSubject('Password reset for ' . Yii::$app->name) + ->send(); + } +} diff --git a/frontend/models/QuestionForm.php b/frontend/models/QuestionForm.php new file mode 100755 index 0000000..1dc4c6c --- /dev/null +++ b/frontend/models/QuestionForm.php @@ -0,0 +1,48 @@ + 2, 'max' => 255], + + ['email', 'email'], + [['email','phone'], 'string', 'max' => 255], + + ['phone', 'required'], + [['phone','model'], 'safe'], + + [['message'],'string'] + + ]; + } + + public function attributeLabels() + { + return [ + 'username'=>Yii::t('app', 'username'), + 'phone'=>'Телефон', + 'email'=>'E-мейл', + 'message'=>Yii::t('app', 'text_message') + ]; + } + +} diff --git a/frontend/models/ResetPasswordForm.php b/frontend/models/ResetPasswordForm.php new file mode 100755 index 0000000..72b7f02 --- /dev/null +++ b/frontend/models/ResetPasswordForm.php @@ -0,0 +1,64 @@ +_user = User::findByPasswordResetToken($token); + if (!$this->_user) { + throw new InvalidParamException('Wrong password reset token.'); + } + parent::__construct($config); + } + + /** + * @inheritdoc + */ + public function rules() + { + return [ + ['password', 'required'], + ['password', 'string', 'min' => 6], + ]; + } + + /** + * Resets password. + * + * @return boolean if password was reset. + */ + public function resetPassword() + { + $user = $this->_user; + $user->setPassword($this->password); + $user->removePasswordResetToken(); + + return $user->save(false); + } +} diff --git a/frontend/models/SignupForm.php b/frontend/models/SignupForm.php new file mode 100755 index 0000000..57a51d8 --- /dev/null +++ b/frontend/models/SignupForm.php @@ -0,0 +1,58 @@ + '\common\models\User', 'message' => 'This username has already been taken.'], + ['username', 'string', 'min' => 2, 'max' => 255], + + ['email', 'trim'], + ['email', 'required'], + ['email', 'email'], + ['email', 'string', 'max' => 255], + ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], + + ['password', 'required'], + ['password', 'string', 'min' => 6], + ]; + } + + /** + * Signs user up. + * + * @return User|null the saved model or null if saving fails + */ + public function signup() + { + if (!$this->validate()) { + return null; + } + + $user = new User(); + $user->username = $this->username; + $user->email = $this->email; + $user->setPassword($this->password); + $user->generateAuthKey(); + + return $user->save() ? $user : null; + } +} diff --git a/frontend/models/TestdriveForm.php b/frontend/models/TestdriveForm.php new file mode 100755 index 0000000..cccb975 --- /dev/null +++ b/frontend/models/TestdriveForm.php @@ -0,0 +1,39 @@ + 2, 'max' => 255], + + ['phone', 'required'], + [['phone','model'], 'safe'] + + ]; + } + + public function attributeLabels() + { + return [ + 'username'=>Yii::t('app', 'username'), + 'phone'=>'Телефон', + ]; + } + +} diff --git a/frontend/runtime/.gitignore b/frontend/runtime/.gitignore new file mode 100755 index 0000000..c96a04f --- /dev/null +++ b/frontend/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/frontend/views/layouts/main.php b/frontend/views/layouts/main.php new file mode 100755 index 0000000..6cf1a9c --- /dev/null +++ b/frontend/views/layouts/main.php @@ -0,0 +1,27 @@ + +beginPage() ?> + + + + + + + <?= Html::encode($this->title) ?> + head() ?> + + +beginBody() ?> + +endBody() ?> + + +endPage() ?> diff --git a/frontend/views/site/_car_view.php b/frontend/views/site/_car_view.php new file mode 100755 index 0000000..cf172b4 --- /dev/null +++ b/frontend/views/site/_car_view.php @@ -0,0 +1,26 @@ + +
    + image); + ?> +
    +
    +

    getAttributeLabel('color'); ?>: color); ?>

    +

    getAttributeLabel('mileage'); ?>: mileage; echo Yii::t('app', 'tsd_km'); ?>

    +

    getAttributeLabel('build'); ?>: build; ?>

    +

    getAttributeLabel('option'); ?>: option); ?>

    +
    +
    price, 2); ?>$
    +
    +
    diff --git a/frontend/views/site/about.php b/frontend/views/site/about.php new file mode 100755 index 0000000..8eb0764 --- /dev/null +++ b/frontend/views/site/about.php @@ -0,0 +1,16 @@ +title = 'About'; +$this->params['breadcrumbs'][] = $this->title; +?> +
    +

    title) ?>

    + +

    This is the About page. You may modify the following file to customize its content:

    + + +
    diff --git a/frontend/views/site/contact.php b/frontend/views/site/contact.php new file mode 100755 index 0000000..dc48410 --- /dev/null +++ b/frontend/views/site/contact.php @@ -0,0 +1,45 @@ +title = 'Contact'; +$this->params['breadcrumbs'][] = $this->title; +?> +
    +

    title) ?>

    + +

    + If you have business inquiries or other questions, please fill out the following form to contact us. Thank you. +

    + +
    +
    + 'contact-form']); ?> + + field($model, 'name')->textInput(['autofocus' => true]) ?> + + field($model, 'email') ?> + + field($model, 'subject') ?> + + field($model, 'body')->textarea(['rows' => 6]) ?> + + field($model, 'verifyCode')->widget(Captcha::className(), [ + 'template' => '
    {image}
    {input}
    ', + ]) ?> + +
    + 'btn btn-primary', 'name' => 'contact-button']) ?> +
    + + +
    +
    + +
    diff --git a/frontend/views/site/error.php b/frontend/views/site/error.php new file mode 100755 index 0000000..0ba2574 --- /dev/null +++ b/frontend/views/site/error.php @@ -0,0 +1,27 @@ +title = $name; +?> +
    + +

    title) ?>

    + +
    + +
    + +

    + The above error occurred while the Web server was processing your request. +

    +

    + Please contact us if you think this is a server error. Thank you. +

    + +
    diff --git a/frontend/views/site/index.php b/frontend/views/site/index.php new file mode 100755 index 0000000..fae789c --- /dev/null +++ b/frontend/views/site/index.php @@ -0,0 +1,722 @@ +title = 'Nissan Leaf'; + $get_model = \Yii::$app->request->get('CarSearch'); + if(!empty($get_model['model'])) { + $get_model = $get_model['model']; + } else { + $get_model = $searchModel::DEFAULT_MODEL; + } + $get_year = \Yii::$app->request->get('CarSearch'); + if(!empty($get_year['year'])) { + $get_year = $get_year['year']; + } else { + $get_year = $searchModel::DEFAULT_YEAR; + } + $current_language = \Yii::$app->language; +?> + + + +
    + + + + + + + + + + + + + + + + +
    +
    +
    + + language == 'ru-RU') { + echo 'рус'; + } else { + echo 'укр'; + } + ?> + +
    + language == 'ru-RU') { + echo Html::a('укр', ['', 'language_id' => 3]); + } else { + echo Html::a('рус', ['', 'language_id' => 2]); + } + ?> +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    +

    +
    +
    + + + +
    + +
    +
    +
    + +
    +
      +
    • + +
      +
      +
      +
      +
      +
    • +
    • + +
      +
      +
      +
      +
      +
    • +
    • + +
      +
      +
      +
      +
      +
    • +
    • + +
      +
      +
      +
      +
      +
    • +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +

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

    +
    + + + +
    +
    + + + +
    +
    +
    + $dataProvider, + 'layout' => '{items}', + 'options' => [ + 'tag' => 'div', + 'class' => 'owl-carousel', + ], + 'itemOptions' => [ + 'tag' => 'div', + 'class' => 'item', + ], + 'itemView' => '_car_view', + ]); + ?> +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

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

    +
    +
    +
    +
    +

    +
    +
    + +
    +
    +

    +
    +
    +
    +

    +
    +
    +
    +
    +
    День
    +
    + +
    +
    +
    +
    50$
    +
    +
    +
    +
    +
    5
    +
    + +
    +
    +
    +
    200$
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    250$
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    900$
    +
    +
    +
    +

    + 500$

    +
    +
    +
    +

    +
      +
    • +
    • +
    • +
    +

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

    +

    +

    +

    "

    +

    "

    +
    +

    +
    +
    + + + +
    + +
    +

    +
    +

    +
      +
    • +
    • +
    +
    +
    +
    +
    + +
    +
    +

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

    +
    +

    +38 (044) 578-18-17
    + +38 (073) 153-30-05
    + +38 (050) 517-70-70

    +


    +

    + support@electrocars.com.ua +
    + electrocars.com.ua +

    +
    + +
    +
    +
    + + +
    + + +
    + +
    Ваша заявка принята.
    Мы свяжемся с вами в ближайшее время.
    +
    + +
    + + +
    +
    +
    +
    +

    © 2016
    +

    +
    +
    + Артвеб
    +
    +
    +
    \ No newline at end of file diff --git a/frontend/views/site/login.php b/frontend/views/site/login.php new file mode 100755 index 0000000..56ea98e --- /dev/null +++ b/frontend/views/site/login.php @@ -0,0 +1,39 @@ +title = 'Login'; +$this->params['breadcrumbs'][] = $this->title; +?> + diff --git a/frontend/views/site/requestPasswordResetToken.php b/frontend/views/site/requestPasswordResetToken.php new file mode 100755 index 0000000..9f6822e --- /dev/null +++ b/frontend/views/site/requestPasswordResetToken.php @@ -0,0 +1,31 @@ +title = 'Request password reset'; +$this->params['breadcrumbs'][] = $this->title; +?> +
    +

    title) ?>

    + +

    Please fill out your email. A link to reset password will be sent there.

    + +
    +
    + 'request-password-reset-form']); ?> + + field($model, 'email')->textInput(['autofocus' => true]) ?> + +
    + 'btn btn-primary']) ?> +
    + + +
    +
    +
    diff --git a/frontend/views/site/resetPassword.php b/frontend/views/site/resetPassword.php new file mode 100755 index 0000000..36ef452 --- /dev/null +++ b/frontend/views/site/resetPassword.php @@ -0,0 +1,31 @@ +title = 'Reset password'; +$this->params['breadcrumbs'][] = $this->title; +?> +
    +

    title) ?>

    + +

    Please choose your new password:

    + +
    +
    + 'reset-password-form']); ?> + + field($model, 'password')->passwordInput(['autofocus' => true]) ?> + +
    + 'btn btn-primary']) ?> +
    + + +
    +
    +
    diff --git a/frontend/views/site/signup.php b/frontend/views/site/signup.php new file mode 100755 index 0000000..de9dad6 --- /dev/null +++ b/frontend/views/site/signup.php @@ -0,0 +1,35 @@ +title = 'Signup'; +$this->params['breadcrumbs'][] = $this->title; +?> + diff --git a/frontend/web/.gitignore b/frontend/web/.gitignore new file mode 100755 index 0000000..25c74e6 --- /dev/null +++ b/frontend/web/.gitignore @@ -0,0 +1,2 @@ +/index.php +/index-test.php diff --git a/frontend/web/assets/.gitignore b/frontend/web/assets/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/frontend/web/assets/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/frontend/web/css/breakpoints.scss b/frontend/web/css/breakpoints.scss new file mode 100755 index 0000000..aab84d9 --- /dev/null +++ b/frontend/web/css/breakpoints.scss @@ -0,0 +1,18 @@ +$breakpoints: ( + 'xs': ( min-width: 480px ), + 'sm': ( min-width: 768px ), + 'md': ( min-width: 992px ), + 'lg': ( min-width: 1200px ) +) !default; + +@mixin respond-to($breakpoint) { + @if map-has-key($breakpoints, $breakpoint) { + @media #{inspect(map-get($breakpoints, $breakpoint))} { + @content; + } + } + @else { + @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + + "Available breakpoints are: #{map-keys($breakpoints)}."; + } +} \ No newline at end of file diff --git a/frontend/web/css/firstSlider.css b/frontend/web/css/firstSlider.css new file mode 100644 index 0000000..d5371e4 --- /dev/null +++ b/frontend/web/css/firstSlider.css @@ -0,0 +1,40 @@ +.box-1 { + transition: 0.5s; +} +.mobile-html .box-1 {transition: 0s} +.slider_wr_ { + position: absolute;left: 0;bottom: 126px; +} +.slide-ul { + +} +.slide-ul .style {position: absolute; bottom: 4px; left: 0; padding: 0 15px;} +.slide-ul li { + list-style: none; + cursor: pointer; + position: relative; +} +.slide-ul li img { + width: 100%; + max-width: 100%; + max-height: 118px; + box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.75); +} +.time-bloks { + position: relative; + bottom: -4px; + left: 0; + width: 100%; + height: 5px; + background: #5c5a64; + z-index: 2; + display: none; +} +.slide-ul .active_n .time-bloks { + display: block; +} +.time-bloks-line { + width: 0; + height: 100%; + background: #00aeff; +} \ No newline at end of file diff --git a/frontend/web/css/firstSlider.scss b/frontend/web/css/firstSlider.scss new file mode 100755 index 0000000..d3d3b6a --- /dev/null +++ b/frontend/web/css/firstSlider.scss @@ -0,0 +1,43 @@ +.box-1 { + transition: 0.5s; +} +.mobile-html .box-1 {transition: 0s} + +.slide-ul { + +} +.slide-ul .style {position: absolute; bottom: 4px; left: 0; padding: 0 15px;} +.slide-ul li { + list-style: none; + cursor: pointer; + position: relative; +} +.slide-ul li img { + width: 100%; + max-width: 100%; + max-height: 118px; + box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.75); +} +.time-bloks { + position: relative; + bottom: -4px; + left: 0; + width: 100%; + height: 5px; + background: #5c5a64; + z-index: 2; + display: none; +} +.slide-ul .active_n .time-bloks { + display: block; +} +.time-bloks-line { + width: 0; + height: 100%; + background: #00aeff; +} + + + + + diff --git a/frontend/web/css/modal.scss b/frontend/web/css/modal.scss new file mode 100755 index 0000000..e15a1db --- /dev/null +++ b/frontend/web/css/modal.scss @@ -0,0 +1,115 @@ + +/* формируем кнопку закрытия */ +.close { + position: absolute; + padding: 0; + top: -24px; + right: -24px; opacity: 1; + text-align: center; + text-decoration: none; + font-weight: bold; + line-height: 20px; + -webkit-transition: background-color ease .7s; + -moz-transition: background-color ease .7s; + -ms-transition: background-color ease .7s; + -o-transition: background-color ease .7s; + transition: background-color ease .7s; + &:hover { + &:before{ + color: #efba00; + } + } + +} +.close:before { + color: rgba(255, 255, 255, 0.9); + content: '\2715'; + text-shadow: 0 -1px rgba(0, 0, 0, 0.9); + font-size: 22px; + color: #fcd016; +} + +.has-error input { + border: 1px solid #dc0a05!important; + box-shadow: none!important; +} +.form-control { + display: block; + box-sizing: border-box; + 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; +} +.has-error{ + label,.help-block { + color: red; + } + input { + border: 1px solid red; + box-shadow: none!important; + } +} + +.form-group{ + margin-bottom: 20px; + label{ + line-height: 24px; + } +} +.form-group-2-l{ + display: flex; + label{ + line-height: 24px; + height: 34px; + padding: 5px; + } +} +.form-footer{ + padding-top: 20px; + text-align: center; +} + + +.modal { + text-align: center; + padding: 0!important; + + &:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -4px; + } + .modal-header { + padding-bottom: 0; + border-bottom: none; + } + + @include respond-to('md'){ + .modal-header{ + padding: 40px 180px 0; + } + .modal-body{ + padding: 0 180px 40px; + } + } +} +.modal-dialog { + display: inline-block; + text-align: left; + vertical-align: middle; + margin: 30px; +} \ No newline at end of file diff --git a/frontend/web/css/owl.carousel/_animate.scss b/frontend/web/css/owl.carousel/_animate.scss new file mode 100755 index 0000000..696d93c --- /dev/null +++ b/frontend/web/css/owl.carousel/_animate.scss @@ -0,0 +1,28 @@ +/* + * Owl Carousel - Animate Plugin + */ +.owl-carousel{ + .animated { + animation-duration: 1000ms; + animation-fill-mode: both; + } + .owl-animated-in { + z-index: 0; + } + .owl-animated-out { + z-index: 1; + } + .fadeOut { + animation-name: fadeOut; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} diff --git a/frontend/web/css/owl.carousel/_autoheight.scss b/frontend/web/css/owl.carousel/_autoheight.scss new file mode 100755 index 0000000..7852c3f --- /dev/null +++ b/frontend/web/css/owl.carousel/_autoheight.scss @@ -0,0 +1,7 @@ +/* + * Owl Carousel - Auto Height Plugin + */ + +.owl-height { + transition: height 500ms ease-in-out; +} diff --git a/frontend/web/css/owl.carousel/_core.scss b/frontend/web/css/owl.carousel/_core.scss new file mode 100755 index 0000000..37c9161 --- /dev/null +++ b/frontend/web/css/owl.carousel/_core.scss @@ -0,0 +1,105 @@ +/* + * Owl Carousel - Core + */ +.owl-carousel { + display: none; + width: 100%; + -webkit-tap-highlight-color: transparent; + /* position relative and z-index fix webkit rendering fonts issue */ + position: relative; + z-index: 1; + + .owl-stage { + position: relative; + -ms-touch-action: pan-Y; + } + + .owl-stage:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; + } + + .owl-stage-outer { + position: relative; + overflow: hidden; + /* fix for flashing background */ + -webkit-transform: translate3d(0px, 0px, 0px); + } + + .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-backface-visibility: hidden; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + } + .owl-item img { + display: block; + width: 100%; + -webkit-transform-style: preserve-3d; + } + + .owl-nav.disabled, + .owl-dots.disabled { + display: none; + } + + .owl-nav .owl-prev, + .owl-nav .owl-next, + .owl-dot { + cursor: pointer; + cursor: hand; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + &.owl-loaded { + display: block; + } + + &.owl-loading { + opacity: 0; + display: block; + } + + &.owl-hidden { + opacity: 0; + } + + &.owl-refresh .owl-item { + display: none; + } + + &.owl-drag .owl-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + &.owl-grab { + cursor: move; + cursor: grab; + } + + &.owl-rtl { + direction: rtl; + } + + &.owl-rtl .owl-item { + float: right; + } +} + +/* No Js */ +.no-js .owl-carousel { + display: block; +} diff --git a/frontend/web/css/owl.carousel/_lazyload.scss b/frontend/web/css/owl.carousel/_lazyload.scss new file mode 100755 index 0000000..4f19e07 --- /dev/null +++ b/frontend/web/css/owl.carousel/_lazyload.scss @@ -0,0 +1,17 @@ +/* + * Owl Carousel - Lazy Load Plugin + */ + +.owl-carousel { + .owl-item { + .owl-lazy { + opacity: 0; + transition: opacity 400ms ease; + } + + img.owl-lazy { + transform-style: preserve-3d; + } + } +} + diff --git a/frontend/web/css/owl.carousel/_theme.default.scss b/frontend/web/css/owl.carousel/_theme.default.scss new file mode 100755 index 0000000..8c583b2 --- /dev/null +++ b/frontend/web/css/owl.carousel/_theme.default.scss @@ -0,0 +1,30 @@ +/* + * Default theme - Owl Carousel CSS File + */ + +$color-base: #869791 !default; +$color-white: #FFF !default; +$color-gray: #D6D6D6 !default; + +//nav + +$nav-color: $color-gray; +$nav-color-hover: $primary-color; +$nav-font-size: 36px !default; +$nav-rounded: 3px !default; +$nav-margin: 5px !default; +$nav-padding: 4px 7px !default; +$nav-background: transperent; +$nav-background-hover: transperent; +$nav-disabled-opacity: 0.5 !default; + +//dots + +$dot-width: 64px !default; +$dot-height: 2px !default; +$dot-rounded: 30px !default; +$dot-margin: 20px 7px !default; +$dot-background: #d7d7d7; +$dot-background-active: $primary-color; + +@import 'theme'; diff --git a/frontend/web/css/owl.carousel/_theme.scss b/frontend/web/css/owl.carousel/_theme.scss new file mode 100755 index 0000000..97b4743 --- /dev/null +++ b/frontend/web/css/owl.carousel/_theme.scss @@ -0,0 +1,66 @@ + +.owl-theme { + // Styling Next and Prev buttons + .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; + + [class*='owl-'] { + color: $nav-color; + font-size: $nav-font-size; + margin: $nav-margin; + padding: $nav-padding; + background: $nav-background; + display: inline-block; + cursor: pointer; + border-radius: 3px; + + &:hover { + background: $nav-background-hover; + color:$nav-color-hover; + text-decoration: none; + } + } + .disabled { + opacity: $nav-disabled-opacity; + cursor: default; + } + } + + // Styling dots + .owl-nav.disabled + .owl-dots { + margin-top: 10px; + } + + .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; + background: #f2f2f2; + margin: 0 -20px; + + .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; + + span { + width: $dot-width; + height: $dot-height; + margin: $dot-margin; + background: $dot-background; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; + } + + &.active, + &:hover { + span { + background: $dot-background-active; + } + } + } + } +} diff --git a/frontend/web/css/owl.carousel/_video.scss b/frontend/web/css/owl.carousel/_video.scss new file mode 100755 index 0000000..29b6717 --- /dev/null +++ b/frontend/web/css/owl.carousel/_video.scss @@ -0,0 +1,51 @@ +/* + * Owl Carousel - Video Plugin + */ + +.owl-carousel{ + .owl-video-wrapper { + position: relative; + height: 100%; + background: #000; + } + + .owl-video-play-icon { + position: absolute; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-left: -40px; + margin-top: -40px; + background: url("owl.video.play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + transition: transform 100ms ease; + } + + .owl-video-play-icon:hover { + transform: scale(1.3, 1.3); + } + + .owl-video-playing .owl-video-tn, + .owl-video-playing .owl-video-play-icon { + display: none; + } + + .owl-video-tn { + opacity: 0; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + transition: opacity 400ms ease; + } + + .owl-video-frame { + position: relative; + z-index: 1; + height: 100%; + width: 100%; + } +} diff --git a/frontend/web/css/owl.carousel/owl.carousel.scss b/frontend/web/css/owl.carousel/owl.carousel.scss new file mode 100755 index 0000000..f93c308 --- /dev/null +++ b/frontend/web/css/owl.carousel/owl.carousel.scss @@ -0,0 +1,6 @@ +@import 'core'; +@import 'animate'; +@import 'autoheight'; +@import 'lazyload'; +@import 'video'; +@import 'theme.default'; diff --git a/frontend/web/css/pushy.scss b/frontend/web/css/pushy.scss new file mode 100755 index 0000000..b3afd33 --- /dev/null +++ b/frontend/web/css/pushy.scss @@ -0,0 +1,201 @@ +/*! Pushy - v1.0.0 - 2016-3-1 +* Pushy is a responsive off-canvas navigation menu using CSS transforms & transitions. +* https://github.com/christophery/pushy/ +* by Christopher Yee */ + +$menu_width: 300px !default; + +/* Menu Appearance */ + +.pushy{ + position: fixed; + width: $menu_width; + height: 100%; + top: 0; + z-index: 11; + background: $primary-color; + overflow: auto; + visibility: hidden; + -webkit-overflow-scrolling: touch; /* enables momentum scrolling in iOS overflow elements */ + + a{ + display: block; + color: rgba(256,256,256,0.8); + padding: 15px 30px; + text-decoration: none; + outline: 0; + font-size: 18px; + text-transform: uppercase; + } + + a:hover{ + color: #FFF; + } + + ul:first-child{ + margin-top: 70px; + } + + &.pushy-left{ + left: 0; + } + + &.pushy-right{ + right: 0; + } +} + +/* Menu Movement */ + +.pushy-left{ + -webkit-transform: translate3d( unquote('-' + $menu_width) ,0,0); + -ms-transform: translate3d( unquote('-' + $menu_width) ,0,0); + transform: translate3d( unquote('-' + $menu_width) ,0,0); +} + +.pushy-open-left{ + #container, + .push{ + -webkit-transform: translate3d( $menu_width ,0,0); + -ms-transform: translate3d( $menu_width ,0,0); + transform: translate3d( $menu_width ,0,0); + } +} + +.pushy-right{ + -webkit-transform: translate3d( $menu_width ,0,0); + -ms-transform: translate3d( $menu_width ,0,0); + transform: translate3d( $menu_width ,0,0); +} + +.pushy-open-right{ + #container, + .push{ + -webkit-transform: translate3d( unquote('-' + $menu_width) ,0,0); + -ms-transform: translate3d( unquote('-' + $menu_width) ,0,0); + transform: translate3d( unquote('-' + $menu_width) ,0,0); + } +} + +.pushy-open-left, +.pushy-open-right{ + .pushy{ + -webkit-transform: translate3d(0,0,0); + -ms-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } +} + +/* Menu Transitions */ + +#container, +.pushy, +.push{ + transition: transform .2s cubic-bezier(.16, .68, .43, .99); +} + +/* Site Overlay */ + +.site-overlay{ + display: none; +} + +.pushy-open-left, +.pushy-open-right{ + .site-overlay{ + display: block; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + background-color: rgba(0,0,0,0.5); + -webkit-animation: fade 500ms; + animation: fade 500ms; + } +} + +@keyframes fade{ + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +@-webkit-keyframes fade{ + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +/* Submenu Appearance */ + +.pushy-submenu{ + ul{ + padding-left: 15px; + transition: max-height 0.2s ease-in-out; + + .pushy-link{ + transition: opacity 0.2s ease-in-out; + } + } + + /* Submenu Icon */ + + > a { + position: relative; + } + + > a::after { + content: ''; + display: block; + height: 11px; + width: 8px; + position: absolute; + top: 50%; + right: 15px; + background: url("../img/arrow.svg") no-repeat; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + transition: transform 0.2s; + } +} + +/* Submenu Movement */ + +.pushy-submenu-closed{ + ul{ + max-height: 0; + overflow: hidden; + } + + .pushy-link{ + opacity: 0; + } +} + +.pushy-submenu-open{ + ul{ + max-height: 1000px; + } + + .pushy-link{ + opacity: 1; + } + + /* Submenu Icon */ + + a::after { + -webkit-transform: translateY(-50%) rotate(90deg); + -ms-transform: translateY(-50%) rotate(90deg); + transform: translateY(-50%) rotate(90deg); + } +} + +.no-csstransforms3d{ + .pushy-submenu-closed{ + ul{ + max-height: none; + display: none; + } + } +} diff --git a/frontend/web/css/reset.scss b/frontend/web/css/reset.scss new file mode 100755 index 0000000..a67283b --- /dev/null +++ b/frontend/web/css/reset.scss @@ -0,0 +1,43 @@ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + box-sizing: border-box; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + +body { + line-height: 1; } + +ol, ul { + list-style: none; } + +blockquote, q { + quotes: none; } + +blockquote { + &:before, &:after { + content: ''; + content: none; } } + +q { + &:before, &:after { + content: ''; + content: none; } } + +table { + border-collapse: collapse; + border-spacing: 0; } +img { + max-width: 100%; +} +button { + background-color: transparent; + outline: none; + border: 0; + cursor: pointer; } \ No newline at end of file diff --git a/frontend/web/css/site.css b/frontend/web/css/site.css new file mode 100644 index 0000000..490c34f --- /dev/null +++ b/frontend/web/css/site.css @@ -0,0 +1,111 @@ +html, +body { + height: 100%; +} + +.wrap { + min-height: 100%; + height: auto; + margin: 0 auto -60px; + padding: 0 0 60px; +} + +.wrap > .container { + padding: 70px 15px 20px; +} + +.footer { + height: 60px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + padding-top: 20px; +} + +.jumbotron { + text-align: center; + background-color: transparent; +} + +.jumbotron .btn { + font-size: 21px; + padding: 14px 24px; +} + +.not-set { + color: #c55; + font-style: italic; +} + +/* add sorting icons to gridview sort links */ +a.asc:after, a.desc:after { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + padding-left: 5px; +} + +a.asc:after { + content: "\e151"; +} + +a.desc:after { + content: "\e152"; +} + +.sort-numerical a.asc:after { + content: "\e153"; +} + +.sort-numerical a.desc:after { + content: "\e154"; +} + +.sort-ordinal a.asc:after { + content: "\e155"; +} + +.sort-ordinal a.desc:after { + content: "\e156"; +} + +.grid-view td { + white-space: nowrap; +} + +.grid-view .filters input, +.grid-view .filters select { + min-width: 50px; +} + +.hint-block { + display: block; + margin-top: 5px; + color: #999; +} + +.error-summary { + color: #a94442; + background: #fdf7f7; + border-left: 3px solid #eed3d7; + padding: 10px 20px; + margin: 0 0 15px 0; +} + +/* align the logout "link" (button in form) of the navbar */ +.nav > li > form { + padding: 8px; +} + +@media(max-width:768px) { + .nav li > form { + padding: 3px; + } +} + +.nav > li > form > button:hover { + text-decoration: none; +} diff --git a/frontend/web/css/style.css b/frontend/web/css/style.css new file mode 100644 index 0000000..1090ea2 --- /dev/null +++ b/frontend/web/css/style.css @@ -0,0 +1,3820 @@ +*{ + margin: 0; + padding: 0;} +html, body {height: 100%} +body { + font-family: 'Open Sans'; + font-weight: 300; + font-size: 14px; + color: #373232; + +} + +img { + border: none; +} +a:hover, a:focus { + color: inherit; + text-decoration: none; +} +div:before, div:after { + content: ''; +} +#no-scroll {overflow-y: hidden;} +#preload_ { + width: 100%; + height: 100%; + position: fixed; + z-index: 999999; + top: 0; + left: 0; + background: #333; +} +#preload_:before { + width: 100%; + height: 100%; + background: url("../images/preload.gif") 50% 50% no-repeat; + position: absolute; + top: 0; + left: 0; + z-index: 1; +} +#preload_.hide_:before { + opacity: 0; + transition: 0.9s; +} +#preload_.hide_up_ {opacity: 0; transition: 0.5s ease-in;} + +#container-main { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + +} +.sections { + max-height: 1200px; + height: 100%; + width: 100%; + position: relative; + min-width: 768px;float: left; +} +.box-1 { + background-image: url('../images/slider/big-bg-1.jpg'); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.mobile-html .box-1 { + /*background-image:url('../images/slider/big-bg-1.jpg') 50% 50% no-repeat;*/ + background-attachment: scroll; +} +.box-2 { + background: url('../images/bg-2.jpg') no-repeat center top fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + overflow: hidden; +} +.mobile-html .box-2 { + background: url('../images/bg-2.jpg') no-repeat 50% 0; + +} +.box-3 { + background: url('../images/bg-3.jpg') no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.mobile-html .box-3 { + background: url('../images/bg-3.jpg') no-repeat 50%; + /*height: 1000px;*/ +} +.box-4 { + background: url('../images/bg-4.jpg') no-repeat center top fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.mobile-html .box-4 { + background: url('../images/bg-4.jpg') no-repeat 50% 0; +} + +.box-4-2 { + background: url('../images/sl_ec_01.jpg') no-repeat center top fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.mobile-html .box-4-2 { + background: url('../images/sl_ec_01.jpg') no-repeat 50% 0; +} + +.box-4-3 { + background: url('../images/bg-4-3.jpg') no-repeat center top fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.mobile-html .box-4-3 { + background: url('../images/bg-4-3.jpg') no-repeat 50% 0; +} + +.box-5 { + background: url('../images/bg-5.jpg') no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.mobile-html .box-5 { + background: url('../images/bg-5.jpg') no-repeat 50%; +} +.bg-1 { + max-width: 100%; + position: absolute; +} +.box-1 .container, .box-1 .container .posit_ { + position: relative; + height: 100%; +} +.positions { + top: 50%; + /*left:0;*/ +} + +#navi_circle { + position: fixed; + top: 20px; + right: 0; + width: 37px; + padding-top: 32px; + overflow: hidden; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + transition: 0.4s; + z-index: 9; +} +#navi_circle:after { + width: 100%; + height: 100%; + position: absolute; + content: ''; + z-index: 1; + top: 0; + left: 0; + border-right: 37px solid #3b4c54; + border-top: 12px solid transparent; + border-bottom: 12px solid transparent; +} +#navi_circle li { + width: 100%; + height: 11px; + list-style: none; + margin-top: 17px; + position: relative; + z-index: 2; +} +#navi_circle li:before { + width: 11px; + height: 11px; + background: #fff; + cursor: pointer; + content: ''; + margin: 0 auto; + border-radius: 100%; + display: block; +} +#navi_circle li:first-child {margin-top:0 } +#navi_circle li.active:before {background: #00aeff} +.circle-next { + width: 57px; + height: 66px; + position: absolute; + bottom: 50px; + left: 50%; + margin-left: -29px; + cursor: pointer; + +} +.circle-next:hover { + animation: animation1 1800ms ease-in-out both; + animation-iteration-count: 1; + animation-direction: alternate; +} +.circle-next div { + background: url("../images/icons/first-arrow.png") 50% 50% no-repeat; + z-index: 3; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; +} + +.menu_wrapper { + position: fixed; + width: 100%; + z-index: 9999; +} +.menu_wrapper.hide_menu { + background: none; +} +ul#menu_nav { + float: right; + margin-top: 54px; + position: relative; + z-index: 3; + box-shadow: 0 0 12px 0 rgba(0,0,0, 0.25); +} +ul#menu_nav li { + float: left; + list-style: none; + margin-left: 35px; +} +ul#menu_nav li a { + text-decoration: none; + font-size: 12px; + text-transform: uppercase; + color: #fff; +} + +.hide_menu ul#menu_nav { + display: none; +} +.hide_menu.open-menu ul#menu_nav { + display: block; + width: 205px; + float: right; + border-radius: 4px; + overflow: hidden; + background: #fff; + padding: 9px 0 10px 0; +} + +.menu-line { + width: 23px; + height: 14px; + position: relative; + float: right; + margin-top: 54px; + display: none; +} +.hide_menu .menu-line {display: block} +.open-menu .menu-line {display: none;} +.menu-line:before { + position: absolute; + content: ''; + width: 100%; + height: 100%; + background: url("../images/icons/menu-se.png") no-repeat; + top: 0; + left: 0; + cursor: pointer; +} +.menu-line.black:before { + background: url("../images/icons/menu-se2.png") no-repeat; +} +.hide_menu ul#menu_nav li {display: none;} +.hide_menu.open-menu ul#menu_nav li {display: block;} +.hide_menu.open-menu ul#menu_nav li { + margin-left: 0; + + padding-left: 15px; + height: 30px; + line-height: 30px; + width: 100%; +} +.hide_menu.open-menu ul#menu_nav li a {color: inherit} +.hide_menu.open-menu ul#menu_nav li a:hover {text-decoration: underline} +.hide_menu.open-menu ul#menu_nav li.active a:hover {text-decoration: none;cursor: default;} + + +.open-menu ul#menu_nav li { + width: 100px; +} + + + +.open-menu ul#menu_nav:before {display: none;} + +.hide_menu.open-menu ul#menu_nav li.active a {color: #00aeff} +.logo { + margin-top: 21px; + width: 195px; + height: 57px; +} + + + + + +.container-wrapper { + margin-top: 0; + width: 100%; + float: left; + padding-top: 97px; +} + +.style { + width: 100%; + float: left; +} +.title-bl { + text-align: center; + text-transform: uppercase; + font-size: 40px; + font-weight: 700; +} +.title-bl.white {color: #fff} + + + +ul.list-bx5 { + margin-top: 75px; +} + +ul.list-bx5 li { + height: 74px; + list-style: none; + float: left; + position: relative; +} +.list-bx5 li:hover { + animation: animation1 1800ms ease-in-out both; + animation-iteration-count: 1; + animation-direction: alternate; +} +ul.list-bx5 li div { + background: #fff; + border-radius: 4px; + text-align: center; + width: 100%; + position: relative; + height: 100%; +} + +ul.list-bx5 li div img { + position: absolute; + left: 50%; + top: 50%; +} + +.studio-copy-wr { + height: 80px; + background: #3b4c54; + width: 100%; + float: left; + position: absolute; + bottom: 0; + left: 0; +} +.aw-left, .aw-right { + float: left; + height: 80px; + width: 100%; +} + +.aw-left div { + display: table-cell; + height: 80px; + vertical-align: middle; + color: #fff; + font-size: 13px; +} +.aw-right div { + text-align: right; + line-height: 80px; + padding-right: 36px; +} +.aw-right div a { + font-size: 13px; + position: relative; + color: #7a7575; +} +.aw-right div a:before { + width: 24px; + height: 23px; + position: absolute; + content: ''; + top: 50%; + margin-top: -12px; + right: -35px; + background: url("../images/artweb-logo.png") no-repeat; +} +.box-5 {overflow: hidden;} +/*.maps-contacts-wr {*/ + /*height: 732px;*/ + /*background: url("../images/map.jpg") 50% -100px no-repeat;*/ + /*position: absolute;*/ + /*left: 0;*/ + /*top: 286px;*/ +/*}*/ +.maps-contacts-wr { + height: 732px; + background: 0 0!important; + position: relative!important; + margin-top: 40px; + top: 0!important; +} +.contacts-wr { + width: 260px; + /* height: 457px; */ + position: absolute; + right: 15px; + top: 328px; + margin-top: -229px; + background: #fff; + border-radius: 4px; + overflow: hidden; + float: left; +} + +.contacts-txt-wr { + width: 100%; + float: left; + padding-left: 30px; + /*margin-top: 43px;*/ +} +.contacts-img { + margin-top: 50px; + float: left; + position: relative; + z-index: 2; +} +.contacts-tile { + float: left; + width: 100%; + position: relative; + margin-bottom: 25px; +} +.contacts-tile:before, .contacts-tile {background: #00aeff;} +.contacts-tile:before { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: -30px; + +} +.contacts-tile p { + font-size: 24px; + line-height: 68px; + height: 68px; + text-transform: uppercase; + position: relative; + float: left; + color: #fff; +} + +.cont-phones, .cont-str, .cont-mail { + width: 100%; + float: left; +} +.cont-phones span {font-weight: 700} +.cont-str { + margin-top: 16px; +} +.cont-mail a { + text-decoration: none; + color: #27aae1; +} + + + + + + +/*new*/ +.slogan_wrapper { + margin-top: 280px; +} + + + +.slogan_ { + font-size: 36px; + font-weight: 700; + color: #00aeff; + text-align: right; + line-height: 38px; +} +.slogan_ span { + color: #ffc000; + border-bottom: 1px solid #ffc000; + font-weight: normal; + font-family: Georgia; +} + + +.button-_first-wr {margin-top: 30px;position: relative;z-index: 9;} +.button-_first-wr .btn_test_drive, .btn_by_link { + float: right; +} +.btn_by_link {margin-top: 15px;} + +.content-margin {margin-top: 55px;} + + +.button-_four-wr { + margin-top: 45px; +} + +.button-_four-wr .btn_test_drive {float: right !important;} +.box-2 .button-_four-wr .btn_test_drive {float: left !important;} + +.special-stock_title { + text-align: center; + color: #fff; + font-size: 24px; + line-height: 29px; +} + +.special-stock_title span { + font-weight: 700; +} +.stock-txt-bl-wr { + position: relative; + width: 100%; + margin-top: 18px; +} +.stock-txt-bl-wr:before { + content: ''; + width: 100%; + height: 100%; + position: absolute; + top:10px; + right: -10px; + background: rgba(255,255,255,0.5); + z-index: 1; +} +.stock-txt-bl { + width: 100%; + position: relative; + z-index: 2; + background: #fff; + padding: 30px 0 0 30px; + height: 530px; + overflow: hidden; +} +.title-st { + text-align: center; + font-size: 15px; + color: #373232; + font-weight: 700; +} +.st-desc { + +} +.st-desc p { + margin: 23px 0 0 0; + font-size: 15px; + font-style: italic; + line-height: 22px; +} +/*.st-desc p:first-child {*/ + /*margin-top: 23px;*/ +/*}*/ +.st-desc-2 { + background: #f1f8fc; + margin-top: 20px; + padding: 28px 24px 32px 24px; +} +.desk-bg-title { + text-align: center; + font-weight: 700; + font-size: 15px; + line-height: 18px; +} +.button-test-wr{ + margin-top: 21px; + height: 48px; +} +.button-fb { + float: right; +} + +.button-fb a { + display: block; + float: left; + height: 48px; + text-decoration: underline; + color: #00aeff; + min-width: 182px; +} +.button-fb a:hover {text-decoration: none;} +.button-fb a img { + float: left; + margin-right: 15px; +} +.button-fb a span { + color: inherit; + font-size: 15px; + font-weight: 700; + display: table-cell; + vertical-align: middle; + height: 48px; + line-height: 16px; +} +.desc-2-share { + text-align: center; + font-size: 15px; + color: #5c5c5c; + margin-top: 21px; + line-height: 17px; +} +.title-st-2 { + margin-top: 26px; +} + +.st-days-wr { + margin-top: 12px; +} +.st-days-wr div { + height: 30px; + float: left; + width: 50%; + padding-left: 19px; + border-left: 1px solid #b7b7b7; + text-align: left; +} +.st-days-wr div:first-child { + padding-left: 0; + padding-right: 19px; + border-left: 0; + text-align: right; +} +.st-days-wr div span, .st-days-wr div a { + font-size: 15px; + color: #00aeff; + font-weight: 700; + line-height: 30px; +} +.st-days-wr div a {text-decoration: underline;} + +.box-4-3 .mCustomScrollBox, .box-4-2 .mCustomScrollBox { + padding-bottom: 50px; + padding-right: 30px; +} +.box-4-3 .mCSB_inside > .mCSB_container, .box-4-2 .mCSB_inside > .mCSB_container { + margin-right: 0; +} +.box-4-3 .mCSB_scrollTools, .box-4-2 .mCSB_scrollTools { + right: 7px; +} +.box-4-3 .mCSB_dragger_bar:before, .box-4-2 .mCSB_dragger_bar:before { + display: none; +} +.box-4-3 .mCSB_draggerContainer, .box-4-2 .mCSB_draggerContainer { + padding-bottom: 30px; +} +.box-4-3 .mCSB_draggerRail, .box-4-2 .mCSB_draggerRail { + border-top: 0 !important; + width: 2px !important; +} + + + +.stock-txt-bl:before { + position: absolute; + width: 100%; + height: 50px; + bottom: 0; + content: ''; + z-index: 3; + background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%); + background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); + background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=0 ); + left: -30px; + /*background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 50%, rgba(255,255,255,1) 99%);*/ + /*background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 50%,rgba(255,255,255,1) 99%);*/ + /*background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 50%,rgba(255,255,255,1) 99%);*/ + /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=0 );*/ + +} + +.title-st-new { + font-weight: 700; + font-size: 18px; + text-transform: uppercase; + border-bottom: 1px solid #b7b7b7; + padding-bottom: 15px; + color: #333; +} +.price-name-wr { + width: 102px; + float: left; +} +.price-name { + height: 30px; + cursor: default; +} +.price-name .price-name-title { + float: left; + margin-right: 5px; + font-size: 15px; + line-height: 30px; + color: #333; +} +.price-name .price-name-border { + overflow: hidden; +} +.price-name-border span { + width: 100%; + height: 21px; + border-bottom: 2px dotted #b7b7b7; + display: block; +} +.st-first-list {position: relative} +.st-first-list ul, .st-second-list ul { + list-style: none; + width: 165px; + float: left; + margin-top: 11px; + margin-bottom: 42px; +} +.st-first-list ul li { + width: 100%; + float: left; +} +.price-cost { + font-size: 15px; + color: #00aeff; + line-height: 30px; + margin-left: 5px; + float: left; +} +.st-deposit { + position: absolute; + width: 190px; + bottom: 48px; + height: 43px; + border-left: 18px solid transparent; + border-bottom: 43px solid #00aeff; + right: 0; +} + +.st-deposit p { + color: #fff; + float: left; + font-size: 24px; + font-weight: 700; + line-height: 43px; + margin-bottom: 0; +} +.st-deposit p span { + font-weight: normal; + font-size: 13px; + width: 80px; + display: table-cell; + line-height: 15px; + height: 43px; + vertical-align: middle; + padding-left: 10px; +} +.st-second-list ul { + width: 100%; + float: left; + list-style-type: disc; + padding-left: 17px; +} +.st-second-list ul li {width: 100%;float: left;color: #00aeff} +.st-second-list ul li span {font-size: 15px;color: #333;} + +.st-center { + text-align: center; +} +.st-center img { + max-width: 100%; +} +.st-center p { + margin: 0 0 0 0; + color: #333; + font-size: 15px; +} +.txt-rent_ { + padding-left: 15px; + position: relative; + margin-top: 13px; +} +.txt-rent_ p { + width: 100%; + float: left; + font-size: 15px; + color: #fff; + margin: 0 0 0 0; +} +.txt-rent_ p span { + color: #fff200; +} +.b_left { + position: absolute; + height:100%; + width: 3px; + top: 0; + left: 0; + padding: 5px 0 2px 0; +} +.b_left div { + width: 100%; + height: 100%; + background: #00aeff; +} +.rent_tb { + width: 100%; + float: left; + border: 0; + margin-top: 18px; +} +.rent_tb td { + border: 0 !important; +} +.rent_tb td:first-child { + +} +.rent_tb td img { + max-width: 100%; +} +.rent-tb-pos { + position: relative; + padding-left: 17px; + font-size: 18px; + color: #fff; + font-weight: 700; +} +.rent-tb-pos .border_rent {border-bottom: 1px solid #fff; text-transform: uppercase;} +.rent-tb-pos .color_rent { + color: #fff200; +} +.rent-tb-pos small {font-size: 15px;} + + + + /**********************/ +/*3*/ +.in_stock-wr { + background: #fff; + border-radius: 4px; + padding: 13px 50px 12px 50px; + position: relative; +} +.models_select ul {width: 100%;float: left; height: 58px;border-bottom: 1px solid #b7b7b7; margin-bottom: 0} +.models_select ul li { + list-style: none; + float: left; + padding: 0 20px; +} +.models_select ul li:first-child {padding-left: 0;} +.models_select ul li a { + text-decoration: none; + font-size: 18px; + color: #00aeff; + font-weight: 700; + line-height: 57px; + text-transform: uppercase; + width: 100%; + text-align: center; + display: block; + position: relative; +} +.models_select ul li.active a { + color: #363636; + cursor: default; +} +.models_select ul li.active a:before { + width: 100%; + height: 2px; + background: #00aeff; + bottom: 0; + left: 0; + position: absolute; + content: ''; +} +.years_select {margin-top: 13px;} +.years_select p { + float: left; + font-weight: 700; + line-height: 26px; + color: #363636; + font-size: 13px; +} +.years_select ul { + float: left; +} +.years_select ul li { + list-style: none; + float: left; + margin: 0 10px; +} +.years_select ul li:first-child {margin-left: 23px;} +.years_select ul li a { + height: 26px; + line-height: 26px; + display: block; + font-size: 16px; + color: #00aeff; + text-decoration: none; + font-weight: 600; + padding: 0 4px; +} +.years_select ul li.active a {color: #363636;border-bottom: 2px solid #00aeff;cursor: default;} + +.car-list {margin-top: 27px; position: relative;} + +.horizontal-images.content li { + margin: 0 0 0 62px; + float: left; + width: 213px; +} +.horizontal-images.content li:first-child { + margin-left: 0; +} +.car-list ul li div.img_ {width: 100%;float: left;} +.car-list ul li div.img_ img {width: 100%;} +.specifications {margin-top: 10px;} +.specifications p { + font-size: 13px; + color: #333; + line-height: 17px; +} +.specifications p span {font-weight: 700;} +.price { + font-size: 18px; + color: #00aeff; + text-align: center; + margin-top: 6px; +} +.buy_button {margin-top: 17px;margin-bottom: 30px;} +.load_content {overflow: hidden} +.load_content, .load_content div, .load_content:before, .load_content div:before { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} +.load_content:before { + background: #fff; + opacity: 0.9; +} +.load_content div:before { + background: url("../images/preload_min.gif") 50% 50% no-repeat; + margin-top: -20px; +} +.button-_second-wr { + position: absolute; + right: 0; + bottom: 150px; +} +/**/ + + + + + + + + + +/*scrollbar*/ +.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar,.mCustomScrollbar.mCS_touch_action{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:none;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside > .mCSB_container{margin-right:30px}.mCSB_horizontal.mCSB_inside > .mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools{opacity:.75;filter:alpha(opacity=75);-ms-filter:alpha(opacity=75)}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:24px;top:auto;right:0;bottom:0;left:0}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{background-image:url(../images/mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:alpha(opacity=40);-ms-filter:alpha(opacity=40)}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0;top:-7px}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;text-align:center;background:#00aeff}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:18px;margin:0 7px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;background-color:#000;background-color:rgba(0,0,0,0.4);filter:alpha(opacity=40);-ms-filter:alpha(opacity=40)}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCS-inset.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{width:12px;background:#dfdfdf;border-top:1px solid #cecece}.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:0 1px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCS-inset.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.snap-scrolling-example .content{height:auto;width:100%}.horizontal-images.content ul{margin:0;padding:0;list-style:none;overflow:hidden}.mCSB_buttonLeft,.mCSB_buttonRight{display:none!important}.mCSB_dragger_bar{border-bottom:1px solid #009ae2}.mCSB_dragger_bar:before{width:34px;height:10px;position:absolute;top:50%;left:50%;margin-left:-17px;margin-top:-5px;content:'';background:url(../images/icons/slider_sep.png) no-repeat} +/***********/ + + + + + + + + + + + + + +.btn_test_drive, .btn_buy, .btn_by_link, .btn-application, .btn_reserved { + width: 262px; + height: 44px; + line-height: 44px; + text-align: center; + display: block; + background: #fff200; + border-bottom: 2px solid #ffc000; + border-radius: 4px; + text-decoration: none; + font-size: 13px; + color: #363636; + font-weight: 700; + text-transform: uppercase; +} +.btn-application { + float: left; + margin-top: 3px; + width: 236px; +} +.btn_reserved { + float: right; + margin-top: 40px; +} +.btn_test_drive:hover, .btn_buy:hover, .btn_by_link:hover, .btn-application:hover, .btn_reserved:hover { + border-bottom: 2px solid #fff200; +} +.btn_test_drive:active, .btn_buy:active,.btn_by_link:active, .btn-application:active, .btn_reserved:active { + background: #ffc000; + border-bottom: 2px solid #ffc000; +} +.btn_buy { + width: 136px; + height: 44px; + margin: 0 auto; + font-weight: 700; +} +.img-screen-two, .img-screen-four { + width: 100%; margin-top: -19px; +} + + +/*modal*/ +#overlay { + z-index: 99997; + position: fixed; + background-color: #000; + opacity: .8; + width: 100%; + height: 100%; + top: 0; + left: 0; + cursor: pointer; + display: none; +} + +.modal_form { + width: 420px; + position: fixed; + top: 2%; + left: 50%; + margin-left: -210px; + display: none; + opacity: 0; + z-index: 99998; + background: #fff; + border-radius: 4px; +} +#success_form { + width: 420px; + height: 152px; + border-radius: 4px; + position: fixed; + top: 50%; + left: 50%; + margin-left: -210px; + margin-top: -76px; + display: none; + z-index: 99999; + background: #fff; +} +.modal_form #modal_close, #success_form #modal_close { + width: 16px; + height: 16px; + position: absolute; + top: -32px; + right: -32px; + cursor: pointer; + display: block; + background: url(../images/close-form.png) no-repeat; +} +.txt-success { + width: 420px; + height: 152px; + display: table-cell; + vertical-align: middle; + text-align: center; + font-size: 16px; + color: #363636; +} + + +.model-name { + width: 100%; + float: left; + text-align: center; + height: 95px; + line-height: 100px; + color: #363636; + font-size: 18px; + font-weight: 700; + text-transform: uppercase; +} +.modal_form form { + width: 100%; + float: left; + padding: 0 79px 50px 79px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +.modal_form .input-blocks { + width: 100%; + float: left; + margin-top: 9px; +} +.modal_form .input-blocks:first-child { + margin-top: 0; +} + +.input-blocks label { + font-size: 13px; + color: #363636!important; +} +.custom-input-2 { + width: 100%; + height: 40px; + border: 1px solid #cfcfcf; + box-sizing: border-box; + color: #363636; + font-size: 13px; + line-height: 40px; + padding-left: 8px; + margin-top: 6px; + box-shadow: 1px 2px 2px 0 rgba(215,215,215,0.75) inset; + transition: .1s; + outline: none!important; + border-radius: 4px; +} +.custom-input-2:focus {box-shadow: none;transition: 0.2s} +.required label { + position: relative; +} +.has-error label { + color: #dc0a05!important; +} +.required label:before { + display: block; + content: "*"; + color: #dc0a05; + position: absolute; + top: 0; + right: -7px; +} +.has-error input { + border: 1px solid #dc0a05!important; + box-shadow: none!important; +} +.button-wrapper { + text-align: center; + margin-top: 40px!important; +} + +.modal_form form button { + width: 165px; + height: 44px; + line-height: 47px; + padding: 0; + cursor: pointer; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 2px solid #ffc000; + background: #fff200; + outline: none!important; + border-radius: 4px; + font-size: 13px; + font-weight: 700; + color: #333; + text-transform: uppercase; +} +.modal_form form button:hover { + border-bottom: 2px solid #fff200; +} +.modal_form form button:active { + border-bottom: 2px solid #ffc000; + background: #ffc000; +} + +/**/ +.input-blocks .form-control{ + /*height: 40px;*/ + /*border: 1px solid #cfcfcf;*/ + /*box-shadow: 1px 2px 2px 0 rgba(215,215,215,0.75) inset;*/ + /*transition: .1s;*/ + /*outline: none!important;*/ + /*width: 100%;*/ + /*padding-left: 10px;*/ + /*box-sizing: border-box;*/ + /*margin-top: 5px;*/ +} +.input-blocks .control-label{ + font-weight:300!important; + color:black; +} +.form-group, .help-block{ + margin-bottom: 0; +} +.help-block{ + padding-bottom: 9px; +} +.has-error{ + box-shadow: none; +} + +.has-success label { + font-size: 13px!important; + color: #363636!important; +} +.has-success input { + border: 1px solid #cfcfcf!important; + box-shadow: 1px 2px 2px 0 rgba(215,215,215,0.75) inset!important; +} + +/***2.0****/ +.list_why-wr {margin-top: -18px;} +.list_why {margin-top: 18px;} +.box-2 .list_why-wr {margin-top: -5px;} +.box-2 .list_why {margin-top: 5px;} +.why-img-wr, .why-txt-wr { + width: 100%; + float: left; +} +.why-img-wr { + + height: 110px; + text-align: center; +} +.why-img-wr img { + width: 110px; + height: 110px; +} +.box-2 .why-img-wr { + height: 130px; +} +.box-2 .why-img-wr img { + width: 130px; + height: 130px; +} +.why-txt-wr { + text-align: center; + margin-top: 12px; + height: 51px; + overflow: hidden; +} +.box-2 .why-txt-wr {height: 55px} +.why-txt-wr p { + font-size: 14px; + color: #000000; + margin: 0; + font-weight: 700; + line-height: 17px; +} +.why-txt-wr p span { + color: #fff; + font-size: 15px; +} +.box-2 .why-txt-wr p span { + font-size: inherit; +} +.box-2 .why-txt-wr p span i { + font-style: normal; + font-size: 24px; +} + + + + + + + + + + + + + + +/**********/ +/*data-picker*/ +#ui-datepicker-div{ + background-color: white; + box-shadow: inset 0px 0px 0px 1px #d7d7d7; + border-radius: 5px; + margin-top: 1px; + width: 320px; + right: 0px; + margin-left: -40px; + display: none; +} + +.ui-datepicker-header.ui-widget-header.ui-helper-clearfix.ui-corner-all{ + text-align: center; + width: 280px; + position: relative; + margin: 0 auto; + height: 29px; + overflow: hidden; + margin-top: 26px; + margin-bottom: 25px; + padding-left:1px; +} +.ui-datepicker-calendar tr, .ui-datepicker-calendar td{margin:0;padding:0;} +table.ui-datepicker-calendar th{ + color:black; + text-transform:uppercase; + font-size:12px; +} +table.ui-datepicker-calendar{ + width: 280px; + text-align: center; + margin: 0 auto; + font-family:Arial; + margin-bottom: 23px; +} +.ui-datepicker-calendar a{ + font-size: 12px; + color: black; + text-decoration: none; + width: 20px; + height: 20px; + border-radius: 50%; + display: inherit; + line-height: 20px; + left: 9px; + position: relative; +} +.ui-datepicker-calendar .ui-datepicker-today a{ + border: 1px solid #fed22f; +} + +.ui-datepicker-unselectable.ui-state-disabled span{ + color: #b2dbeb; + font-size: 12px; + text-decoration: none; + width: 20px; + height: 20px; + border-radius: 50%; + display: inherit; + line-height: 20px; + left: 9px; + position: relative; +} +.ui-datepicker-next.ui-corner-all{ + position: absolute; + width: 20px; + height: 20px; + background-image: url('../images/calendar_arrows.png'); + overflow: hidden; + text-indent: 100%; + background-repeat: no-repeat; + top: 5px; + background-position: 0px -36px; + cursor: pointer; + right:1px; +} +.ui-datepicker-prev.ui-corner-all{ + position: absolute; + width: 20px; + height: 20px; + background-image: url('../images/calendar_arrows.png'); + overflow: hidden; + text-indent: 100%; + background-repeat: no-repeat; + top: 5px; + background-position: 0px -66px; + cursor: pointer; + left:2px; +} +.ui-datepicker-prev.ui-corner-all.ui-state-disabled{ + background-position: 0px -6px; + cursor:default; +} +.ui-datepicker-title select{ + border-radius: 8px; + margin: 5px; + font-size: 14px; + padding-top: 2px; + padding-bottom: 4px; + padding-left: 12px; + padding-right: 17px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + outline: none; + background-image: url('../images/arrowselect.png'); + background-repeat: no-repeat; + background-position: 84px 8px; + max-width:104px; + border-color:#bababa; +} +.ui-datepicker-year{ + width:102px; + padding-left: 23px!important; +} +.ui-datepicker-title{ + margin-top:-4px; +} +#ui-datepicker-div:after{ + content: ''; + width: 302px; + height: 1px; + background-color: #cccccc; + position: absolute; + left: 8px; + top: 68px; +} +.ui-datepicker-calendar td{height:26px;} + + +.date_first, .date_second { + float: left; + margin-top: 6px; +} +.date_first input, .date_second input { + width: 80px; + float: left; + margin-top: 0; +} +.date_first label, .date_second label { + float: left; + margin-right: 12px; + line-height: 40px; +} +.date_second label { + padding-left: 10px; +} +.date_first {margin-left: 3px} +.date_second {} +.datepicker_title { + font-size: 13px; + color: #363636!important; +} +/********language********/ +#language { + position: absolute; + right: 68px; + top: 51px; + width: 75px; + padding: 0 10px; +} +#language span, #language div a { + display: block; + width: 100%; + float: left; + height: 20px; + border-radius: 10px; + color: #fff; + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + background: #666666; + padding-left: 10px; + line-height: 20px; + position: relative; + cursor: pointer; +} +#language span:before { + position: absolute; + right: 8px; + top: 50%; + margin-top: -2px; + content: ''; + width: 8px; + height: 5px; + background: url("../images/ico-3/img-3.png") no-repeat; +} +#language div a { + display: none; + text-decoration: none; +} +#language:hover div a { + display: block; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +#language:hover span:before { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); +} +#language:hover span { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +/************************/ +#map { + width: 100%!important; + height: 100%!important; + padding-bottom: 80px; +} +.questions-wr { + position: fixed; + bottom: 20px; + left: 0; + width: 100%; + z-index: 1; +} +.btn_questions { + z-index: 999999; + float: left; + height: 34px; + background: rgba(0,0,0,0.6); + border-bottom-right-radius: 34px; + border-top-right-radius: 34px; + padding:3px 0 0 34px; + color: #fff !important; + font-size: 10px; + text-transform: uppercase; + line-height: 14px; + text-decoration: none; + position: fixed; + top: 50%; + margin-top: -17px; + left: 0; + width: 34px; + overflow: hidden; + +} +.btn_questions:hover {width: 166px;padding-left: 40px; transition: 0.2s} +.btn_questions:before { + position: absolute; + left: 5px; + top: 50%; + margin-top: -12px; + width: 24px; + height: 24px; + background: url(../images/ico-3/img-5.png) no-repeat; + content: ''; +} +.input-blocks textarea { + width: 100%; + height: 40px; + border: 1px solid #cfcfcf!important; + box-sizing: border-box; + color: #363636; + font-size: 13px; + line-height: 40px; + padding-left: 8px; + margin-top: 6px; + box-shadow: 1px 2px 2px 0 rgba(215,215,215,0.75) inset; + transition: .1s; + outline: none!important; + border-radius: 4px; + resize: none!important; +} +/********animations********/ +@-webkit-keyframes animation1 { + 0% { -webkit-transform: matrix3d(0.8, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 3.4% { -webkit-transform: matrix3d(0.658, 0, 0, 0, 0, 0.703, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 4.7% { -webkit-transform: matrix3d(0.725, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 6.81% { -webkit-transform: matrix3d(0.83, 0, 0, 0, 0, 0.946, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 9.41% { -webkit-transform: matrix3d(0.942, 0, 0, 0, 0, 1.084, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 10.21% { -webkit-transform: matrix3d(0.971, 0, 0, 0, 0, 1.113, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 13.61% { -webkit-transform: matrix3d(1.062, 0, 0, 0, 0, 1.166, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 14.11% { -webkit-transform: matrix3d(1.07, 0, 0, 0, 0, 1.165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 17.52% { -webkit-transform: matrix3d(1.104, 0, 0, 0, 0, 1.12, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 18.72% { -webkit-transform: matrix3d(1.106, 0, 0, 0, 0, 1.094, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 21.32% { -webkit-transform: matrix3d(1.098, 0, 0, 0, 0, 1.035, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 24.32% { -webkit-transform: matrix3d(1.075, 0, 0, 0, 0, 0.98, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 25.23% { -webkit-transform: matrix3d(1.067, 0, 0, 0, 0, 0.969, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 29.03% { -webkit-transform: matrix3d(1.031, 0, 0, 0, 0, 0.948, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 29.93% { -webkit-transform: matrix3d(1.024, 0, 0, 0, 0, 0.949, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 35.54% { -webkit-transform: matrix3d(0.99, 0, 0, 0, 0, 0.981, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 36.74% { -webkit-transform: matrix3d(0.986, 0, 0, 0, 0, 0.989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 41.04% { -webkit-transform: matrix3d(0.98, 0, 0, 0, 0, 1.011, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 44.44% { -webkit-transform: matrix3d(0.983, 0, 0, 0, 0, 1.016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 52.15% { -webkit-transform: matrix3d(0.996, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 59.86% { -webkit-transform: matrix3d(1.003, 0, 0, 0, 0, 0.995, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 63.26% { -webkit-transform: matrix3d(1.004, 0, 0, 0, 0, 0.996, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 75.28% { -webkit-transform: matrix3d(1.001, 0, 0, 0, 0, 1.002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 85.49% { -webkit-transform: matrix3d(0.999, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 90.69% { -webkit-transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 100% { transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +} +@keyframes animation1 { + 0% { transform: matrix3d(0.8, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 3.4% { transform: matrix3d(0.658, 0, 0, 0, 0, 0.703, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 4.7% { transform: matrix3d(0.725, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 6.81% { transform: matrix3d(0.83, 0, 0, 0, 0, 0.946, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 9.41% { transform: matrix3d(0.942, 0, 0, 0, 0, 1.084, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 10.21% { transform: matrix3d(0.971, 0, 0, 0, 0, 1.113, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 13.61% { transform: matrix3d(1.062, 0, 0, 0, 0, 1.166, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 14.11% { transform: matrix3d(1.07, 0, 0, 0, 0, 1.165, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 17.52% { transform: matrix3d(1.104, 0, 0, 0, 0, 1.12, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 18.72% { transform: matrix3d(1.106, 0, 0, 0, 0, 1.094, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 21.32% { transform: matrix3d(1.098, 0, 0, 0, 0, 1.035, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 24.32% { transform: matrix3d(1.075, 0, 0, 0, 0, 0.98, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 25.23% { transform: matrix3d(1.067, 0, 0, 0, 0, 0.969, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 29.03% { transform: matrix3d(1.031, 0, 0, 0, 0, 0.948, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 29.93% { transform: matrix3d(1.024, 0, 0, 0, 0, 0.949, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 35.54% { transform: matrix3d(0.99, 0, 0, 0, 0, 0.981, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 36.74% { transform: matrix3d(0.986, 0, 0, 0, 0, 0.989, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 41.04% { transform: matrix3d(0.98, 0, 0, 0, 0, 1.011, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 44.44% { transform: matrix3d(0.983, 0, 0, 0, 0, 1.016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 52.15% { transform: matrix3d(0.996, 0, 0, 0, 0, 1.003, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 59.86% { transform: matrix3d(1.003, 0, 0, 0, 0, 0.995, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 63.26% { transform: matrix3d(1.004, 0, 0, 0, 0, 0.996, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 75.28% { transform: matrix3d(1.001, 0, 0, 0, 0, 1.002, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 85.49% { transform: matrix3d(0.999, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 90.69% { transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } + 100% { transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } +} +/***bootstrap grid***/ + + +.container +{ + min-width: 779px; +} + +@media (max-width: 1200px) { + .box-4:before, .box-2:before { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: rgba(255,255,255,0.6); + } + .box-4 .title-bl, .box-2 .title-bl { + color: #006797; + position: relative; + } + .why-txt-wr p span{ + color: #006797; + } + /*1*/ + .slogan_ { + font-size: 29px; + margin-top: 18px; + line-height: 37px; + } + /*3*/ + .horizontal-images.content li { + margin: 0 0 0 15px; + width: 198px; + } + /**/ + ul.list-bx2 li { + margin-top: 70px; + } + + .bg-3-wr img { + -webkit-transform: scale(0.72); + transform: scale(0.72); + } + ul.list-bx5 li div img { + -webkit-transform: scale(0.72); + transform: scale(0.72); + } + a.linkBy { + width: 135px; + } + ul#menu_nav li a {font-size: 10px;} + + .txt-bx3-wr .wr {padding-left: 30px;} + + + + .title-bl {font-size: 26px;} +} + +@media (max-width: 992px) { + /*1*/ + .slogan_ { + font-size: 23px; + margin-top: 24px; + line-height: 30px; + } + .horizontal-images.content li { + margin: 0 0 0 23px; + width: 201px; + } + + /**/ +} + +@media (max-width: 768px) { + +} +@media (min-width: 1200px) and (max-height: 900px) { + .box-2 .why-img-wr { + height: 120px; + } + .box-2 .why-img-wr img { + width: 120px; + height: 120px; + } +} +@media (min-width: 1200px) and (max-height: 870px) { + .why-img-wr, .box-2 .why-img-wr { + height: 90px; + } + .why-img-wr img, .box-2 .why-img-wr img { + width: 90px; + height: 90px; + } +} + +@media (min-width: 1200px) and (max-height: 720px) { + .why-img-wr, .box-2 .why-img-wr { + height: 73px; + } + .why-img-wr img, .box-2 .why-img-wr img { + width: 73px; + height: 73px; + } +} + +@media (min-width: 1200px) and (max-height: 650px) { + .why-img-wr { + height: 55px; + } + .why-img-wr img { + width: 55px; + height: 55px; + } + .box-2 .why-img-wr { + height: 60px; + } + .box-2 .why-img-wr img { + width: 60px; + height: 60px; + } +} +@media (min-width: 1200px) and (max-height: 550px) { + .why-img-wr { + height: 45px; + } + .why-img-wr img { + width: 45px; + height: 45px; + } +} +@media (min-width: 1200px) and (max-height: 510px) { + .button-_four-wr {margin-top: 12px;} + .box-2 .why-img-wr { + height: 45px; + } + .box-2 .why-img-wr img { + width: 45px; + height: 45px; + } +} + + +@media (min-width: 1200px) and (max-height: 470px) { + .why-txt-wr {margin-top: 3px;} + .why-txt-wr p { + font-size: 13px; + line-height: 14px; + } + .box-2 .why-img-wr { + height: 43px; + } + .box-2 .why-img-wr img { + width: 43px; + height: 43px; + } +} +@media (min-width: 1200px) and (max-height: 430px) { + .list_why { + margin-top: 6px; + } + .box-2 .why-txt-wr { + height: 46px; + } +} +@media (min-width: 1200px) and (max-height: 400px) { + .why-img-wr { + height: 30px; + } + .why-img-wr img { + width: 30px; + height: 30px; + } +} +@media (max-width: 1200px) and (max-height: 590px) { + .box-2 .why-img-wr { + height: 120px; + } + .box-2 .why-img-wr img { + height: 120px; + width: 120px; + } +} +@media (max-width: 1200px) and (max-height: 520px) { + .why-img-wr {height: 85px} + .why-img-wr img { + width: 85px; + height: 85px; + } + .button-_four-wr { + margin-top: 20px; + } + .box-2 .why-img-wr { + height: 90px; + } + .box-2 .why-img-wr img { + height: 90px; + width: 90px; + } +} + +@media (max-width: 1200px) and (max-height: 450px) { + .why-img-wr {height: 60px} + .why-img-wr img { + width: 60px; + height: 60px; + } + .box-2 .why-img-wr { + height: 67px; + } + .box-2 .why-img-wr img { + height: 67px; + width: 67px; + } + +} +@media (max-width: 1200px) and (max-height: 400px) { + .why-img-wr, .box-2 .why-img-wr {height: 53px} + .why-img-wr img, .box-2 .why-img-wr img { + width: 53px; + height: 53px; + } + .list_why { + margin-top: 6px; + } + +} + +@media (max-width: 1200px) and (max-height: 350px) { + .why-img-wr, .box-2 .why-img-wr {height: 40px} + .why-img-wr img, .box-2 .why-img-wr img { + width: 40px; + height: 40px; + } + .box-2 .why-txt-wr { + height: 47px; + } + .list_why { + margin-top: 6px; + } + .why-txt-wr { + margin-top: 4px; + height: 44px; + } + .why-txt-wr p { + font-size: 13px; + line-height: 14px; + } + .button-_four-wr { + margin-top: 12px; + } +} +@media (max-width: 1040px) { + .btn_questions { + top: auto; + margin-top: 0; + bottom: 20px; + } +} +@media (max-height: 905px) { + .contacts-wr {top: 280px} +} + +@media (max-height: 870px) { + .contacts-wr {top: 260px} + +} + +@media (max-height: 840px) { + .contacts-wr {top: 236px} + .stock-txt-bl {height: 480px;} +} + + +@media (max-height: 800px) { + + /*1*/ + + /*2*/ + + + + /*3*/ + /*3*/ + + /*4*/ + + /*5*/ + .studio-copy-wr, .aw-left, .aw-right, .aw-left div, .aw-right div {height: 60px; } + .aw-right div {line-height: 60px;} + ul.list-bx5 { + margin-top: 62px; + } + + .contacts-wr {top: 245px;} + + + .contacts-txt-wr {padding-bottom: 10px;} + + .contacts-tile {margin-bottom: 12px;} + + + .cont-str {margin-top: 6px;} + .contacts-img {margin-top: 0;} + + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -188px no-repeat; + top: 201px; + } + .contacts-tile p { + height: 50px; + line-height: 50px; + } + /*все*/ + + .container-wrapper {margin-top: 0;padding-top: 35px;} + + .title-bl { + font-size: 26px; + } +} + + +@media (max-width: 1200px) and (max-height: 700px) { + /*3*/ + + /*5*/ + .studio-copy-wr, .aw-left, .aw-right, .aw-left div, .aw-right div {height: 40px; } + .aw-right div {line-height: 40px;} + ul.list-bx5 { + margin-top: 52px; + } + ul.list-bx5 li {height: 38px; } + .contacts-wr {top: 257px;} + + + .contacts-txt-wr { padding-bottom: 19px;} + + .contacts-tile {margin-bottom: 16px;} + + + .cont-str {margin-top: 12px;} + .contacts-img {} + + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -128px no-repeat; + top: 155px; + } +} +@media (max-height: 760px) { +/*1*/ + .slogan_wrapper { + margin-top: 130px; + } + /*2*/ + .img-screen-two {width: 700px;} + /*4*/ + + .img-screen-four {width: 650px;} +} + + + +@media (max-height: 720px) { + .stock-txt-bl {height: 420px;} +} +@media (max-height: 700px) { + /*1*/ + .slider_wr_ {bottom: 115px !important;} + .slogan_wrapper {margin-top: 150px;} + .button-_first-wr {margin-top: 8px;} + .circle-next {bottom: 20px;} + /*2*/ + .img-screen-two { + width: 620px; + + } + .button-_second-wr { + right: 106px; + bottom: 106px; + } + + + /*3*/ + + .in_stock-wr {padding-top: 6px; margin-top: -40px;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 0;} + + + + .btn_buy {height: 32px;line-height: 32px;width: 125px;} + + + /*4*/ + .img-screen-four { + width: 500px; + margin-top: 19px; + } + + + + +} +@media (max-height: 660px) { + .in_stock-wr {margin-top: -40px} + .contacts-img { + display: none; + } +} +@media (max-height: 642px) { + .special-stock_title { + font-size: 18px; + line-height: 19px; + } + .stock-txt-bl { + height: 400px; + } + .btn_reserved {margin-top: 25px;} +} +@media (max-height: 630px) { + /*1*/ + .slider_wr_ {bottom: 115px !important;} + .slogan_wrapper {margin-top: 85px;} + .button-_first-wr {margin-top: 8px;} + .circle-next {bottom: 20px;} + + /*2*/ + .img-screen-two { + width: 510px; + + } + .button-_second-wr { + right: 71px; + bottom: 33px; + } + + + + + + /*3*/ + + .in_stock-wr {padding-top: 6px;margin-top: 0;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 8px;} + + + + .btn_buy {height: 32px;line-height: 32px;width: 125px;} + + + /*4*/ + .img-screen-four { + width: 400px; + margin-top: 19px; + } + + + + + /*5*/ + + .studio-copy-wr, .aw-left, .aw-right, .aw-left div, .aw-right div {height: 40px; } + .aw-right div {line-height: 40px;} + ul.list-bx5 { + margin-top: 52px; + } + ul.list-bx5 li {height: 38px; } + .contacts-wr {top: 280px;} + + + .contacts-txt-wr { padding-bottom: 19px;} + + .contacts-tile {margin-bottom: 16px;} + + + .cont-str {margin-top: 12px;} + .contacts-img {display: none;} + + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -188px no-repeat; + top: 145px; + } + + #navi_circle {width: 25px;right: 0;} + .container-wrapper {margin-top: 0; padding-top: 0} + .menu-line { + margin-top: 12px; + } + #language {top: 9px;} + .logo { + margin-top: 2px; + transform: scale(0.7); + -webkit-transform: scale(0.7); + margin-left: -32px; + } + + + .content-margin { + margin-top: 55px; + } + + .title-bl { + font-size: 18px; + margin-top: 19px; + } + .title-bl-4 {font-size: 16px;} +} + +@media (max-height: 600px) { + + + + + /*1*/ + .slider_wr_ {bottom: 80px !important;} + .slogan_wrapper {margin-top: 65px;} + .button-_first-wr {margin-top: 8px;} + .circle-next {bottom: 10px;} + + /*2*/ + .img-screen-two { + width: 510px; + + } + .button-_second-wr { + right: 71px; + bottom: 33px; + } + + + /*3*/ + + .in_stock-wr {padding-top: 6px;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 8px;} + .specifications p {font-size: 12px;line-height: 16px;} + .price {font-size: 14px;} + .buy_button {margin-top: 7px;margin-bottom: 7px;} + .btn_buy {height: 25px;line-height: 25px;width: 115px;} + + + /*4*/ + .img-screen-four { + width: 400px; + margin-top: 19px; + } + + + + + /*все*/ + #navi_circle {width: 25px;right: 0;} + .container-wrapper {margin-top: 0; padding-top: 0} + .menu-line { + + } + .logo { + margin-top: -4px; + + } + + + .content-margin { + margin-top: 60px; + } + .title-bl { + font-size: 18px; + margin-top: 14px; + } + .title-bl-4 {font-size: 16px;} + + +} +@media (max-height: 580px) { + .custom-input-2 { + height: 26px; + line-height: 26px; + margin-top: 2px; + } + .input-blocks textarea { + height: 26px; + } +} +@media (max-height: 570px) { + .modal_form .input-blocks {margin-top: 0;} +} +@media (max-height: 550px) { + .stock-txt-bl { + height: 340px; + } + + + /*2*/ + .img-screen-two { + width: 510px; + + } + + .button-_second-wr { + right: 71px; + bottom: 33px; + } + + + /*3*/ + + .in_stock-wr {padding-top: 6px;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 8px;} + .specifications p {font-size: 12px;line-height: 16px;} + .price {font-size: 14px;} + .buy_button {margin-top: 7px;margin-bottom: 7px;} + .btn_buy {height: 25px;line-height: 25px;width: 115px;} + + + /*4*/ + .img-screen-four { + width: 400px; + margin-top: 19px; + } + + + + /*5*/ + .studio-copy-wr, .aw-left, .aw-right, .aw-left div, .aw-right div {height: 40px; } + .aw-right div {line-height: 40px;} + ul.list-bx5 { + margin-top: 52px; + } + ul.list-bx5 li {height: 38px; } + .contacts-wr {top: 280px;} + + + .contacts-txt-wr { padding-bottom: 19px;} + + .contacts-tile {margin-bottom: 16px;} + + + .cont-str {margin-top: 12px;} + .contacts-img {display: none;} + + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -188px no-repeat; + top: 145px; + } + + /*все*/ + #navi_circle {width: 25px;right: 0;} + .container-wrapper {margin-top: 0; padding-top: 0} + .menu-line { + + } + .logo { + + } + + + + .title-bl { + font-size: 18px; + margin-top: 14px; + } + .title-bl-4 {font-size: 16px;} + + .content-margin { + margin-top: 20px; + } + +} + +@media (max-height: 525px) { + .model-name { + height: 75px; + line-height: 80px; + } + +} + +@media (max-height: 500px) { + .stock-txt-bl { + height: 300px; + } + .btn_reserved { + margin-top: 19px; + } + /*1*/ + .slider_wr_ {bottom: 80px !important;} + .slogan_wrapper {margin-top: 20px;} + .button-_first-wr {margin-top: 8px;} + .circle-next {bottom: 10px;} + /*2*/ + .img-screen-two { + width: 510px; + + } + .button-_second-wr { + right: 71px; + bottom: 33px; + } + + + /*3*/ + + .in_stock-wr {padding-top: 6px;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 8px;} + .specifications p {font-size: 12px;line-height: 16px;} + .price {font-size: 14px;} + .car-list ul li div.img_ img {max-width: 110px;} + .buy_button {margin-top: 7px;margin-bottom: 7px;} + .btn_buy {height: 25px;line-height: 25px;width: 115px;} + + + /*4*/ + .img-screen-four { + + width: 415px; + } + + + + + /*5*/ + .contacts-txt-wr { padding-bottom: 9px;} + .contacts-tile {margin-bottom: 6px;} + .cont-str {margin-top: 2px;} + /*.contacts-img {display: none;}*/ + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -188px no-repeat; + top: 120px; + } + + +/**/ + .title-bl { + font-size: 18px; + margin-top: 14px; + } + + + +} + +@media (max-height: 485px) { + + + + .date_first, .date_second {margin-top: 2px;} + .date_first label, .date_second label { + line-height: 26px; + } +} + +@media (max-height: 450px) { + #modal_questions form {padding-bottom: 20px;} + .button-wrapper { + margin-top: 20px!important; + } + .stock-txt-bl { + height: 290px; + } + /*1*/ + .slider_wr_ {bottom: 20px !important;} + .slogan_wrapper {margin-top: 20px;} + .button-_first-wr {margin-top: 8px;} + /*2*/ + .img-screen-two { + width: 450px; + margin-left: 28px; + margin-top: -19px; + } + .button-_second-wr { + right: 71px; + bottom: 25px; + } + + /*3*/ + + .in_stock-wr {padding-top: 6px;} + .models_select ul {height: 25px;} + .models_select ul li a {line-height: 24px;font-size: 14px;} + .years_select {margin-top: 3px;} + .years_select p, .years_select ul li a {line-height: 16px;height: 16px;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 8px;} + .specifications {margin-top: 0} + .specifications p {font-size: 11px;line-height: 13px;} + .price {font-size: 14px;margin-top: 0;} + .car-list ul li div.img_ img {max-width: 100px;} + .buy_button {margin-top: 5px;margin-bottom: 7px;} + .btn_buy {height: 25px;line-height: 25px;width: 115px;} + + + /*4*/ + .img-screen-four { + margin-top: 0; + width: 380px; + } + + + + /*все*/ + + #navi_circle {width: 25px;right: 0;} + .container-wrapper {margin-top: 0;} + .menu-line { + + } + + + + + .title-bl { + font-size: 18px; + margin-top: 14px; + } + .circle-next { + /*left: auto;*/ + /*right: 10px;*/ + /*bottom: 20px;*/ + display: none; + } + .content-margin { + margin-top: 20px; + } +} + + +@media (max-height: 440px) { + .stock-txt-bl { + height: 280px; + } +} +@media (max-height: 430px) { + .stock-txt-bl { + height: 270px; + } +} +@media (max-height: 420px) { + .stock-txt-bl { + height: 250px; + } +} + +@media (max-height: 410px) { + .button-wrapper { + margin-top: 20px!important; + } + .modal_form form { + padding: 0 79px 20px 79px; + } + +} + +@media (max-height: 400px) { + .stock-txt-bl { + height: 200px; + } + /*1*/ + .slider_wr_ {bottom: 20px !important;} + .slogan_wrapper {margin-top: 20px;} + .button-_first-wr {margin-top: 8px;} + /*2*/ + .img-screen-two { + width: 365px; + margin-left: 28px; + } + .button-_second-wr { + right: 71px; + bottom: 25px; + } + + /*3*/ + + .in_stock-wr {padding-top: 6px;} + .models_select ul {height: 25px;} + .models_select ul li a {line-height: 24px;font-size: 14px;} + .years_select {margin-top: 3px;} + .years_select p, .years_select ul li a {line-height: 16px;height: 16px;} + .years_select ul li a {font-size: 14px;} + .car-list {margin-top: 8px;} + .specifications {margin-top: 0} + .specifications p {font-size: 11px;line-height: 13px;} + .price {font-size: 14px;margin-top: 0;} + .car-list ul li div.img_ img {max-width: 100px;} + .buy_button {margin-top: 5px;margin-bottom: 7px;} + .btn_buy {height: 25px;line-height: 25px;width: 115px;} + + + /*4*/ + .img-screen-four { + margin-top: 0; + width: 320px; + } + + + + /*5*/ + + .contacts-wr {top: 250px;} + + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -247px no-repeat; + top: 100px; + } + /*все*/ + #navi_circle {width: 25px;right: 0;} + .container-wrapper {margin-top: 0;} + .menu-line { + + } + + + + + .title-bl { + font-size: 18px; + margin-top: 14px; + } + .circle-next { + left: auto; + right: 10px; + bottom: 20px; + } + .content-margin { + margin-top: 20px; + } +} +@media (max-height: 390px) { + .txt-rent_ {margin-top: 5px;} + .model-name { + height: 43px; + line-height: 48px; + } + .txt-rent_ p { + line-height: 17px; + } +} +@media (max-height: 360px) { + #modal_questions form {padding-bottom: 10px;} + .button-wrapper { + margin-top: 10px!important; + } +} +@media (max-height: 350px) { + .rent_tb { + margin-top: 0; + } + .box-4-2 .stock-txt-bl-wr { + margin-top: 0; + } + .stock-txt-bl { + height: 170px; + } + .rent-tb-pos { + font-size: 13px; + } + .txt-rent_ p { + line-height: 16px; + font-size: 13px; + } + .txt-rent_ { + margin-top: 2px; + } + + .btn_by_link { + position: absolute; + margin-top: 0; + right: 282px; + } + +} + +@media (max-height: 339px) { + .in_stock-wr { + padding-top: 0; + } + .models_select ul { + height: 21px; + } + .models_select ul li a { + line-height: 21px; + font-size: 12px; + } + .years_select { + margin-top: 0px; + } + .years_select p, .years_select ul li a { + line-height: 13px; + height: 13px; + } + .years_select ul li a, .years_select p { + font-size: 12px; + } + .box-3 .content-margin { + margin-top: 15px; + } + .car-list ul li div.img_ img { + vertical-align: middle; + } + .buy_button { + margin-top: 3px; + margin-bottom: 6px; + } + + + /*5*/ + .contacts-wr {top: 239px;} + .maps-contacts-wr { + background: url("../images/map.jpg") 50% -247px no-repeat; + } + + /*все*/ + + + +} + + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +:before, +:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.img-responsive { + display: block; + max-width: 100%; + height: auto +} + +.img-rounded { + border-radius: 6px +} + +.img-thumbnail { + 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; + display: inline-block; + max-width: 100%; + height: auto +} + +.img-circle { + border-radius: 50% +} + +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px +} + +@media (min-width: 768px) { + .container { + width: 750px + } +} + +@media (min-width: 992px) { + .container { + width: 970px + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px +} + +.row { + margin-left: -15px; + margin-right: -15px +} + +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px +} + +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + 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-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { + 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-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { + 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-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { + 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 + } +} + +.clearfix:before, +.clearfix:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after { + content: " "; + display: table +} + +.clearfix:after, +.container:after, +.container-fluid:after, +.row:after { + clear: both +} + +.center-block { + display: block; + margin-left: auto; + margin-right: 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 +} + +.affix { + position: fixed +} + +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none!important +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none!important +} + +@media (max-width: 767px) { + .visible-xs { + display: block!important + } + table.visible-xs { + display: table!important + } + tr.visible-xs { + display: table-row!important + } + th.visible-xs, + td.visible-xs { + display: table-cell!important + } + .visible-xs-block { + display: block!important + } + .visible-xs-inline { + display: inline!important + } + .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!important + } + tr.visible-sm { + display: table-row!important + } + th.visible-sm, + td.visible-sm { + display: table-cell!important + } + .visible-sm-block { + display: block!important + } + .visible-sm-inline { + display: inline!important + } + .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!important + } + tr.visible-md { + display: table-row!important + } + th.visible-md, + td.visible-md { + display: table-cell!important + } + .visible-md-block { + display: block!important + } + .visible-md-inline { + display: inline!important + } + .visible-md-inline-block { + display: inline-block!important + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block!important + } + table.visible-lg { + display: table!important + } + tr.visible-lg { + display: table-row!important + } + th.visible-lg, + td.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 + } +} + +.visible-print { + display: none!important +} + +@media print { + .visible-print { + display: block!important + } + table.visible-print { + display: table!important + } + tr.visible-print { + display: table-row!important + } + th.visible-print, + td.visible-print { + display: table-cell!important + } +} + +.visible-print-block { + display: none!important +} + +@media print { + .visible-print-block { + display: block!important + } +} + +.visible-print-inline { + display: none!important +} + +@media print { + .visible-print-inline { + display: inline!important + } +} + +.visible-print-inline-block { + display: none!important +} + +@media print { + .visible-print-inline-block { + display: inline-block!important + } +} + +@media print { + .hidden-print { + display: none!important + } +} + +@media (max-width: 1199px) { + .sidebar_checks:nth-of-type(1), + .sidebar_checks_2:nth-child(1), + .sidebar_checks_2:nth-child(2) { + margin-top: 6px + } +} + +@media (max-width: 991px) { + .sidebar-transform.visible_ { + display: block!important; + position: fixed; + z-index: 99999; + top: 0; + left: -100%; + width: 100%; + height: 100%; + box-sizing: initial; + overflow-y: scroll; + padding: 0; + opacity: 0 + } + .sidebar-transform.visible_ .sidebar { + background: none; + z-index: 2 + } + .sidebar-transform.visible_ .sidebar:before { + width: 100%; + height: 100%; + background: #fff; + opacity: .96; + -ms-filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=96); + content: ''; + position: absolute; + top: 0; + left: 0 + } +} \ No newline at end of file diff --git a/frontend/web/css/test.scss b/frontend/web/css/test.scss new file mode 100755 index 0000000..99a8091 --- /dev/null +++ b/frontend/web/css/test.scss @@ -0,0 +1,2 @@ + + diff --git a/frontend/web/css/theme-style.css b/frontend/web/css/theme-style.css new file mode 100755 index 0000000..31f0174 --- /dev/null +++ b/frontend/web/css/theme-style.css @@ -0,0 +1,1255 @@ +@charset "UTF-8"; +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + box-sizing: border-box; } + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + +body { + line-height: 1; } + +ol, ul { + list-style: none; } + +blockquote, q { + quotes: none; } + +blockquote:before, blockquote:after { + content: ''; + content: none; } + +q:before, q:after { + content: ''; + content: none; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +img { + max-width: 100%; } + +button { + background-color: transparent; + outline: none; + border: 0; + cursor: pointer; } + +/* ╤Д╨╛╤А╨╝╨╕╤А╤Г╨╡╨╝ ╨║╨╜╨╛╨┐╨║╤Г ╨╖╨░╨║╤А╤Л╤В╨╕╤П */ +.close { + position: absolute; + padding: 0; + top: -24px; + right: -24px; + opacity: 1; + text-align: center; + text-decoration: none; + font-weight: bold; + line-height: 20px; + -webkit-transition: background-color ease .7s; + -moz-transition: background-color ease .7s; + -ms-transition: background-color ease .7s; + -o-transition: background-color ease .7s; + transition: background-color ease .7s; } + .close:hover:before { + color: #efba00; } + +.close:before { + color: rgba(255, 255, 255, 0.9); + content: '\2715'; + text-shadow: 0 -1px rgba(0, 0, 0, 0.9); + font-size: 22px; + color: #fcd016; } + +.has-error input { + border: 1px solid #dc0a05 !important; + box-shadow: none !important; } + +.form-control { + display: block; + box-sizing: border-box; + 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, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 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; } + +.has-error label, .has-error .help-block { + color: red; } +.has-error input { + border: 1px solid red; + box-shadow: none !important; } + +.form-group { + margin-bottom: 20px; } + .form-group label { + line-height: 24px; } + +.form-group-2-l { + display: flex; } + .form-group-2-l label { + line-height: 24px; + height: 34px; + padding: 5px; } + +.form-footer { + padding-top: 20px; + text-align: center; } + +.modal { + text-align: center; + padding: 0 !important; } + .modal:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -4px; } + .modal .modal-header { + padding-bottom: 0; + border-bottom: none; } + @media (min-width: 992px) { + .modal .modal-header { + padding: 40px 180px 0; } + .modal .modal-body { + padding: 0 180px 40px; } } + +.modal-dialog { + display: inline-block; + text-align: left; + vertical-align: middle; + margin: 30px; } + +/*! Pushy - v1.0.0 - 2016-3-1 +* Pushy is a responsive off-canvas navigation menu using CSS transforms & transitions. +* https://github.com/christophery/pushy/ +* by Christopher Yee */ +/* Menu Appearance */ +.pushy { + position: fixed; + width: 300px; + height: 100%; + top: 0; + z-index: 11; + background: #00aeff; + overflow: auto; + visibility: hidden; + -webkit-overflow-scrolling: touch; + /* enables momentum scrolling in iOS overflow elements */ } + .pushy a { + display: block; + color: rgba(255, 255, 255, 0.8); + padding: 15px 30px; + text-decoration: none; + outline: 0; + font-size: 18px; + text-transform: uppercase; } + .pushy a:hover { + color: #FFF; } + .pushy ul:first-child { + margin-top: 70px; } + .pushy.pushy-left { + left: 0; } + .pushy.pushy-right { + right: 0; } + +/* Menu Movement */ +.pushy-left { + -webkit-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); } + +.pushy-open-left #container, +.pushy-open-left .push { + -webkit-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); } + +.pushy-right { + -webkit-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); } + +.pushy-open-right #container, +.pushy-open-right .push { + -webkit-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); } + +.pushy-open-left .pushy, +.pushy-open-right .pushy { + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +/* Menu Transitions */ +#container, +.pushy, +.push { + transition: transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99); } + +/* Site Overlay */ +.site-overlay { + display: none; } + +.pushy-open-left .site-overlay, +.pushy-open-right .site-overlay { + display: block; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + background-color: rgba(0, 0, 0, 0.5); + -webkit-animation: fade 500ms; + animation: fade 500ms; } + +@keyframes fade { + 0% { + opacity: 0; } + 100% { + opacity: 1; } } +@-webkit-keyframes fade { + 0% { + opacity: 0; } + 100% { + opacity: 1; } } +/* Submenu Appearance */ +.pushy-submenu { + /* Submenu Icon */ } + .pushy-submenu ul { + padding-left: 15px; + transition: max-height 0.2s ease-in-out; } + .pushy-submenu ul .pushy-link { + transition: opacity 0.2s ease-in-out; } + .pushy-submenu > a { + position: relative; } + .pushy-submenu > a::after { + content: ''; + display: block; + height: 11px; + width: 8px; + position: absolute; + top: 50%; + right: 15px; + background: url("../img/arrow.svg") no-repeat; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + transition: transform 0.2s; } + +/* Submenu Movement */ +.pushy-submenu-closed ul { + max-height: 0; + overflow: hidden; } +.pushy-submenu-closed .pushy-link { + opacity: 0; } + +.pushy-submenu-open { + /* Submenu Icon */ } + .pushy-submenu-open ul { + max-height: 1000px; } + .pushy-submenu-open .pushy-link { + opacity: 1; } + .pushy-submenu-open a::after { + -webkit-transform: translateY(-50%) rotate(90deg); + -ms-transform: translateY(-50%) rotate(90deg); + transform: translateY(-50%) rotate(90deg); } + +.no-csstransforms3d .pushy-submenu-closed ul { + max-height: none; + display: none; } + +/* + * Owl Carousel - Core + */ +.owl-carousel { + display: none; + width: 100%; + -webkit-tap-highlight-color: transparent; + /* position relative and z-index fix webkit rendering fonts issue */ + position: relative; + z-index: 1; } + .owl-carousel .owl-stage { + position: relative; + -ms-touch-action: pan-Y; } + .owl-carousel .owl-stage:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; } + .owl-carousel .owl-stage-outer { + position: relative; + overflow: hidden; + /* fix for flashing background */ + -webkit-transform: translate3d(0px, 0px, 0px); } + .owl-carousel .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-backface-visibility: hidden; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; } + .owl-carousel .owl-item img { + display: block; + width: 100%; + -webkit-transform-style: preserve-3d; } + .owl-carousel .owl-nav.disabled, + .owl-carousel .owl-dots.disabled { + display: none; } + .owl-carousel .owl-nav .owl-prev, + .owl-carousel .owl-nav .owl-next, + .owl-carousel .owl-dot { + cursor: pointer; + cursor: hand; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-loaded { + display: block; } + .owl-carousel.owl-loading { + opacity: 0; + display: block; } + .owl-carousel.owl-hidden { + opacity: 0; } + .owl-carousel.owl-refresh .owl-item { + display: none; } + .owl-carousel.owl-drag .owl-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-grab { + cursor: move; + cursor: grab; } + .owl-carousel.owl-rtl { + direction: rtl; } + .owl-carousel.owl-rtl .owl-item { + float: right; } + +/* No Js */ +.no-js .owl-carousel { + display: block; } + +/* + * Owl Carousel - Animate Plugin + */ +.owl-carousel .animated { + animation-duration: 1000ms; + animation-fill-mode: both; } +.owl-carousel .owl-animated-in { + z-index: 0; } +.owl-carousel .owl-animated-out { + z-index: 1; } +.owl-carousel .fadeOut { + animation-name: fadeOut; } + +@keyframes fadeOut { + 0% { + opacity: 1; } + 100% { + opacity: 0; } } +/* + * Owl Carousel - Auto Height Plugin + */ +.owl-height { + transition: height 500ms ease-in-out; } + +/* + * Owl Carousel - Lazy Load Plugin + */ +.owl-carousel .owl-item .owl-lazy { + opacity: 0; + transition: opacity 400ms ease; } +.owl-carousel .owl-item img.owl-lazy { + transform-style: preserve-3d; } + +/* + * Owl Carousel - Video Plugin + */ +.owl-carousel .owl-video-wrapper { + position: relative; + height: 100%; + background: #000; } +.owl-carousel .owl-video-play-icon { + position: absolute; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-left: -40px; + margin-top: -40px; + background: url("owl.video.play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + transition: transform 100ms ease; } +.owl-carousel .owl-video-play-icon:hover { + transform: scale(1.3, 1.3); } +.owl-carousel .owl-video-playing .owl-video-tn, +.owl-carousel .owl-video-playing .owl-video-play-icon { + display: none; } +.owl-carousel .owl-video-tn { + opacity: 0; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + transition: opacity 400ms ease; } +.owl-carousel .owl-video-frame { + position: relative; + z-index: 1; + height: 100%; + width: 100%; } + +/* + * Default theme - Owl Carousel CSS File + */ +.owl-theme .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-nav [class*='owl-'] { + color: #D6D6D6; + font-size: 36px; + margin: 5px; + padding: 4px 7px; + background: transperent; + display: inline-block; + cursor: pointer; + border-radius: 3px; } + .owl-theme .owl-nav [class*='owl-']:hover { + background: transperent; + color: #00aeff; + text-decoration: none; } + .owl-theme .owl-nav .disabled { + opacity: 0.5; + cursor: default; } +.owl-theme .owl-nav.disabled + .owl-dots { + margin-top: 10px; } +.owl-theme .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; + background: #f2f2f2; + margin: 0 -20px; } + .owl-theme .owl-dots .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; } + .owl-theme .owl-dots .owl-dot span { + width: 64px; + height: 2px; + margin: 20px 7px; + background: #d7d7d7; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; } + .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { + background: #00aeff; } + +.yyy * { + outline: 1px solid red; } + +body { + background-position: top center; + background-repeat: no-repeat; + font-family: 'Open Sans', sans-serif; + font-weight: 400; + font-size: 14px; + line-height: 1.2; + color: #333333; + position: relative; } + +.container { + 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: 930px; } } + @media (min-width: 1200px) { + .container { + width: 1170px; } } + +.row { + margin-right: -15px; + margin-left: -15px; } + +.flex-block-2, .flex-block-3 { + padding: 0 15px; } + +@media (min-width: 480px) { + .flex-container-xs { + display: flex; + flex-wrap: wrap; } + .flex-container-xs > .flex-block-2 { + width: 50%; } + .flex-container-xs > .flex-block-3 { + width: calc( 100% / 3 ); } } +@media (min-width: 768px) { + .flex-container-sm { + display: flex; + flex-wrap: wrap; } + .flex-container-sm > .flex-block-2 { + width: 50%; } } +@media (min-width: 992px) { + .flex-container-md { + display: flex; + flex-wrap: wrap; } + .flex-container-md > .flex-block-2 { + width: 50%; } } +@media (min-width: 1200px) { + .flex-container-lg { + display: flex; + flex-wrap: wrap; } + .flex-container-lg > .flex-block-2 { + width: 50%; } } +header { + position: fixed; + width: 100%; + z-index: 9; } + header .container { + position: relative; } + header .container .navbar-brand { + padding: 0 15px; + width: 195px; + height: 57px; + background-image: url("../images/logo.png"); + background-repeat: no-repeat; + transition: all 0.8s; } + .contrast header .container .navbar-brand { + background-image: url("../images/logo2.png"); } + +/* Icon 1 */ +.menu-btn { + width: 30px; + height: 22.5px; + position: fixed; + top: 16px; + right: 15px; + z-index: 15; + margin: 0 auto; + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + -webkit-transition: .5s ease-in-out; + -moz-transition: .5s ease-in-out; + -o-transition: .5s ease-in-out; + transition: .5s ease-in-out; + cursor: pointer; } + .menu-btn span { + display: block; + position: absolute; + height: 4px; + width: 100%; + background: #00aeff; + border-radius: 9px; + opacity: 1; + left: 0; + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + -webkit-transition: .25s ease-in-out; + -moz-transition: .25s ease-in-out; + -o-transition: .25s ease-in-out; + transition: .25s ease-in-out; } + .menu-btn span:nth-child(1) { + top: 0px; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; } + .menu-btn span:nth-child(2) { + top: 9px; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; } + .menu-btn span:nth-child(3) { + top: 18px; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; } + .menu-btn.open span { + background: white; } + .menu-btn.open span:nth-child(1) { + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + top: -3px; + left: 8px; } + .menu-btn.open span:nth-child(2) { + width: 0%; + opacity: 0; } + .menu-btn.open span:nth-child(3) { + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + transform: rotate(-45deg); + top: 18px; + left: 8px; } + +h1 { + font-size: 46px; + font-weight: 700; + color: #00aeff; + margin-bottom: 20px; } + h1 span { + color: #ffc000; } + @media (min-width: 480px) { + h1 { + font-size: 64px; } } + +h2 { + font-size: 32px; + font-weight: 700; + text-transform: uppercase; + text-align: center; + margin-bottom: 40px; } + +h4 { + font-size: 20px; + font-weight: 700; + text-transform: uppercase; + text-align: center; + margin-bottom: 20px; } + +p { + font-size: 16px; + margin-bottom: 10px; } + +.m-b-10 { + margin-bottom: 10px; } + +.m-b-20 { + margin-bottom: 20px; } + +.btn { + min-width: 100%; + height: 48px; + line-height: 36px; + padding: 6px 24px; + text-align: center; + display: inline-block; + background: #fff200; + color: #333333; + border-bottom: 2px solid #ffc000; + border-radius: 4px; + text-decoration: none; + font-size: 13px; + font-weight: 700; + text-transform: uppercase; + box-sizing: border-box; } + .btn:hover { + border-bottom: 2px solid #fff200; } + @media (min-width: 480px) { + .btn { + min-width: 262px; } } + +.btn-questions, .btn-questions-left, .btn-questions-right { + display: none; + height: 34px; + background: rgba(0, 0, 0, 0.6); + padding: 3px 0 0 34px; + color: rgba(255, 255, 255, 0.9); + font-size: 10px; + text-transform: uppercase; + line-height: 14px; + text-align: left; + text-decoration: none; + position: absolute; + bottom: 5px; + overflow: hidden; + width: 166px; + padding-left: 40px; + transition: 0.2s; } + .btn-questions:before, .btn-questions-left:before, .btn-questions-right:before { + position: absolute; + left: 5px; + top: 50%; + margin-top: -12px; + width: 24px; + height: 24px; + background: url(../images/questions.png) no-repeat; + content: ''; } + .btn-questions:hover, .btn-questions-left:hover, .btn-questions-right:hover { + color: white; } + +@media (min-width: 992px) { + .btn-questions, .btn-questions-left, .btn-questions-right { + display: block; } } +.btn-questions-left { + left: 0; + border-bottom-right-radius: 34px; + border-top-right-radius: 34px; } + +.btn-questions-right { + right: 0; + border-bottom-left-radius: 34px; + border-top-left-radius: 34px; } + +.link { + color: #00aeff; + text-decoration: underline; } + .link:hover { + text-decoration: none; } + +.text-center { + text-align: center; } + +.text-primary { + color: #00aeff; } + +.text-right { + text-align: right; } + +.text-danger { + color: red; } +.danger-text label:after{ + content:'*'; + color:red; +} + +header{ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#000000', endColorstr = 'transparent'); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr = '#000000', endColorstr = 'transparent')"; + background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.45), transparent); + background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.45), transparent); + background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.45), transparent); + background-image: -webkit-gradient(linear, center top, center bottom, from(rgba(0, 0, 0, 0.45)), to(transparent)); + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.45), transparent); + background-image: linear-gradient(top, rgba(0, 0, 0, 0.45), transparent); +} + +.form-group-2-l .form-group{ + display: -webkit-inline-box; + width: 50%; + margin-right: 5%; +} +.form-group-2-l{ + margin-top: 5px; +} +.has-success .form-control{ + border-color:#ccc; +} +.has-success .control-label{ + color:#000!important; +} +.form-control:focus, .has-success .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); +} + +strong { + font-weight: 700; } + +em { + font-style: italic; } + +.d-inline-block { + display: inline-block; } + +.page_section { + padding: 60px 0; } + +.navbar { + background: #00aeff; + width: 280px; + height: 100ch; + position: fixed; + top: 0; + right: 0; + z-index: 10; } + .navbar ul { + display: flex; + flex-direction: column; } + .navbar ul li { + border-top: 1px solid white; } + .navbar ul li a { + color: white; + text-decoration: none; + padding: 20px; + font-size: 16px; + display: inline-block; } + +.for-lang { + position: relative; } + .for-lang .language { + display: block; + position: absolute; + top: 74px; + right: 7px; + font-size: 14px; + border-radius: 10px; + background: transparent; + transition: all 0.2s; + z-index: 15; } + .for-lang .language div { + display: none; } + .for-lang .language a, .for-lang .language span { + display: inline-block; + padding: 5px 24px 5px 10px; + position: relative; + text-transform: uppercase; + color: #00aeff; } + .for-lang .language a { + text-decoration: underline; } + .for-lang .language a:hover { + text-decoration: none; } + .for-lang .language span:before { + position: absolute; + right: 8px; + top: 50%; + margin-top: -2px; + content: ''; + width: 8px; + height: 5px; + background: url(../images/toggler.png) no-repeat; + transition: all 0.2s; } + .for-lang .language:hover { + background: rgba(0, 0, 0, 0.5); } + .for-lang .language:hover span:before { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); } + .for-lang .language:hover div { + display: block; } + @media (min-width: 480px) { + .for-lang .language { + top: 16px; + right: 100px; } } + +.section1 { + width: 100%; } + .section1 .container { + position: relative; + max-height: 1200px; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: flex-end; } + .section1 .btn { + margin-bottom: 20px; } + .section1.box-1 { + background-image: url(../images/slider/big-bg-1.jpg); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + transition: 0.5s; } + .section1 .slider_wr_ { + display: none; } + .section1 .slider_wr_ img { + box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.75); } + @media (min-width: 768px) { + .section1 .slider_wr_ { + display: block; } + .section1 .slider_wr_ .slide-ul { + display: flex; } + .section1 .slider_wr_ .slide-ul li { + margin: 15px; } } + .section1 .slider_wr_ .time-bloks { + width: 100%; + height: 5px; + background: #5c5a64; + z-index: 2; + display: none; } + .section1 .slider_wr_ .slide-ul .active_n .time-bloks { + display: block; } + .section1 .slider_wr_ .time-bloks-line { + width: 0; + height: 100%; + background: #00aeff; } + +@media (min-width: 992px) { + .section2 { + background-image: url("../images/2/bg2.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; } } +.section2 .flex-block-2 { + text-align: center; + position: relative; } + .section2 .flex-block-2 img { + display: inline-block; + margin-bottom: 10px; } + .section2 .flex-block-2 h3 { + color: #00aeff; + font-weight: 700; } + .section2 .flex-block-2 h3 .big { + font-size: 24px; } + .section2 .flex-block-2 p { + margin-bottom: 20px; } + +.section3 { + background-image: url("../images/3/bg.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; } + .section3 h2 { + color: white; } + .section3 .card { + background: white; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3); + padding: 20px 20px 0; + margin-bottom: 20px; } + .section3 .nav-tabs { + border-bottom: 2px solid #DDD; } + .section3 .nav-tabs.nav-tabs-main > li { + width: calc(100%/3); } + @media (min-width: 480px) { + .section3 .nav-tabs.nav-tabs-main > li { + width: inherit; } } + .section3 .nav-tabs.nav-tabs-year { + border-bottom: 2px solid transparent; } + .section3 .nav-tabs > li.active > a, + .section3 .nav-tabs > li.active > a:focus, + .section3 .nav-tabs > li.active > a:hover { + border-width: 0; } + .section3 .nav-tabs > li > a, .section3 .nav-tabs > li > span { + border: none; + color: #333333; + font-weight: bold; + padding: 10px 15px; + display: inline-block; } + .section3 .nav-tabs > li.active > a, .section3 .nav-tabs > li > a:hover { + border: none; + color: #00aeff; + background: transparent; } + .section3 .nav-tabs > li > a::after { + content: ""; + background: #00aeff; + height: 2px; + position: absolute; + width: 100%; + left: 0px; + bottom: -1px; + transition: all 250ms ease 0s; + transform: scale(0); } + .section3 .nav-tabs > li.active > a::after, .section3 .nav-tabs > li:hover > a::after { + transform: scale(1); } + .section3 .tab-nav > li > a::after { + background: #21527d none repeat scroll 0% 0%; + color: #fff; } + .section3 .tab-pane { + padding: 15px 0 0 0; } + .section3 .tab-content { + padding: 0; } + .section3 .owl-carousel .item .btn { + min-width: inherit; + margin-bottom: 20px; } + .section3 .owl-carousel .item .img { + margin-bottom: 10px; } + .section3 .owl-carousel .item .specifications { + margin-bottom: 10px; } + .section3 .owl-carousel .item .specifications p { + font-size: 13px; + margin-bottom: 0; } + .section3 .owl-carousel .item .price { + font-size: 18px; + color: #00aeff; + text-align: center; + margin-top: 6px; + margin-bottom: 20px; } + +@media (min-width: 992px) { + .section4 { + background-image: url("../images/4/bg2.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; } } +.section4 .flex-block-2 { + text-align: center; + position: relative; } + .section4 .flex-block-2 img { + display: inline-block; + margin-bottom: 10px; } + .section4 .flex-block-2 p { + margin-bottom: 20px; } + +.section5 { + background-image: url("../images/5/bg.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + transition: 0.5s; } + .section5 h2 { + color: white; } + .section5 .r-b-p-2 { + border-left: 2px solid #00aeff; + padding-left: 10px; + color: white; } + .section5 .r-b-p-2 .text-yellow { + color: #fff200; } + .section5 .r-b-p-2:first-child { + display: flex; + align-items: center; + padding-right: 20px; } + .section5 .card { + background: white; + padding: 20px; + margin-bottom: 20px; + position: relative; } + .section5 .card .deposit { + width: 190px; + height: 43px; + border-left: 18px solid transparent; + border-bottom: 43px solid #00aeff; + margin-right: -20px; + display: inline-block; } + @media (min-width: 480px) { + .section5 .card .deposit { + position: absolute; + bottom: 0; + right: 0; } } + .section5 .card .deposit p { + color: #fff; + float: left; + font-size: 24px; + font-weight: 700; + line-height: 43px; + margin-bottom: 0; } + .section5 .card .deposit p span { + font-weight: normal; + font-size: 13px; + width: 80px; + display: table-cell; + line-height: 15px; + height: 43px; + vertical-align: middle; + padding-left: 10px; } + .section5 .card .price { + margin-bottom: 20px; + position: relative; } + .section5 .card .price .price-row { + overflow: hidden; } + .section5 .card .price .price-name .price-name-title { + float: left; + margin-right: 5px; + font-size: 15px; + line-height: 30px; + color: #333; } + .section5 .card .price .price-name .price-name-border { + overflow: hidden; } + .section5 .card .price .price-name .price-name-border span { + width: 100%; + height: 21px; + border-bottom: 2px dotted #b7b7b7; + display: block; } + .section5 .card .price .price-cost { + font-size: 15px; + color: #00aeff; + line-height: 30px; + margin-left: 5px; + float: left; } + .section5 .card .price .price-name-wr { + width: 102px; + float: left; } + .section5 .card ul { + margin-bottom: 20px; } + .section5 .card ul li { + margin-bottom: 10px; } + .section5 .card ul li:before { + content: ''; + height: 6px; + width: 6px; + background: #00aeff; + margin-right: 12px; + display: inline-block; + border-radius: 50%; } + .section5 .card .flex-block-3 { + text-align: center; } + .section5 .card .flex-block-3 img { + display: inline-block; } + .section5 h3 { + font-size: 18px; + font-weight: 700; + border-bottom: 1px solid #b7b7b7; + margin-bottom: 10px; + text-transform: uppercase; } + +.section6 { + text-align: center; } + .section6 h3 { + font-size: 24px; + color: #00aeff; + margin-bottom: 20px; } + .section6 p { + font-size: 14px; + margin-bottom: 20px; } + @media (min-width: 992px) { + .section6 { + background-image: url("../images/6/bg2.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; } } + .section6 .blue { + background: #f1f8fc; + padding: 20px 20px; + margin-bottom: 20px; } + .section6 a.facebook { + padding-left: 60px; + background-image: url("../images/6/f.png"); + background-repeat: no-repeat; + background-position: center left; + height: 48px; + text-align: left; + display: inline-block; + color: #00aeff; + font-weight: bold; + margin-left: 20px; } + .section6 a.facebook span { + position: relative; + text-decoration: underline; + top: 8px; } + .section6 a.facebook:hover span { + text-decoration: none; } + .section6 ul { + display: flex; + justify-content: center; } + .section6 ul li { + font-weight: bold; + display: inline-block; + padding: 5px 20px; + text-align: center; + color: #00aeff; } + .section6 ul li + li { + border-left: 1px solid #b7b7b7; } + +.section7 { + background-image: url("../images/7/bg.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + transition: 0.5s; + padding-bottom: 40px; } + .section7 h2 { + color: white; } + .section7 .flex-container { + display: flex; + flex-wrap: wrap; + justify-content: center; } + .section7 .flex-container > .flex-block { + width: 200px; + height: 60px; + line-height: 68px; + text-align: center; + background: white; + padding: 5px; + margin: 0 20px 20px 20px; } + +.section8 .container { + position: relative; } +.section8 .gmap { + display: none; + width: 100%; + height: 500px; } + @media (min-width: 992px) { + .section8 .gmap { + display: block; } } +.section8 .contacts { + background: white; + text-align: center; + margin: 50px 0; } + .section8 .contacts .contacts-img { + display: none; } + @media (min-width: 992px) { + .section8 .contacts { + display: block; } + .section8 .contacts .contacts-tile { + padding: 10px 15px; + background: #00aeff; + color: white; } + .section8 .contacts .contacts-tile h2 { + margin: 0; } + .section8 .contacts .contacts-block { + padding: 10px 15px; } + .section8 .contacts .contacts-img { + display: block; + width: 100%; } } + @media (min-width: 992px) { + .section8 .contacts { + position: absolute; + right: 0; + top: 0; + width: calc(100%/4); + z-index: 3; } } + +footer { + padding: 12px 0 6px; + background: #333333; + color: white; } + footer p { + font-size: 14px; } + @media (min-width: 768px) { + footer .flex-block-2:last-child { + text-align: right; } } + footer a { + text-decoration: underline; + color: white; + display: inline-block; } + footer a img { + float: right; + margin-left: 10px; } + footer a:hover { + text-decoration: none; } + +/*# sourceMappingURL=theme-style.css.map */ diff --git a/frontend/web/css/theme-style.css.map b/frontend/web/css/theme-style.css.map new file mode 100755 index 0000000..5c6b7d6 --- /dev/null +++ b/frontend/web/css/theme-style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["reset.scss","modal.scss","breakpoints.scss","pushy.scss","theme-style.scss","owl.carousel/_core.scss","owl.carousel/_animate.scss","owl.carousel/_autoheight.scss","owl.carousel/_lazyload.scss","owl.carousel/_video.scss","owl.carousel/_theme.default.scss","owl.carousel/_theme.scss"], +"names": [], +"file": "theme-style.css" +} \ No newline at end of file diff --git a/frontend/web/css/theme-style.scss b/frontend/web/css/theme-style.scss new file mode 100755 index 0000000..85c0e6b --- /dev/null +++ b/frontend/web/css/theme-style.scss @@ -0,0 +1,924 @@ +$grid-gutter-width: 15px; +$primary-color: #00aeff; +$margin-lg: 50px; + + +@import "reset"; +@import "breakpoints"; +@import "modal"; +@import "pushy"; + +@import "owl.carousel/owl.carousel"; +@import "test"; + + + + +.yyy *{ + outline: 1px solid red; +} +body{ + //background-image:url("../images/bg.jpg"); +// background: black; + background-position:top center; + background-repeat:no-repeat; + font-family: 'Open Sans', sans-serif; + font-weight: 400; + font-size: 14px; + line-height: 1.2; + color: #333333; + position: relative; +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + //outline: 1px solid red; + @include respond-to('sm') { + width: 750px; + //outline: 1px solid blue; + } + @include respond-to ('md') { + width: 930px; + // outline: 1px solid yellow; + } + @include respond-to ('lg') { + width: 1170px; + // outline: 1px solid darkblue; + } +} +.row { + margin-right: -$grid-gutter-width; + margin-left: -$grid-gutter-width; +} +.flex-block-2,.flex-block-3 { + padding: 0 $grid-gutter-width; +} +@include respond-to('xs') { + .flex-container-xs { + display: flex; + flex-wrap: wrap; + &>.flex-block-2 { + width: 50%; + } + &>.flex-block-3 { + width: calc( 100% / 3 ); + } + } +} +@include respond-to('sm') { + .flex-container-sm { + display: flex; + flex-wrap: wrap; + &>.flex-block-2 { + width: 50%; + } + } + } +@include respond-to('md') { + .flex-container-md { + display: flex; + flex-wrap: wrap; + &>.flex-block-2 { + width: 50%; + } + } +} +@include respond-to('lg') { + .flex-container-lg { + display: flex; + flex-wrap: wrap; + &>.flex-block-2 { + width: 50%; + } + } +} + +header { + position: fixed; + width: 100%; + z-index: 9; + .container { + position: relative; + .navbar-brand { + padding: 0 15px; + width: 195px; + height: 57px; + background-image: url("../images/logo.png"); + background-repeat: no-repeat; + transition: all 0.8s; + .contrast &{ + background-image: url("../images/logo2.png"); + } + } + } +} + +/* Icon 1 */ +.menu-btn{ + width: 30px; + height: 22.5px; + position: fixed; + top: 16px; + right: 15px; + z-index: 15; + margin: 0 auto; + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + -webkit-transition: .5s ease-in-out; + -moz-transition: .5s ease-in-out; + -o-transition: .5s ease-in-out; + transition: .5s ease-in-out; + cursor: pointer; + & span { + display: block; + position: absolute; + height: 4px; + width: 100%; + background: $primary-color; + border-radius: 9px; + opacity: 1; + left: 0; + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + -webkit-transition: .25s ease-in-out; + -moz-transition: .25s ease-in-out; + -o-transition: .25s ease-in-out; + transition: .25s ease-in-out; + &:nth-child(1) { + top: 0px; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; + } + &:nth-child(2) { + top: 9px; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; + } + &:nth-child(3) { + top: 18px; + -webkit-transform-origin: left center; + -moz-transform-origin: left center; + -o-transform-origin: left center; + transform-origin: left center; + } + } + + &.open span{ + background: white; + &:nth-child(1) { + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + top: -3px; + left: 8px; + } + + &:nth-child(2) { + width: 0%; + opacity: 0; + } + + &:nth-child(3) { + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + transform: rotate(-45deg); + top: 18px; + left: 8px; + } + } +} +h1{ + font-size: 46px; + font-weight: 700; + color: $primary-color; + margin-bottom: 20px; + span{ + color: #ffc000; + } + @include respond-to('xs'){ + font-size: 64px; + } +} +h2{ + font-size: 32px; + font-weight: 700; + text-transform: uppercase; + text-align: center; + margin-bottom: 40px; +} +h4{ + font-size: 20px; + font-weight: 700; + text-transform: uppercase; + text-align: center; + margin-bottom: 20px; +} +p{ + font-size: 16px; + margin-bottom: 10px; +} +.m-b-10{ + margin-bottom: 10px; +} +.m-b-20{ + margin-bottom: 20px; +} +.btn{ + min-width: 100%; + height: 48px; + line-height: 36px; + padding: 6px 24px; + text-align: center; + display: inline-block; + background: #fff200; + color: #333333; + border-bottom: 2px solid #ffc000; + border-radius: 4px; + text-decoration: none; + font-size: 13px; + font-weight: 700; + text-transform: uppercase; + box-sizing: border-box; + + &:hover{ + border-bottom: 2px solid #fff200; + } + @include respond-to('xs'){ + min-width: 262px; + } +} +.btn-questions{ + display: none; + height: 34px; + background: rgba(0,0,0,0.6); + padding: 3px 0 0 34px; + color: rgba(256,256,256,.9); + font-size: 10px; + text-transform: uppercase; + line-height: 14px; + text-align: left; + text-decoration: none; + position: absolute; + bottom: 5px; + overflow: hidden; + width: 166px; + padding-left: 40px; + transition: 0.2s; + &:before { + position: absolute; + left: 5px; + top: 50%; + margin-top: -12px; + width: 24px; + height: 24px; + background: url(../images/questions.png) no-repeat; + content: ''; + } + &:hover{ + color: rgba(256,256,256,1); + } +} +@include respond-to('md'){ + .btn-questions{ + display: block; + } +} +.btn-questions-left{ + @extend .btn-questions; + left: 0; + border-bottom-right-radius: 34px; + border-top-right-radius: 34px; +} +.btn-questions-right{ + @extend .btn-questions; + right: 0; + border-bottom-left-radius: 34px; + border-top-left-radius: 34px; +} +.link{ + color: $primary-color; + text-decoration: underline; + &:hover{ + text-decoration: none; + } +} +.text-center{ + text-align: center; +} +.text-primary{ + color: $primary-color; +} +.text-right{ + text-align: right; +} +.text-danger { + color: red; +} +strong{ + font-weight: 700; +} +em{ + font-style: italic; +} +.d-inline-block{ + display: inline-block; +} +.page_section{ + padding: 60px 0; +} +.navbar{ + background: $primary-color; + width: 280px; + height: 100ch; + position: fixed; + top:0; + right: 0; + z-index: 10; + ul{ + display: flex; + flex-direction: column; + li{ + border-top: 1px solid white; + a{ + color: white; + text-decoration: none ; + padding: 20px; + font-size: 16px; + display: inline-block; + } + } + } +} +.for-lang{ + position: relative; + .language{ + display: block; + position: absolute; + top: 74px; + right: 7px; + font-size: 14px; + border-radius: 10px; + background: transparent; + transition: all 0.2s; + z-index: 15; + + div{ + display: none; + } + a, span{ + display: inline-block; + padding: 5px 24px 5px 10px; + position: relative; + text-transform: uppercase; + color: $primary-color;; + } + a{ + text-decoration: underline; + &:hover{ + text-decoration: none; + } + } + span:before { + position: absolute; + right: 8px; + top: 50%; + margin-top: -2px; + content: ''; + width: 8px; + height: 5px; + background: url(../images/toggler.png) no-repeat; + transition: all 0.2s; + } + &:hover{ + background: rgba(0,0,0,.5); + span:before { + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + } + div{ + display: block; + } + } + } + @include respond-to('xs'){ + .language{ + top: 16px; + right: 100px; + } + } + +} +.section1{ + width: 100%; + .container{ + position: relative; + max-height: 1200px; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: flex-end; + } + + .btn{ + margin-bottom: 20px; + } + &.box-1 { + background-image: url(../images/slider/big-bg-1.jpg); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + transition: 0.5s; + } + .slider_wr_{ + display: none; + img{ + box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.75); + } + @include respond-to('sm') { + display: block; + .slide-ul{ + display: flex; + li{ + margin: 15px; + } + } + } + .time-bloks { + width: 100%; + height: 5px; + background: #5c5a64; + z-index: 2; + display: none; + } + .slide-ul .active_n .time-bloks { + display: block; + } + .time-bloks-line { + width: 0; + height: 100%; + background: #00aeff; + } + } +} +.section2{ + @include respond-to('md') { + background-image: url("../images/2/bg2.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + } + .flex-block-2{ + text-align: center; + position: relative; + img{ + display: inline-block; + margin-bottom: 10px; + } + h3{ + color: $primary-color; + font-weight: 700; + .big{ + font-size: 24px; + } + } + p{ + margin-bottom: 20px; + } + } +} +.section3{ + background-image: url("../images/3/bg.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + h2{ + color: white; + } + .card { + background: white; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3); + padding: 20px 20px 0; + margin-bottom: 20px; + } + .nav-tabs{ + border-bottom: 2px solid #DDD; + &.nav-tabs-main{ + &> li{ + width: calc(100%/3); + @include respond-to('xs'){ + width: inherit; + } + } + } + &.nav-tabs-year{ + border-bottom: 2px solid transparent; + } + } + .nav-tabs > li.active > a, + .nav-tabs > li.active > a:focus, + .nav-tabs > li.active > a:hover { + border-width: 0; + } + .nav-tabs > li > a, .nav-tabs > li > span { + border: none; + color: #333333; + font-weight: bold; + padding: 10px 15px; + display: inline-block; + } + .nav-tabs > li.active > a, .nav-tabs > li > a:hover { + border: none; + color: $primary-color; + background: transparent; + } + .nav-tabs > li > a::after { + content: ""; + background: $primary-color; + height: 2px; + position: absolute; + width: 100%; + left: 0px; + bottom: -1px; + transition: all 250ms ease 0s; + transform: scale(0); + } + .nav-tabs > li.active > a::after, .nav-tabs > li:hover > a::after { + transform: scale(1); + } + .tab-nav > li > a::after { + background: #21527d none repeat scroll 0% 0%; + color: #fff; + } + .tab-pane{ + padding: 15px 0 0 0; + } + .tab-content{ + padding: 0; + } + .owl-carousel{ + .item{ + .btn{ + min-width: inherit; + margin-bottom: 20px; + } + .img{ + margin-bottom: 10px; + } + .specifications{ + margin-bottom: 10px; + p{ + font-size: 13px; + margin-bottom: 0; + } + } + .price { + font-size: 18px; + color: $primary-color; + text-align: center; + margin-top: 6px; + margin-bottom: 20px; + } + } + } +} +.section4{ + @include respond-to('md') { + background-image: url("../images/4/bg2.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover + } + .flex-block-2{ + text-align: center; + position: relative; + img{ + display: inline-block; + margin-bottom: 10px; + } + p{ + margin-bottom: 20px; + } + } +} +.section5{ + background-image: url("../images/5/bg.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + transition: 0.5s; + h2{ + color: white; + } + .r-b-p-2{ + border-left: 2px solid $primary-color; + padding-left: 10px; + color: white; + .text-yellow{ + color: #fff200; + } + &:first-child{ + display: flex; + align-items: center; + padding-right: 20px; + } + } + .card{ + background: white; + padding: 20px; + margin-bottom: 20px; + position: relative; + .deposit{ + width: 190px; + height: 43px; + border-left: 18px solid transparent; + border-bottom: 43px solid $primary-color; + margin-right: -20px; + display: inline-block; + @include respond-to('xs'){ + position: absolute; + bottom: 0; + right: 0; + } + p{ + color: #fff; + float: left; + font-size: 24px; + font-weight: 700; + line-height: 43px; + margin-bottom: 0; + span { + font-weight: normal; + font-size: 13px; + width: 80px; + display: table-cell; + line-height: 15px; + height: 43px; + vertical-align: middle; + padding-left: 10px; + } + } + } + .price{ + margin-bottom: 20px; + position: relative; + .price-row{ + overflow: hidden; + } + .price-name{ + .price-name-title { + float: left; + margin-right: 5px; + font-size: 15px; + line-height: 30px; + color: #333; + } + .price-name-border { + overflow: hidden; + span { + width: 100%; + height: 21px; + border-bottom: 2px dotted #b7b7b7; + display: block; + } + } + } + .price-cost { + font-size: 15px; + color: $primary-color; + line-height: 30px; + margin-left: 5px; + float: left; + } + .price-name-wr { + width: 102px; + float: left; + } + } + ul{ + margin-bottom: 20px; + li{ + margin-bottom: 10px; + &:before { + content: ''; + height: 6px; + width: 6px; + background: $primary-color; + margin-right: 12px; + display: inline-block; + border-radius: 50%; + } + } + } + .flex-block-3{ + text-align: center; + img{ + display: inline-block; + } + } + } + h3{ + font-size: 18px; + font-weight: 700; + border-bottom: 1px solid #b7b7b7; + margin-bottom: 10px; + text-transform: uppercase; + } +} +.section6{ + text-align: center; + h3{ + font-size: 24px; + color: $primary-color; + margin-bottom: 20px; + } + p{ + font-size: 14px; + margin-bottom: 20px; + } + + @include respond-to('md') { + background-image: url("../images/6/bg2.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover + } + .blue{ + background: #f1f8fc; + padding: 20px 20px; + margin-bottom: 20px; + } + a.facebook{ + // float: right; + padding-left: 60px; + background-image: url("../images/6/f.png"); + background-repeat: no-repeat; + background-position: center left; + height: 48px; + text-align: left; + display: inline-block; + color: $primary-color; + font-weight: bold; + margin-left: 20px; + span{ + position: relative; + text-decoration: underline; + top: 8px; + } + &:hover{ + span{ + text-decoration: none; + } + } + } + ul{ + display: flex; + justify-content: center; + li{ + font-weight: bold; + display: inline-block; + padding: 5px 20px; + text-align: center; + color: $primary-color; + } + li + li{ + border-left: 1px solid #b7b7b7; + } + } +} +.section7{ + background-image: url("../images/7/bg.jpg"); + background-repeat: no-repeat; + background-position: 50% 50%; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + transition: 0.5s; + padding-bottom: 40px; + h2{ + color: white; + } + .flex-container{ + display: flex; + flex-wrap: wrap; + justify-content: center; + &>.flex-block{ + width: 200px; + height: 60px; + line-height: 68px; + text-align: center; + background: white; + padding: 5px; + margin: 0 20px 20px 20px; + } + } +} +.section8{ + .container{ + position: relative; + } + .gmap{ + display: none; + @include respond-to('md') { + display: block; + } + width: 100%; + height: 500px; + } + .contacts{ + background: white; + text-align: center; + margin: 50px 0; + .contacts-img{ + display: none; + } + @include respond-to('md') { + display: block; + .contacts-tile{ + padding: 10px 15px; + background: $primary-color; + color: white; + h2{ + margin: 0; + } + } + .contacts-block{ + padding: 10px 15px; + } + .contacts-img{ + display: block; + width: 100%; + } + } + @include respond-to('md') { + position: absolute; + right: 0; + top: 0; + width: calc(100%/4); + z-index: 3; + } + } +} +footer{ + padding: 12px 0 6px; + background: #333333; + color: rgba(255, 255, 255, 1); + p{ + font-size: 14px; + } + @include respond-to('sm') { + .flex-block-2:last-child{ + text-align: right; + } + } + a{ + text-decoration: underline; + color: rgba(255, 255, 255, 1); + display: inline-block; + img { + float: right; + margin-left: 10px; + } + &:hover{ + text-decoration: none; + } + } +} diff --git a/frontend/web/favicon.ico b/frontend/web/favicon.ico new file mode 100755 index 0000000..580ed73 Binary files /dev/null and b/frontend/web/favicon.ico differ diff --git a/frontend/web/images/1/bg-1.jpg b/frontend/web/images/1/bg-1.jpg new file mode 100755 index 0000000..dea0680 Binary files /dev/null and b/frontend/web/images/1/bg-1.jpg differ diff --git a/frontend/web/images/1/bg-2.jpg b/frontend/web/images/1/bg-2.jpg new file mode 100755 index 0000000..cbaaf79 Binary files /dev/null and b/frontend/web/images/1/bg-2.jpg differ diff --git a/frontend/web/images/1/bg-3.jpg b/frontend/web/images/1/bg-3.jpg new file mode 100755 index 0000000..d5332b6 Binary files /dev/null and b/frontend/web/images/1/bg-3.jpg differ diff --git a/frontend/web/images/1/bg-4.jpg b/frontend/web/images/1/bg-4.jpg new file mode 100755 index 0000000..cecf24f Binary files /dev/null and b/frontend/web/images/1/bg-4.jpg differ diff --git a/frontend/web/images/2/bg.jpg b/frontend/web/images/2/bg.jpg new file mode 100755 index 0000000..9b12f65 Binary files /dev/null and b/frontend/web/images/2/bg.jpg differ diff --git a/frontend/web/images/2/bg2.jpg b/frontend/web/images/2/bg2.jpg new file mode 100755 index 0000000..5e44791 Binary files /dev/null and b/frontend/web/images/2/bg2.jpg differ diff --git a/frontend/web/images/2/icon1.png b/frontend/web/images/2/icon1.png new file mode 100755 index 0000000..3020d75 Binary files /dev/null and b/frontend/web/images/2/icon1.png differ diff --git a/frontend/web/images/2/icon2.png b/frontend/web/images/2/icon2.png new file mode 100755 index 0000000..5a92fa9 Binary files /dev/null and b/frontend/web/images/2/icon2.png differ diff --git a/frontend/web/images/2/icon3.png b/frontend/web/images/2/icon3.png new file mode 100755 index 0000000..59a412a Binary files /dev/null and b/frontend/web/images/2/icon3.png differ diff --git a/frontend/web/images/2/icon4.png b/frontend/web/images/2/icon4.png new file mode 100755 index 0000000..f82a3da Binary files /dev/null and b/frontend/web/images/2/icon4.png differ diff --git a/frontend/web/images/2/icon5.png b/frontend/web/images/2/icon5.png new file mode 100755 index 0000000..1ddc7b3 Binary files /dev/null and b/frontend/web/images/2/icon5.png differ diff --git a/frontend/web/images/2/icon6.png b/frontend/web/images/2/icon6.png new file mode 100755 index 0000000..517c97e Binary files /dev/null and b/frontend/web/images/2/icon6.png differ diff --git a/frontend/web/images/3/bg.jpg b/frontend/web/images/3/bg.jpg new file mode 100755 index 0000000..2aa2bfd Binary files /dev/null and b/frontend/web/images/3/bg.jpg differ diff --git a/frontend/web/images/4/bg.jpg b/frontend/web/images/4/bg.jpg new file mode 100755 index 0000000..cff5fb1 Binary files /dev/null and b/frontend/web/images/4/bg.jpg differ diff --git a/frontend/web/images/4/bg2.jpg b/frontend/web/images/4/bg2.jpg new file mode 100755 index 0000000..690b5cf Binary files /dev/null and b/frontend/web/images/4/bg2.jpg differ diff --git a/frontend/web/images/4/icon1.png b/frontend/web/images/4/icon1.png new file mode 100755 index 0000000..587edc5 Binary files /dev/null and b/frontend/web/images/4/icon1.png differ diff --git a/frontend/web/images/4/icon2.png b/frontend/web/images/4/icon2.png new file mode 100755 index 0000000..21bbd7a Binary files /dev/null and b/frontend/web/images/4/icon2.png differ diff --git a/frontend/web/images/4/icon3.png b/frontend/web/images/4/icon3.png new file mode 100755 index 0000000..0b6fe38 Binary files /dev/null and b/frontend/web/images/4/icon3.png differ diff --git a/frontend/web/images/4/icon4.png b/frontend/web/images/4/icon4.png new file mode 100755 index 0000000..3c2ee6c Binary files /dev/null and b/frontend/web/images/4/icon4.png differ diff --git a/frontend/web/images/4/icon5.png b/frontend/web/images/4/icon5.png new file mode 100755 index 0000000..2e1b81a Binary files /dev/null and b/frontend/web/images/4/icon5.png differ diff --git a/frontend/web/images/4/icon6.png b/frontend/web/images/4/icon6.png new file mode 100755 index 0000000..c0bc2fd Binary files /dev/null and b/frontend/web/images/4/icon6.png differ diff --git a/frontend/web/images/5/bg.jpg b/frontend/web/images/5/bg.jpg new file mode 100644 index 0000000..de6db9f Binary files /dev/null and b/frontend/web/images/5/bg.jpg differ diff --git a/frontend/web/images/5/img-1.jpg b/frontend/web/images/5/img-1.jpg new file mode 100755 index 0000000..d9c4678 Binary files /dev/null and b/frontend/web/images/5/img-1.jpg differ diff --git a/frontend/web/images/5/img-2.jpg b/frontend/web/images/5/img-2.jpg new file mode 100755 index 0000000..4db7092 Binary files /dev/null and b/frontend/web/images/5/img-2.jpg differ diff --git a/frontend/web/images/5/img-3.jpg b/frontend/web/images/5/img-3.jpg new file mode 100755 index 0000000..4867b1c Binary files /dev/null and b/frontend/web/images/5/img-3.jpg differ diff --git a/frontend/web/images/5/img-4.png b/frontend/web/images/5/img-4.png new file mode 100755 index 0000000..e4473aa Binary files /dev/null and b/frontend/web/images/5/img-4.png differ diff --git a/frontend/web/images/6/bg.jpg b/frontend/web/images/6/bg.jpg new file mode 100755 index 0000000..22c61f2 Binary files /dev/null and b/frontend/web/images/6/bg.jpg differ diff --git a/frontend/web/images/6/bg2.jpg b/frontend/web/images/6/bg2.jpg new file mode 100755 index 0000000..4dea419 Binary files /dev/null and b/frontend/web/images/6/bg2.jpg differ diff --git a/frontend/web/images/6/f.png b/frontend/web/images/6/f.png new file mode 100755 index 0000000..ad9aff2 Binary files /dev/null and b/frontend/web/images/6/f.png differ diff --git a/frontend/web/images/7/bg.jpg b/frontend/web/images/7/bg.jpg new file mode 100755 index 0000000..07efe55 Binary files /dev/null and b/frontend/web/images/7/bg.jpg differ diff --git a/frontend/web/images/7/logo-1.png b/frontend/web/images/7/logo-1.png new file mode 100755 index 0000000..c5e5981 Binary files /dev/null and b/frontend/web/images/7/logo-1.png differ diff --git a/frontend/web/images/7/logo-2.png b/frontend/web/images/7/logo-2.png new file mode 100755 index 0000000..8c4b756 Binary files /dev/null and b/frontend/web/images/7/logo-2.png differ diff --git a/frontend/web/images/7/logo-3.png b/frontend/web/images/7/logo-3.png new file mode 100755 index 0000000..03e4549 Binary files /dev/null and b/frontend/web/images/7/logo-3.png differ diff --git a/frontend/web/images/7/logo-4.png b/frontend/web/images/7/logo-4.png new file mode 100755 index 0000000..cfe9276 Binary files /dev/null and b/frontend/web/images/7/logo-4.png differ diff --git a/frontend/web/images/8/bg-contacts.png b/frontend/web/images/8/bg-contacts.png new file mode 100755 index 0000000..3f51151 Binary files /dev/null and b/frontend/web/images/8/bg-contacts.png differ diff --git a/frontend/web/images/9/artweb.png b/frontend/web/images/9/artweb.png new file mode 100755 index 0000000..066be5f Binary files /dev/null and b/frontend/web/images/9/artweb.png differ diff --git a/frontend/web/images/artweb-logo.png b/frontend/web/images/artweb-logo.png new file mode 100755 index 0000000..d1044be Binary files /dev/null and b/frontend/web/images/artweb-logo.png differ diff --git a/frontend/web/images/bg-1.jpg b/frontend/web/images/bg-1.jpg new file mode 100755 index 0000000..af0e010 Binary files /dev/null and b/frontend/web/images/bg-1.jpg differ diff --git a/frontend/web/images/bg-2.jpg b/frontend/web/images/bg-2.jpg new file mode 100755 index 0000000..4efd082 Binary files /dev/null and b/frontend/web/images/bg-2.jpg differ diff --git a/frontend/web/images/bg-3.jpg b/frontend/web/images/bg-3.jpg new file mode 100755 index 0000000..6ae546c Binary files /dev/null and b/frontend/web/images/bg-3.jpg differ diff --git a/frontend/web/images/bg-4-2.jpg b/frontend/web/images/bg-4-2.jpg new file mode 100755 index 0000000..8f5d53e Binary files /dev/null and b/frontend/web/images/bg-4-2.jpg differ diff --git a/frontend/web/images/bg-4-3.jpg b/frontend/web/images/bg-4-3.jpg new file mode 100755 index 0000000..d7401f5 Binary files /dev/null and b/frontend/web/images/bg-4-3.jpg differ diff --git a/frontend/web/images/bg-4.jpg b/frontend/web/images/bg-4.jpg new file mode 100755 index 0000000..7b329f1 Binary files /dev/null and b/frontend/web/images/bg-4.jpg differ diff --git a/frontend/web/images/bg-4.png b/frontend/web/images/bg-4.png new file mode 100755 index 0000000..c5cbbd8 Binary files /dev/null and b/frontend/web/images/bg-4.png differ diff --git a/frontend/web/images/bg-5.jpg b/frontend/web/images/bg-5.jpg new file mode 100755 index 0000000..1d16303 Binary files /dev/null and b/frontend/web/images/bg-5.jpg differ diff --git a/frontend/web/images/bg-contacts.png b/frontend/web/images/bg-contacts.png new file mode 100755 index 0000000..f709066 Binary files /dev/null and b/frontend/web/images/bg-contacts.png differ diff --git a/frontend/web/images/calendar_arrows.png b/frontend/web/images/calendar_arrows.png new file mode 100755 index 0000000..1e7c334 Binary files /dev/null and b/frontend/web/images/calendar_arrows.png differ diff --git a/frontend/web/images/check.svg b/frontend/web/images/check.svg new file mode 100755 index 0000000..d2b2040 --- /dev/null +++ b/frontend/web/images/check.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/frontend/web/images/close-form.png b/frontend/web/images/close-form.png new file mode 100755 index 0000000..6983455 Binary files /dev/null and b/frontend/web/images/close-form.png differ diff --git a/frontend/web/images/ico-2/ico-1.png b/frontend/web/images/ico-2/ico-1.png new file mode 100755 index 0000000..b3ad265 Binary files /dev/null and b/frontend/web/images/ico-2/ico-1.png differ diff --git a/frontend/web/images/ico-2/ico-2.png b/frontend/web/images/ico-2/ico-2.png new file mode 100755 index 0000000..aaadbf4 Binary files /dev/null and b/frontend/web/images/ico-2/ico-2.png differ diff --git a/frontend/web/images/ico-2/ico-3.png b/frontend/web/images/ico-2/ico-3.png new file mode 100755 index 0000000..ccac8b6 Binary files /dev/null and b/frontend/web/images/ico-2/ico-3.png differ diff --git a/frontend/web/images/ico-2/ico-4.png b/frontend/web/images/ico-2/ico-4.png new file mode 100755 index 0000000..a6aee58 Binary files /dev/null and b/frontend/web/images/ico-2/ico-4.png differ diff --git a/frontend/web/images/ico-2/ico-5.png b/frontend/web/images/ico-2/ico-5.png new file mode 100755 index 0000000..bd2bc8c Binary files /dev/null and b/frontend/web/images/ico-2/ico-5.png differ diff --git a/frontend/web/images/ico-2/ico-6.png b/frontend/web/images/ico-2/ico-6.png new file mode 100755 index 0000000..2b8b834 Binary files /dev/null and b/frontend/web/images/ico-2/ico-6.png differ diff --git a/frontend/web/images/ico-3/ico-1.png b/frontend/web/images/ico-3/ico-1.png new file mode 100755 index 0000000..3b0f3f2 Binary files /dev/null and b/frontend/web/images/ico-3/ico-1.png differ diff --git a/frontend/web/images/ico-3/img-1.jpg b/frontend/web/images/ico-3/img-1.jpg new file mode 100755 index 0000000..823ba07 Binary files /dev/null and b/frontend/web/images/ico-3/img-1.jpg differ diff --git a/frontend/web/images/ico-3/img-2.jpg b/frontend/web/images/ico-3/img-2.jpg new file mode 100755 index 0000000..4b378b8 Binary files /dev/null and b/frontend/web/images/ico-3/img-2.jpg differ diff --git a/frontend/web/images/ico-3/img-3.jpg b/frontend/web/images/ico-3/img-3.jpg new file mode 100755 index 0000000..947eabb Binary files /dev/null and b/frontend/web/images/ico-3/img-3.jpg differ diff --git a/frontend/web/images/ico-3/img-3.png b/frontend/web/images/ico-3/img-3.png new file mode 100755 index 0000000..6937245 Binary files /dev/null and b/frontend/web/images/ico-3/img-3.png differ diff --git a/frontend/web/images/ico-3/img-4.png b/frontend/web/images/ico-3/img-4.png new file mode 100755 index 0000000..bac990f Binary files /dev/null and b/frontend/web/images/ico-3/img-4.png differ diff --git a/frontend/web/images/ico-3/img-5.png b/frontend/web/images/ico-3/img-5.png new file mode 100755 index 0000000..bc00de3 Binary files /dev/null and b/frontend/web/images/ico-3/img-5.png differ diff --git a/frontend/web/images/ico/ico-1.png b/frontend/web/images/ico/ico-1.png new file mode 100755 index 0000000..5722bd0 Binary files /dev/null and b/frontend/web/images/ico/ico-1.png differ diff --git a/frontend/web/images/ico/ico-2.png b/frontend/web/images/ico/ico-2.png new file mode 100755 index 0000000..c122ae4 Binary files /dev/null and b/frontend/web/images/ico/ico-2.png differ diff --git a/frontend/web/images/ico/ico-3.png b/frontend/web/images/ico/ico-3.png new file mode 100755 index 0000000..3af5ba3 Binary files /dev/null and b/frontend/web/images/ico/ico-3.png differ diff --git a/frontend/web/images/ico/ico-4.png b/frontend/web/images/ico/ico-4.png new file mode 100755 index 0000000..528b0f2 Binary files /dev/null and b/frontend/web/images/ico/ico-4.png differ diff --git a/frontend/web/images/ico/ico-5.png b/frontend/web/images/ico/ico-5.png new file mode 100755 index 0000000..0ffb6da Binary files /dev/null and b/frontend/web/images/ico/ico-5.png differ diff --git a/frontend/web/images/ico/ico-6.png b/frontend/web/images/ico/ico-6.png new file mode 100755 index 0000000..0c32ab7 Binary files /dev/null and b/frontend/web/images/ico/ico-6.png differ diff --git a/frontend/web/images/icons/first-arrow.png b/frontend/web/images/icons/first-arrow.png new file mode 100755 index 0000000..489bcb1 Binary files /dev/null and b/frontend/web/images/icons/first-arrow.png differ diff --git a/frontend/web/images/icons/menu-se.png b/frontend/web/images/icons/menu-se.png new file mode 100755 index 0000000..09684bb Binary files /dev/null and b/frontend/web/images/icons/menu-se.png differ diff --git a/frontend/web/images/icons/menu-se2.png b/frontend/web/images/icons/menu-se2.png new file mode 100755 index 0000000..d159ac2 Binary files /dev/null and b/frontend/web/images/icons/menu-se2.png differ diff --git a/frontend/web/images/icons/slider_sep.png b/frontend/web/images/icons/slider_sep.png new file mode 100755 index 0000000..8c4836f Binary files /dev/null and b/frontend/web/images/icons/slider_sep.png differ diff --git a/frontend/web/images/img-2.png b/frontend/web/images/img-2.png new file mode 100755 index 0000000..468f07a Binary files /dev/null and b/frontend/web/images/img-2.png differ diff --git a/frontend/web/images/img-3.png b/frontend/web/images/img-3.png new file mode 100755 index 0000000..bddaf2f Binary files /dev/null and b/frontend/web/images/img-3.png differ diff --git a/frontend/web/images/img-sl-1.jpg b/frontend/web/images/img-sl-1.jpg new file mode 100755 index 0000000..5cad705 Binary files /dev/null and b/frontend/web/images/img-sl-1.jpg differ diff --git a/frontend/web/images/img-sl-2.jpg b/frontend/web/images/img-sl-2.jpg new file mode 100755 index 0000000..d772051 Binary files /dev/null and b/frontend/web/images/img-sl-2.jpg differ diff --git a/frontend/web/images/img-sl-3.jpg b/frontend/web/images/img-sl-3.jpg new file mode 100755 index 0000000..6635715 Binary files /dev/null and b/frontend/web/images/img-sl-3.jpg differ diff --git a/frontend/web/images/img-sl-4.jpg b/frontend/web/images/img-sl-4.jpg new file mode 100755 index 0000000..3ac35c3 Binary files /dev/null and b/frontend/web/images/img-sl-4.jpg differ diff --git a/frontend/web/images/logo.png b/frontend/web/images/logo.png new file mode 100755 index 0000000..65e0776 Binary files /dev/null and b/frontend/web/images/logo.png differ diff --git a/frontend/web/images/logo2.png b/frontend/web/images/logo2.png new file mode 100755 index 0000000..cc3c90d Binary files /dev/null and b/frontend/web/images/logo2.png differ diff --git a/frontend/web/images/mCSB_buttons.png b/frontend/web/images/mCSB_buttons.png new file mode 100755 index 0000000..985a9b8 Binary files /dev/null and b/frontend/web/images/mCSB_buttons.png differ diff --git a/frontend/web/images/map.jpg b/frontend/web/images/map.jpg new file mode 100755 index 0000000..c3b273e Binary files /dev/null and b/frontend/web/images/map.jpg differ diff --git a/frontend/web/images/marker.png b/frontend/web/images/marker.png new file mode 100755 index 0000000..6d80ed3 Binary files /dev/null and b/frontend/web/images/marker.png differ diff --git a/frontend/web/images/markers/marker-we-9.png b/frontend/web/images/markers/marker-we-9.png new file mode 100755 index 0000000..2a73d5f Binary files /dev/null and b/frontend/web/images/markers/marker-we-9.png differ diff --git a/frontend/web/images/nissan_leaf.png b/frontend/web/images/nissan_leaf.png new file mode 100755 index 0000000..d14ea6c Binary files /dev/null and b/frontend/web/images/nissan_leaf.png differ diff --git a/frontend/web/images/partners/img-1.png b/frontend/web/images/partners/img-1.png new file mode 100755 index 0000000..76d87b4 Binary files /dev/null and b/frontend/web/images/partners/img-1.png differ diff --git a/frontend/web/images/partners/img-2.png b/frontend/web/images/partners/img-2.png new file mode 100755 index 0000000..2ce407c Binary files /dev/null and b/frontend/web/images/partners/img-2.png differ diff --git a/frontend/web/images/partners/img-3.png b/frontend/web/images/partners/img-3.png new file mode 100755 index 0000000..80a1fc8 Binary files /dev/null and b/frontend/web/images/partners/img-3.png differ diff --git a/frontend/web/images/partners/img-4.png b/frontend/web/images/partners/img-4.png new file mode 100755 index 0000000..367279e Binary files /dev/null and b/frontend/web/images/partners/img-4.png differ diff --git a/frontend/web/images/preload.gif b/frontend/web/images/preload.gif new file mode 100755 index 0000000..01cb243 Binary files /dev/null and b/frontend/web/images/preload.gif differ diff --git a/frontend/web/images/preload_min.gif b/frontend/web/images/preload_min.gif new file mode 100755 index 0000000..aa2cf19 Binary files /dev/null and b/frontend/web/images/preload_min.gif differ diff --git a/frontend/web/images/questions.png b/frontend/web/images/questions.png new file mode 100755 index 0000000..d94d834 Binary files /dev/null and b/frontend/web/images/questions.png differ diff --git a/frontend/web/images/sl_ec_01.jpg b/frontend/web/images/sl_ec_01.jpg new file mode 100755 index 0000000..540b0fc Binary files /dev/null and b/frontend/web/images/sl_ec_01.jpg differ diff --git a/frontend/web/images/slider/bg-1.jpg b/frontend/web/images/slider/bg-1.jpg new file mode 100755 index 0000000..dea0680 Binary files /dev/null and b/frontend/web/images/slider/bg-1.jpg differ diff --git a/frontend/web/images/slider/bg-2.jpg b/frontend/web/images/slider/bg-2.jpg new file mode 100755 index 0000000..cbaaf79 Binary files /dev/null and b/frontend/web/images/slider/bg-2.jpg differ diff --git a/frontend/web/images/slider/bg-3.jpg b/frontend/web/images/slider/bg-3.jpg new file mode 100755 index 0000000..d5332b6 Binary files /dev/null and b/frontend/web/images/slider/bg-3.jpg differ diff --git a/frontend/web/images/slider/bg-4.jpg b/frontend/web/images/slider/bg-4.jpg new file mode 100755 index 0000000..cecf24f Binary files /dev/null and b/frontend/web/images/slider/bg-4.jpg differ diff --git a/frontend/web/images/slider/big-bg-1.jpg b/frontend/web/images/slider/big-bg-1.jpg new file mode 100755 index 0000000..d50a80e Binary files /dev/null and b/frontend/web/images/slider/big-bg-1.jpg differ diff --git a/frontend/web/images/slider/big-bg-2.jpg b/frontend/web/images/slider/big-bg-2.jpg new file mode 100755 index 0000000..121141f Binary files /dev/null and b/frontend/web/images/slider/big-bg-2.jpg differ diff --git a/frontend/web/images/slider/big-bg-3.jpg b/frontend/web/images/slider/big-bg-3.jpg new file mode 100755 index 0000000..ae97aea Binary files /dev/null and b/frontend/web/images/slider/big-bg-3.jpg differ diff --git a/frontend/web/images/slider/big-bg-4.jpg b/frontend/web/images/slider/big-bg-4.jpg new file mode 100755 index 0000000..bf2b46e Binary files /dev/null and b/frontend/web/images/slider/big-bg-4.jpg differ diff --git a/frontend/web/images/storage/img-sl-11468507103.jpg b/frontend/web/images/storage/img-sl-11468507103.jpg new file mode 100755 index 0000000..5cad705 Binary files /dev/null and b/frontend/web/images/storage/img-sl-11468507103.jpg differ diff --git a/frontend/web/images/storage/img-sl-21468507579.jpg b/frontend/web/images/storage/img-sl-21468507579.jpg new file mode 100755 index 0000000..d772051 Binary files /dev/null and b/frontend/web/images/storage/img-sl-21468507579.jpg differ diff --git a/frontend/web/images/toggler.png b/frontend/web/images/toggler.png new file mode 100755 index 0000000..f88c559 Binary files /dev/null and b/frontend/web/images/toggler.png differ diff --git a/frontend/web/js/_script.js b/frontend/web/js/_script.js new file mode 100644 index 0000000..75a83b3 --- /dev/null +++ b/frontend/web/js/_script.js @@ -0,0 +1,907 @@ +$(document).ready(function(){ + // var w = screen.width, + // h = screen.height; + // alert(w + 'x' + h + '('+$(window).width()+'x'+$(window).height()+')') + // + // // alert($(window).width()+'x'+$(window).height()) + + + startPreloader() + function startPreloader() { + $('body').append('
    ').attr('id', 'no-scroll') + + } + window.onload = function () { + $('body, html').animate({scrollTop: 0}, 1) + resetPreloader() + setTimeout(function () { + // if(windowHeight>1199) { + // $('body').attr('id', '') + // } else { + // + // } + if (device.desktop()){ + + } else { + $('body').attr('id', ''); + } + + + + },1600) + + } + + + + function resetPreloader() { + $('#preload_').addClass('hide_') + setTimeout(function () { + $('#preload_').addClass('hide_up_') + }, 910) + setTimeout(function () { + $('#preload_').remove() + }, 1410) + } + + + + + + + + +//глобалные перемнные + var sections = $('.sections') + var sectLength = sections.length + + var windowHeight = $(window).height() + var windowWidth = $(window).width() + + + var timeDelay = 800; + var easy_name = 'easeOutExpo' + var modelcolor + + + function separatorColorAdd() { + $('.menu-line').addClass('black') + } + function separatorColorRemove() { + $('.menu-line').removeClass('black') + } + + var logoImg = $('.logo') + var logoImgWhite = logoImg.attr('src') + var logoImgRed = logoImg.attr('data-red') + function logoBlueAdd() { + logoImg.attr('src',logoImgRed) + } + function logoBlueRemove() { + logoImg.attr('src',logoImgWhite) + } + +//end глобалные перемнные + imgBgWidth() + + + + $(window).resize(function () { + windowHeight = $(window).height() + windowWidth = $(window).width() + sectionsWidth() + imgBgWidth() + }) + + sectionsWidth() + function sectionsWidth() { + sections.each(function () { + $(this).css({width:windowWidth}) + }) + } + + + + var menuWrapper = $('.menu_wrapper') + function hideMenu() { + menuWrapper.addClass('hide_menu').removeClass('open-menu') + } + function addMenu() { + menuWrapper.removeClass('hide_menu') + } + $('.menu_wrapper').on('click',function () { + $(this).addClass('hide_menu') + + }) + $('.menu-line').on('click',function () { + $('.menu_wrapper').addClass('open-menu') + }) + + function imgBgWidth() { + + + } + + onLoad() + function onLoad() { + // Функция для добавления обработчика событий + function addHandler(object, event, handler) { + if (object.addEventListener) { + object.addEventListener(event, handler, false); + } + else if (object.attachEvent) { + object.attachEvent('on' + event, handler); + } + // else alert("Обработчик не поддерживается"); + } + + // Добавляем обработчики для разных браузеров + addHandler(window, 'DOMMouseScroll', wheel); + addHandler(window, 'mousewheel', wheel); + // addHandler(document, 'mousewheel', wheel); + // Функция, обрабатывающая событие + function wheel(event) { + var delta; // Направление колёсика мыши + + event = event || window.event; + //Opera и IE работают со свойством wheelDelta + if (event.wheelDelta) { // В Opera и IE + delta = event.wheelDelta / 120; + // В Опере значение wheelDelta такое же, но с противоположным знаком + if (window.opera) delta = -delta; // Дополнительно для Opera + } + else if (event.detail) { // Для Gecko + delta = -event.detail / 3; + } + + + //Запрещаем обработку события браузером по умолчанию + if (event.preventDefault) event.preventDefault(); + event.returnValue = false; + //console.log(delta); // Выводим направление колёсика мыши + + + + statusBlok(); + function statusBlok() { + + var statusScroll = $('#statusScroll') + var statusScrollData = statusScroll.attr('data-active'); + var datascroll = 0; + + + //Arrow keys scroll update + $(document).keydown(function(e) { + switch(e.which) { + case 37: // left + break; + + case 38: + if(statusScrollData>0) { + --statusScrollData + $('body, html').animate({scrollTop: windowHeight*statusScrollData}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + statusScrollData = statusScroll.attr('data-active', statusScrollData) + statusScroll.attr('data-scroll',1) + } // up + break; + + case 39: // right + break; + + case 40: + if(statusScrollData0) { + --statusScrollData + $('body, html').animate({scrollTop: windowHeight*statusScrollData}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + statusScrollData = statusScroll.attr('data-active', statusScrollData) + statusScroll.attr('data-scroll',1) + } + + } + + var navCrkl = $('#navi_circle li') + var navCrklIndex = statusScroll.attr('data-active') + + if(navCrklIndex>0) { + $('#navi_circle li').removeClass('active') + $(navCrkl[navCrklIndex]).addClass('active') + $('#navi_circle').css({opacity:1}) + // hideMenu() + } else { + $('#navi_circle').css({opacity:0}) + $('#navi_circle li').removeClass('active') + if(device.mobile() || device.tablet()){ + + } else { + // addMenu() + } + } + + var screenNum = $('#statusScroll').attr('data-active') + + if(screenNum==0){ + $('.menu_wrapper').removeClass('open-menu') + logoBlueRemove() + separatorColorRemove() + } + if(screenNum==1){ + separatorColorAdd() + // logoBlueAdd() + if(($(window).width())<=1200){ + logoBlueAdd() + } else { + logoBlueRemove() + } + } + if(screenNum>1) { + separatorColorRemove() + } + if(screenNum==2){ + + // logoBlueAdd() + logoBlueRemove() + } + if(screenNum==3){ + + // separatorColorAdd() + logoBlueAdd() + } + if(screenNum==4){ + + // logoBlueAdd() + logoBlueRemove() + } + if(screenNum==5){ + logoBlueRemove() + } + if(screenNum==6){ + logoBlueRemove() + } + if(screenNum==7){ + logoBlueRemove() + } + + + var active = $('#menu_nav li'); + $(active).removeClass('active') + $(active[(screenNum-1)]).addClass('active') + + } + + + + } + } + + } + + + + + + all(); + function all() { + + + + var height = $('.txt-1-wr').height() + $('.txt-1-wr').css({marginTop:-(height/2)}) + + for (var i = 0; i < sectLength; i++) { + $(sections[i]).attr('data-num', i) + } + $('body').append('
    ') + for (var i2=0;i2') + } + var newHeightNavi = (sectLength*(11+17)-17)+64 + $('#navi_circle').css({height:newHeightNavi, marginTop:-(newHeightNavi/2),top:'50%'}) + + naviClick() + function naviClick() { + var statusScroll = $('#statusScroll') + var navi = $('#navi_circle li') + + + navi.click(function () { + if(statusScroll.attr('data-scroll')==0){ + + var thisIndex = $(this).index() + + if(thisIndex==0){ + logoBlueRemove() + separatorColorRemove() + } + if(thisIndex==1){ + separatorColorAdd() + + if(($(window).width())<=1200){ + logoBlueAdd() + } else { + logoBlueRemove() + } + } + if(thisIndex>1){ separatorColorRemove()} + if(thisIndex==2){ + + logoBlueRemove() + + } + if(thisIndex==3){ + + logoBlueAdd() + } + if(thisIndex>3){ + + logoBlueRemove() + } + if(thisIndex==4 || thisIndex==5){ + separatorColorRemove() + logoBlueRemove() + } + + if(thisIndex>0) { + navi.removeClass('active') + $(navi[thisIndex]).addClass('active') + // hideMenu() + } else { + $('#navi_circle').css({opacity:0}) + navi.removeClass('active') + if(device.mobile() || device.tablet()){ + // hideMenu() + } else { + // addMenu() + } + } + + $('#statusScroll').attr('data-active', thisIndex) + + var active = $('#menu_nav li'); + $(active).removeClass('active') + $(active[(thisIndex-1)]).addClass('active') + + + $('body, html').animate({scrollTop: windowHeight*thisIndex}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + + + statusScroll.attr('data-scroll',1) + + + } + + }) + + $('.circle-next').click(function () { + $('body, html').animate({scrollTop: windowHeight}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + + + $('#statusScroll').attr('data-active', 1) + statusScroll.attr('data-scroll',1) + + $(navi[1]).addClass('active') + $('#navi_circle').css({opacity:1}) + + // hideMenu() + + if(($(window).width())<=1200){ + logoBlueAdd() + } else { + logoBlueRemove() + } + }) + + $('.btn_by_link ').click(function (e) { + e.preventDefault() + $('body, html').animate({scrollTop: windowHeight*2}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + $('#statusScroll').attr('data-active', 2) + statusScroll.attr('data-scroll',2) + + $(navi[2]).addClass('active') + $('#navi_circle').css({opacity:1}) + }) + + var menuNav = $('#menu_nav li') + menuNav.click(function () { + // hideMenu() + + $(menuNav).removeClass('active') + $(this).addClass('active') + + var lastMenuOneScreen = 5 //количество последних пунктов меню которые скроляться на один экран + if(statusScroll.attr('data-scroll')==0){ + + var indexMenuNav = $(this).index()+1 + console.log(indexMenuNav) + + if(indexMenuNav==0){ + logoBlueRemove() + } + if(indexMenuNav==1){ + logoBlueRemove() + } + if(indexMenuNav==2){ + logoBlueRemove() + } + if(indexMenuNav==3){ + logoBlueAdd() + } + if(indexMenuNav==4){ + logoBlueRemove() + } + if(indexMenuNav==5){ + logoBlueRemove() + } + if(indexMenuNav==6){ + logoBlueRemove() + } + if(indexMenuNav==7){ + logoBlueRemove() + } + + + if(indexMenuNav<=lastMenuOneScreen+1) { + navi.removeClass('active') + $(navi[indexMenuNav]).addClass('active') + $('body, html').animate({scrollTop: windowHeight*indexMenuNav}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + $('#statusScroll').attr('data-active', indexMenuNav) + $(navi[indexMenuNav]).addClass('active') + } else { + $('#navi_circle').css({opacity:0}) + navi.removeClass('active') + $('body, html').animate({scrollTop: windowHeight*(menuNav.length-1)}, timeDelay, easy_name, function () { + statusScroll.attr('data-scroll',0) + }) + $('#statusScroll').attr('data-active', menuNav.length-1) + $(navi[menuNav.length-1]).addClass('active') + } + + + $('#navi_circle').css({opacity:1}) + + statusScroll.attr('data-scroll',1) + + + } + + }) + + + } + + firstScreenSlider() + function firstScreenSlider() { + var list1 = $('.list-1 li') + var list1FirstAct = $('.list-1 li.active').index() + $('.arr-txt1').html(list1FirstAct+1) + $('.arr-txt3').html(list1.length) + + $('.arr-left').click(function () { + clickListprev() + }) + $('.arr-right').click(function () { + clickListNext() + }) + function clickListNext() { + var activeLi = ($('.list-1 li.active').index())+1 + if (activeLi<=(list1.length-1)){ + list1.removeClass('active') + $(list1[activeLi]).addClass('active') + $('.arr-txt1').html(activeLi+1) + } else { + list1.removeClass('active') + $(list1[0]).addClass('active') + $('.arr-txt1').html(1) + } + + } + function clickListprev() { + var activeLi = ($('.list-1 li.active').index())-1 + // console.log(activeLi) + if (activeLi>-1){ + list1.removeClass('active') + $(list1[activeLi]).addClass('active') + $('.arr-txt1').html(activeLi+1) + } else { + list1.removeClass('active') + $(list1[list1.length-1]).addClass('active') + $('.arr-txt1').html(list1.length) + + } + } + + + + + + } + + + + } + + + + + + + + + + + + + + + + + + + sliderCar() +function sliderCar() { + //при удачной подгрузке выполнять ф-цию removeLoadIco() + + function addLoadIco() {$('.car-list').append('
    ')} + function removeLoadIco(){$('.load_content').remove()} + + $('.models_select ul li').click(function (e) { + e.preventDefault() + $('.models_select ul li').removeClass('active') + $(this).addClass('active') + removeLoadIco() + addLoadIco() + var link = $(this).find('a'); + var model = link.data('model'); + var year = link.data('year'); + $('a.year-picker').data('model', model); + var data = { + 'CarSearch[model]': model, 'CarSearch[year]': year + }; + data = $.param(data); + scrollDestroy(); + $('#content-1').load('/?'+data+' #content-1 ul', { 'Car[model]': link.data('model'), 'Car[year]': link.data('year') }, function() { + removeLoadIco(); + scrollInit(); + }); + }) + + $('.years_select ul li').click(function (e) { + e.preventDefault() + $('.years_select ul li').removeClass('active') + $(this).addClass('active') + removeLoadIco() + addLoadIco() + var link = $(this).find('a'); + var model = link.data('model'); + var year = link.data('year'); + $('a.model-picker').data('year', year); + var data = { + 'CarSearch[model]': model, 'CarSearch[year]': year + }; + data = $.param(data); + scrollDestroy(); + $('#content-1').load('/?'+data+' #content-1 ul', { 'Car[model]': link.data('model'), 'Car[year]': link.data('year') }, function() { + removeLoadIco(); + scrollInit(); + }); + }) + + scrollInit(); + +} +function scrollInit() +{ + var amount = Math.max.apply( + Math, $("#content-1 li").map( + function() + { + return $(this).outerWidth(true); + } + ).get() + ); + + $("#content-1").mCustomScrollbar( + { + axis : "x", + theme : "inset", + advanced : { + autoExpandHorizontalScroll : true + }, + scrollButtons : { + enable : true, + scrollType : "stepped" + }, + keyboard : {scrollType : "stepped"}, + snapAmount : amount, + mouseWheel : {scrollAmount : amount} + } + ); +} + + function scrollDestroy() { + $('#content-1').mCustomScrollbar('destroy'); + } + + scrollBlocks() + function scrollBlocks() { + $(".stock-txt-bl").mCustomScrollbar({ + axis:"y", + theme:"inset", + advanced:{ + autoExpandHorizontalScroll:true + }, + scrollButtons:{ + enable:true, + scrollType:"stepped" + }, + keyboard:{scrollType:"stepped"} + }); + } +//после удачной отправки формы, запустить ф-цию success() + form() + function form() { + $('a.btn_test_drive').click( function(event){ + event.preventDefault(); + + $('#overlay').fadeIn(400, + function(){ + $('#modal_test_drive') + .css('display', 'block') + .animate({opacity: 1, top: '10%'}, 200); + }); + + }); + +$(document).on('click', 'a.btn_buy', function(event){ + event.preventDefault(); + + var modelName = $('.models_select li.active a').text() + var modelYear = $('.years_select li.active a').text() + var expr = new RegExp('.*<\/span>'); + modelcolor = $(this).parent().parent().find(".style.specifications p:first").html().replace(expr,''); + + $('._model_').empty() + $('._model_').html(modelName) + $('._year_').empty() + $('._year_').html(modelYear) + + $('#overlay').fadeIn(400, + function(){ + $('#modal_buy') + .css('display', 'block') + .animate({opacity: 1, top: '10%'}, 200); + }); + }); + + $('a.btn-application').click( function(event){ + event.preventDefault(); + + $('#overlay').fadeIn(400, + function(){ + $('#modal_key_on_a_key') + .css('display', 'block') + .animate({opacity: 1, top: '10%'}, 200); + }); + + }); + + $('a.btn_reserved').click( function(event){ + event.preventDefault(); + + $('#overlay').fadeIn(400, + function(){ + $('#modal_book_cars') + .css('display', 'block') + .animate({opacity: 1, top: '10%'}, 200); + }); + + }); + + $('a.btn_questions').click( function(event){ + event.preventDefault(); + + $('#overlay').fadeIn(400, + function(){ + $('#modal_questions') + .css('display', 'block') + .animate({opacity: 1, top: '10%'}, 200); + }); + + }); + + $(document).on('click', '#modal_close, #overlay', function(){ + $('.modal_form').animate({opacity: 0, top: '2%'}, 200,function(){ + $(this).css('display', 'none'); + $('#overlay').fadeOut(400); + }); + $('#success_form').animate({opacity: 0, top: '0'}, 200,function(){ + $(this).css('display', 'none'); + $(this).css({top:'50%'}); + }); + + }); + } + + // success() + function success() { + $('#modal_form').animate({opacity: 0, top: '2%'}, 200,function(){ + $(this).css('display', 'none'); + }); + setTimeout(function () { + $('#success_form').css('display', 'block').animate({opacity: 1}, 700); + },400) + } + + // + + var all_phone = $("body").find(".form-group.field-orderform-phone"); + if(all_phone.val() == '') { + all_phone.removeClass('has-success').addClass('has-error'); + }; + + $(document).on('submit', "#form_buy", function(event){ + var username = $(this).find("#orderform-username").val(); + email = $(this).find("#orderform-email").val(); + phonenum = $(this).find("#orderform-phone").val(); + model_name = $(".models_select.style .active a").html(); + model_year = $(".years_select.style .active a").html(); + model_color = modelcolor; + action = $(this).attr('action'); + + event.preventDefault(); + if($(this).find('.form-group').hasClass('has-error')){} + else{ + $.post({ + type: 'post', + url: action, + data: { + 'OrderForm[username]':username, + 'OrderForm[email]':email, + 'OrderForm[phone]':phonenum, + 'OrderForm[model_name]':model_name, + 'OrderForm[model_year]':model_year, + 'OrderForm[model_color]':model_color, + }, + success: function(data){ + console.log(data); + } + }); + $("#modal_buy").animate({opacity: 0, top: '2%'}, 400); + success(); + $(this)[0].reset(); + } + }); + +$(document).on('submit', "#form_testdrive", function(event){ + event.preventDefault(); + var username = $(this).find("#testdriveform-username").val(); + email = $(this).find("#testdriveform-email").val(); + phonenum = $(this).find("#testdriveform-phone").val(); + action = $(this).attr('action'); + + if($(this).find('.form-group').hasClass('has-error')){} + else{ + $.post({ + type: 'post', + url: action, + data: { + 'TestdriveForm[username]':username, + 'TestdriveForm[email]':email, + 'TestdriveForm[phone]':phonenum, + }, + success: function(data){ + console.log(data); + } + }); + $("#modal_test_drive").animate({opacity: 0, top: '2%'}, 400); + console.log(username+email+phonenum); + success(); + $(this)[0].reset(); + }; + }); + $("#orderform-phone").mask("+380 (999) 999-99-99"); + $("#testdriveform-phone").mask("+380 (999) 999-99-99"); + + + + + hoverMenu(); + function hoverMenu() { + $('#menu_nav').hover(function () { + + },function () { + $('#menuwrapper').removeClass('open-menu') + }) + } + + heightMap() + + function heightMap() { + var box5Height = $('.box-5').height() + var box5Partn = $('.box-5 .container-wrapper').innerHeight() + var box5mapMerg = $('.box-5 .maps-contacts-wr').css('marginTop') + box5mapMerg = box5mapMerg.replace('px', '') + box5mapMerg = +box5mapMerg + var box5Stud = $('.box-5 .studio-copy-wr').height() + var mapHeight = box5Height - box5Partn - box5mapMerg - box5Stud + $('.maps-contacts-wr').css({ + height: mapHeight + }) + } + $(window).resize(function () { + heightMap() + }) + + datepicker() + function datepicker() { + $( ".date_first input" ).datepicker({ + changeMonth: true, + changeYear: true, + numberOfMonths: 1, + dateFormat: 'dd.mm.yy', + closeText: 'Закрыть', + prevText: 'Пред', + nextText: 'След', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + }); + $( ".date_second input" ).datepicker({ + changeMonth: true, + changeYear: true, + numberOfMonths: 1, + dateFormat: 'dd.mm.yy', + closeText: 'Закрыть', + prevText: 'Пред', + nextText: 'След', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + }); + } + +}); diff --git a/frontend/web/js/device.min.js b/frontend/web/js/device.min.js new file mode 100755 index 0000000..492dbe3 --- /dev/null +++ b/frontend/web/js/device.min.js @@ -0,0 +1 @@ +(function(){var n,e,o,t,i,r,d,a,c,l;e=window.device,n={},window.device=n,t=window.document.documentElement,l=window.navigator.userAgent.toLowerCase(),n.ios=function(){return n.iphone()||n.ipod()||n.ipad()},n.iphone=function(){return!n.windows()&&i("iphone")},n.ipod=function(){return i("ipod")},n.ipad=function(){return i("ipad")},n.android=function(){return!n.windows()&&i("android")},n.androidPhone=function(){return n.android()&&i("mobile")},n.androidTablet=function(){return n.android()&&!i("mobile")},n.blackberry=function(){return i("blackberry")||i("bb10")||i("rim")},n.blackberryPhone=function(){return n.blackberry()&&!i("tablet")},n.blackberryTablet=function(){return n.blackberry()&&i("tablet")},n.windows=function(){return i("windows")},n.windowsPhone=function(){return n.windows()&&i("phone")},n.windowsTablet=function(){return n.windows()&&i("touch")&&!n.windowsPhone()},n.fxos=function(){return(i("(mobile;")||i("(tablet;"))&&i("; rv:")},n.fxosPhone=function(){return n.fxos()&&i("mobile")},n.fxosTablet=function(){return n.fxos()&&i("tablet")},n.meego=function(){return i("meego")},n.cordova=function(){return window.cordova&&"file:"===location.protocol},n.nodeWebkit=function(){return"object"==typeof window.process},n.mobile=function(){return n.androidPhone()||n.iphone()||n.ipod()||n.windowsPhone()||n.blackberryPhone()||n.fxosPhone()||n.meego()},n.tablet=function(){return n.ipad()||n.androidTablet()||n.blackberryTablet()||n.windowsTablet()||n.fxosTablet()},n.desktop=function(){return!n.tablet()&&!n.mobile()},n.television=function(){var n;for(television=["googletv","viera","smarttv","internet.tv","netcast","nettv","appletv","boxee","kylo","roku","dlnadoc","roku","pov_tv","hbbtv","ce-html"],n=0;n1},n.landscape=function(){return window.innerHeight/window.innerWidth<1},n.noConflict=function(){return window.device=e,this},i=function(n){return-1!==l.indexOf(n)},d=function(n){var e;return e=new RegExp(n,"i"),t.className.match(e)},o=function(n){var e=null;d(n)||(e=t.className.replace(/^\s+|\s+$/g,""),t.className=e+" "+n)},c=function(n){d(n)&&(t.className=t.className.replace(" "+n,""))},n.ios()?n.ipad()?o("ios ipad tablet"):n.iphone()?o("ios iphone mobile"):n.ipod()&&o("ios ipod mobile"):n.android()?o(n.androidTablet()?"android tablet":"android mobile"):n.blackberry()?o(n.blackberryTablet()?"blackberry tablet":"blackberry mobile"):n.windows()?o(n.windowsTablet()?"windows tablet":n.windowsPhone()?"windows mobile":"desktop"):n.fxos()?o(n.fxosTablet()?"fxos tablet":"fxos mobile"):n.meego()?o("meego mobile"):n.nodeWebkit()?o("node-webkit"):n.television()?o("television"):n.desktop()&&o("desktop"),n.cordova()&&o("cordova"),r=function(){n.landscape()?(c("portrait"),o("landscape")):(c("landscape"),o("portrait"))},a=Object.prototype.hasOwnProperty.call(window,"onorientationchange")?"orientationchange":"resize",window.addEventListener?window.addEventListener(a,r,!1):window.attachEvent?window.attachEvent(a,r):window[a]=r,r(),"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return n}):"undefined"!=typeof module&&module.exports?module.exports=n:window.device=n}).call(this); \ No newline at end of file diff --git a/frontend/web/js/firstSlider.js b/frontend/web/js/firstSlider.js new file mode 100755 index 0000000..654cb6f --- /dev/null +++ b/frontend/web/js/firstSlider.js @@ -0,0 +1,66 @@ +$(document).ready(function(){ + firstSlider(); + function firstSlider() { + var set_time = 8000; + + function line_animation() { + $('.slide-ul li.active_n .time-bloks-line').animate({width:'100%'}, set_time, function() { + $(this).css({width:0}); + }); + } + + line_animation(); + + function for_interval() { + var slide_active = $('.slide-ul').find('li.active_n'); + slide_active.removeClass('active_n'); + slide_active.next().addClass('active_n'); + var lengs = $('.slide-ul li').index($('li.active_n')); + + if (lengs == -1){ + $('.slide-ul li:first-child').addClass('active_n') + } + var img_bg = $('.slide-ul li.active_n').find('img'); + img_bg = img_bg.attr('src').split('/'); + img_bg = img_bg[img_bg.length - 1]; + if (device.mobile() || device.tablet()){ + + $('.slider-bg').attr('style', 'background-image: url("images/slider/big-' + img_bg + '")'); + } else { + $('.slider-bg').attr('style', 'background-image: url("images/slider/big-' + img_bg + '")'); + } + + + line_animation(); + + } + var stop_interval = setInterval(function(){ + for_interval() + },set_time); + + $('.slide-ul li').click(function(){ + $('.slide-ul li.active_n .time-bloks-line').stop().css({width:0}); + $('.slide-ul li').removeClass('active_n'); + $(this).addClass('active_n'); + var img_bg = $('.slide-ul li.active_n').find('img'); + img_bg = img_bg.attr('src').split('/'); + img_bg = img_bg[img_bg.length - 1]; + if (device.mobile() || device.tablet()){ + + $('.slider-bg').attr('style', 'background-image: url("images/slider/big-' + img_bg + '")'); + } else { + $('.slider-bg').attr('style', 'background-image: url("images/slider/big-' + img_bg + '")'); + } + clearInterval(stop_interval); + stop_interval = setInterval(function(){ + for_interval() + },set_time); + + line_animation(); + }); + } +}); + + + + diff --git a/frontend/web/js/jquery-2.2.0.min.js b/frontend/web/js/jquery-2.2.0.min.js new file mode 100644 index 0000000..06ac263 --- /dev/null +++ b/frontend/web/js/jquery-2.2.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c); +}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return this;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("':"vimeo"===g.type&&(c=''),f.addClass("owl-video-playing"),this._playing=f,d=a('
    '+c+"
    "),e.after(d)},d.prototype.isInFullScreen=function(){var d=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return d&&a(d).parent().hasClass("owl-video-frame")&&(this._core.speed(0),this._fullscreen=!0),d&&this._fullscreen&&this._playing?!1:this._fullscreen?(this._fullscreen=!1,!1):this._playing&&this._core.state.orientation!==b.orientation?(this._core.state.orientation=b.orientation,!1):!0},d.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=d}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){this.swapping="translated"==a.type},this),"translate.owl.carousel":a.proxy(function(){this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&this.core.support3d){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c)),f&&e.addClass("animated owl-animated-in").addClass(f).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.transitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this.core=b,this.core.options=a.extend({},d.Defaults,this.core.options),this.handlers={"translated.owl.carousel refreshed.owl.carousel":a.proxy(function(){this.autoplay() +},this),"play.owl.autoplay":a.proxy(function(a,b,c){this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(){this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.autoplay()},this)},this.core.$element.on(this.handlers)};d.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},d.prototype.autoplay=function(){this.core.settings.autoplay&&!this.core.state.videoPlay?(b.clearInterval(this.interval),this.interval=b.setInterval(a.proxy(function(){this.play()},this),this.core.settings.autoplayTimeout)):b.clearInterval(this.interval)},d.prototype.play=function(){return c.hidden===!0||this.core.state.isTouch||this.core.state.isScrolling||this.core.state.isSwiping||this.core.state.inMotion?void 0:this.core.settings.autoplay===!1?void b.clearInterval(this.interval):void this.core.next(this.core.settings.autoplaySpeed)},d.prototype.stop=function(){b.clearInterval(this.interval)},d.prototype.pause=function(){b.clearInterval(this.interval)},d.prototype.destroy=function(){var a,c;b.clearInterval(this.interval);for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=d}(window.Zepto||window.jQuery,window,document),function(a){"use strict";var b=function(c){this._core=c,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.push(a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"add.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.splice(b.position,0,a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"remove.owl.carousel prepared.owl.carousel":a.proxy(function(a){this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"change.owl.carousel":a.proxy(function(a){if("position"==a.property.name&&!this._core.state.revert&&!this._core.settings.loop&&this._core.settings.navRewind){var b=this._core.current(),c=this._core.maximum(),d=this._core.minimum();a.data=a.property.value>c?b>=c?d:c:a.property.value"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotData:!1,dotsSpeed:!1,dotsContainer:!1,controlsClass:"owl-controls"},b.prototype.initialize=function(){var b,c,d=this._core.settings;d.dotsData||(this._templates=[a("
    ").addClass(d.dotClass).append(a("")).prop("outerHTML")]),d.navContainer&&d.dotsContainer||(this._controls.$container=a("
    ").addClass(d.controlsClass).appendTo(this.$element)),this._controls.$indicators=d.dotsContainer?a(d.dotsContainer):a("
    ").hide().addClass(d.dotsClass).appendTo(this._controls.$container),this._controls.$indicators.on("click","div",a.proxy(function(b){var c=a(b.target).parent().is(this._controls.$indicators)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(c,d.dotsSpeed)},this)),b=d.navContainer?a(d.navContainer):a("
    ").addClass(d.navContainerClass).prependTo(this._controls.$container),this._controls.$next=a("<"+d.navElement+">"),this._controls.$previous=this._controls.$next.clone(),this._controls.$previous.addClass(d.navClass[0]).html(d.navText[0]).hide().prependTo(b).on("click",a.proxy(function(){this.prev(d.navSpeed)},this)),this._controls.$next.addClass(d.navClass[1]).html(d.navText[1]).hide().appendTo(b).on("click",a.proxy(function(){this.next(d.navSpeed)},this));for(c in this._overrides)this._core[c]=a.proxy(this[c],this)},b.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},b.prototype.update=function(){var a,b,c,d=this._core.settings,e=this._core.clones().length/2,f=e+this._core.items().length,g=d.center||d.autoWidth||d.dotData?1:d.dotsEach||d.items;if("page"!==d.slideBy&&(d.slideBy=Math.min(d.slideBy,d.items)),d.dots||"page"==d.slideBy)for(this._pages=[],a=e,b=0,c=0;f>a;a++)(b>=g||0===b)&&(this._pages.push({start:a-e,end:a-e+g-1}),b=0,++c),b+=this._core.mergers(this._core.relative(a))},b.prototype.draw=function(){var b,c,d="",e=this._core.settings,f=(this._core.$stage.children(),this._core.relative(this._core.current()));if(!e.nav||e.loop||e.navRewind||(this._controls.$previous.toggleClass("disabled",0>=f),this._controls.$next.toggleClass("disabled",f>=this._core.maximum())),this._controls.$previous.toggle(e.nav),this._controls.$next.toggle(e.nav),e.dots){if(b=this._pages.length-this._controls.$indicators.children().length,e.dotData&&0!==b){for(c=0;c0?(d=new Array(b+1).join(this._templates[0]),this._controls.$indicators.append(d)):0>b&&this._controls.$indicators.children().slice(b).remove();this._controls.$indicators.find(".active").removeClass("active"),this._controls.$indicators.children().eq(a.inArray(this.current(),this._pages)).addClass("active")}this._controls.$indicators.toggle(e.dots)},b.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotData?1:c.dotsEach||c.items)}},b.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,function(a){return a.start<=b&&a.end>=b}).pop()},b.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},b.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},b.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},b.prototype.to=function(b,c,d){var e;d?a.proxy(this._overrides.to,this._core)(b,c):(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c))},a.fn.owlCarousel.Constructor.Plugins.Navigation=b}(window.Zepto||window.jQuery,window,document),function(a,b){"use strict";var c=function(d){this._core=d,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(){"URLHash"==this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find("[data-hash]").andSelf("[data-hash]").attr("data-hash");this._hashes[c]=b.content},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(){var a=b.location.hash.substring(1),c=this._core.$stage.children(),d=this._hashes[a]&&c.index(this._hashes[a])||0;return a?void this._core.to(d,!1,!0):!1},this))};c.Defaults={URLhashListener:!1},c.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=c}(window.Zepto||window.jQuery,window,document); \ No newline at end of file diff --git a/frontend/web/js/pushy.js b/frontend/web/js/pushy.js new file mode 100755 index 0000000..9710187 --- /dev/null +++ b/frontend/web/js/pushy.js @@ -0,0 +1,188 @@ +/*! Pushy - v1.0.0 - 2016-3-1 +* Pushy is a responsive off-canvas navigation menu using CSS transforms & transitions. +* https://github.com/christophery/pushy/ +* by Christopher Yee */ + +(function ($) { + var pushy = $('.pushy'), //menu css class + body = $('body'), + container = $('#container'), //container css class + push = $('.push'), //css class to add pushy capability + pushyLeft = 'pushy-left', //css class for left menu position + pushyOpenLeft = 'pushy-open-left', //css class when menu is open (left position) + pushyOpenRight = 'pushy-open-right', //css class when menu is open (right position) + siteOverlay = $('.site-overlay'), //site overlay + menuBtn = $('.menu-btn, .pushy-link'), //css classes to toggle the menu + menuSpeed = 200, //jQuery fallback menu speed + menuWidth = pushy.width() + 'px', //jQuery fallback menu width + submenuClass = '.pushy-submenu', + submenuOpenClass = 'pushy-submenu-open', + submenuClosedClass = 'pushy-submenu-closed', + submenu = $(submenuClass); + + function togglePushy(){ + //add class to body based on menu position + if( pushy.hasClass(pushyLeft) ){ + body.toggleClass(pushyOpenLeft); + }else{ + body.toggleClass(pushyOpenRight); + } + } + + function openPushyFallback(){ + + //animate menu position based on CSS class + if( pushy.hasClass(pushyLeft) ){ + body.addClass(pushyOpenLeft); + pushy.animate({left: "0px"}, menuSpeed); + container.animate({left: menuWidth}, menuSpeed); + //css class to add pushy capability + push.animate({left: menuWidth}, menuSpeed); + }else{ + body.addClass(pushyOpenRight); + pushy.animate({right: '0px'}, menuSpeed); + container.animate({right: menuWidth}, menuSpeed); + push.animate({right: menuWidth}, menuSpeed); + } + + } + + function closePushyFallback(){ + + //animate menu position based on CSS class + if( pushy.hasClass(pushyLeft) ){ + body.removeClass(pushyOpenLeft); + pushy.animate({left: "-" + menuWidth}, menuSpeed); + container.animate({left: "0px"}, menuSpeed); + //css class to add pushy capability + push.animate({left: "0px"}, menuSpeed); + }else{ + body.removeClass(pushyOpenRight); + pushy.animate({right: "-" + menuWidth}, menuSpeed); + container.animate({right: "0px"}, menuSpeed); + push.animate({right: "0px"}, menuSpeed); + } + + } + + function toggleSubmenu(){ + //hide submenu by default + $(submenuClass).addClass(submenuClosedClass); + $(submenuClass).on('click', function(){ + var selected = $(this); + if( selected.hasClass(submenuClosedClass) ) { + //hide opened submenus + $(submenuClass).addClass(submenuClosedClass).removeClass(submenuOpenClass); + //show submenu + selected.removeClass(submenuClosedClass).addClass(submenuOpenClass); + }else{ + //hide submenu + selected.addClass(submenuClosedClass).removeClass(submenuOpenClass); + } + }); + } + + function toggleSubmenuFallback(){ + //hide submenu by default + $(submenuClass).addClass(submenuClosedClass); + + submenu.children('a').on('click', function(event){ + event.preventDefault(); + $(this).toggleClass(submenuOpenClass) + .next('.pushy-submenu ul').slideToggle(200) + .end().parent(submenuClass) + .siblings(submenuClass).children('a') + .removeClass(submenuOpenClass) + .next('.pushy-submenu ul').slideUp(200); + }); + } + + //checks if 3d transforms are supported removing the modernizr dependency + var cssTransforms3d = (function csstransforms3d(){ + var el = document.createElement('p'), + supported = false, + transforms = { + 'webkitTransform':'-webkit-transform', + 'OTransform':'-o-transform', + 'msTransform':'-ms-transform', + 'MozTransform':'-moz-transform', + 'transform':'transform' + }; + + // Add it to the body to get the computed style + document.body.insertBefore(el, null); + + for(var t in transforms){ + if( el.style[t] !== undefined ){ + el.style[t] = 'translate3d(1px,1px,1px)'; + supported = window.getComputedStyle(el).getPropertyValue(transforms[t]); + } + } + + document.body.removeChild(el); + + return (supported !== undefined && supported.length > 0 && supported !== "none"); + })(); + + if(cssTransforms3d){ + //make menu visible + pushy.css({'visibility': 'visible'}); + + //toggle submenu + toggleSubmenu(); + + //toggle menu + menuBtn.on('click', function(){ + menuBtn.toggleClass('open'); + togglePushy(); + }); + //close menu when clicking site overlay + siteOverlay.on('click', function(){ + menuBtn.toggleClass('open'); + togglePushy(); + }); + }else{ + //add css class to body + body.addClass('no-csstransforms3d'); + + //hide menu by default + if( pushy.hasClass(pushyLeft) ){ + pushy.css({left: "-" + menuWidth}); + }else{ + pushy.css({right: "-" + menuWidth}); + } + + //make menu visible + pushy.css({'visibility': 'visible'}); + //fixes IE scrollbar issue + container.css({"overflow-x": "hidden"}); + + //keep track of menu state (open/close) + var opened = false; + + //toggle submenu + toggleSubmenuFallback(); + + //toggle menu + menuBtn.on('click', function(){ + if (opened) { + closePushyFallback(); + opened = false; + } else { + openPushyFallback(); + opened = true; + } + }); + + //close menu when clicking site overlay + siteOverlay.on('click', function(){ + if (opened) { + closePushyFallback(); + opened = false; + } else { + openPushyFallback(); + opened = true; + } + }); + } +}(jQuery)); \ No newline at end of file diff --git a/frontend/web/js/script.js b/frontend/web/js/script.js new file mode 100755 index 0000000..f754fee --- /dev/null +++ b/frontend/web/js/script.js @@ -0,0 +1,139 @@ +$(document).ready(function(){ + function initScroll(event) { + event.preventDefault(); + var id = $(this).attr('href'), + top = $(id).offset().top; + $('body,html').animate({scrollTop: top}, 1500); + } + $("#menu").on("click","a", initScroll); + $('#menu1').on("click","a", initScroll); + $('#menu2').on("click","a", initScroll); + + // vGovnokod here + function addNameYear(){ + $(".loadcars .btn").click(function(e){ + e.preventDefault(); + var carmodel = $(".models_select .nav-tabs-main").find(".active").text(); + var caryear = $(".models_select .nav-tabs-year").find(".active .year-picker").text(); + $("h4.model-car-name").html(carmodel+' '+caryear); + }); + } + addNameYear(); + + $('.models_select ul.nav-tabs-main li').click(function (e) { + e.preventDefault(); + $(".models_select ul.nav-tabs-main li").removeClass("active"); + $(this).addClass('active'); + var link = $(this).find('a'); + var model = link.data('model'); + var year = link.data('year'); + $('a.year-picker').data('model', model); + var data = { + 'CarSearch[model]': model, 'CarSearch[year]': year + }; + data = $.param(data); + $('.cartabscont .tab-pane.active').load('/?'+data+' .cartabscont .tab-pane.active .owl-carousel', { 'Car[model]': link.data('model'), 'Car[year]': link.data('year') }, function() { +// scrollInit(); + owlCar(); + $("h4.model-car-name").html(model+' '+year); + }); + }) + + $('.years_select ul li').click(function (e) { + e.preventDefault(); + $(".models_select ul.nav-tabs-year li").removeClass("active"); + $(this).addClass('active'); + var link = $(this).find('a'); + var model = link.data('model'); + var year = link.data('year'); + $('a.model-picker').data('year', year); + var data = { + 'CarSearch[model]': model, 'CarSearch[year]': year + }; + data = $.param(data); + var lang_attr = $('html').attr('lang'); + var lang = 'ru'; + if(lang_attr !== undefined) { + lang = lang_attr.substr(0, 2); + } + $('.cartabscont .tab-pane.active').load('/?'+data+' .cartabscont .tab-pane.active .owl-carousel', { 'Car[model]': link.data('model'), 'Car[year]': link.data('year'), 'lang': lang }, function() { + // scrollInit(); + owlCar(); + $("h4.model-car-name").html(model+' '+year); + }); + }) + + function scrollInit() + { + var amount = Math.max.apply( + Math, $(".cartabscont").map( + function() + { + return $(this).outerWidth(true); + } + ).get() + ); + + $(".cartabscont").mCustomScrollbar( + { + axis : "x", + theme : "inset", + advanced : { + autoExpandHorizontalScroll : true + }, + scrollButtons : { + enable : true, + scrollType : "stepped" + }, + keyboard : {scrollType : "stepped"}, + snapAmount : amount, + mouseWheel : {scrollAmount : amount} + } + ); + } + + //govnokod ends + + function owlCar() + { + $('.owl-carousel').owlCarousel({ + margin:60, + responsive:{ + 0:{ + nav: true, + dots: false, + items:1 + }, + 480:{ + nav:false, + dots: true, + items:2 + }, + 768:{ + nav:false, + dots: true, + items:3 + }, + 992:{ + nav:false, + dots: true, + items:4 + } + } + }) + } + owlCar(); + }); +var avatarElem = document.getElementById('contrast'); +var avatarElem1 = document.getElementById('section1'); +var avatarSourceBottom = avatarElem1.getBoundingClientRect().bottom + window.pageYOffset - 1; + +window.onscroll = function() { + if (avatarElem.classList.contains('contrast') && window.pageYOffset < avatarSourceBottom) { + avatarElem.classList.remove('contrast'); + } else if (window.pageYOffset > avatarSourceBottom) { + avatarElem.classList.add('contrast'); + } + + +}; diff --git a/frontend/web/js/script.js.zip b/frontend/web/js/script.js.zip new file mode 100644 index 0000000..24c33fe Binary files /dev/null and b/frontend/web/js/script.js.zip differ diff --git a/frontend/web/robots.txt b/frontend/web/robots.txt new file mode 100755 index 0000000..6f27bb6 --- /dev/null +++ b/frontend/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file diff --git a/init b/init new file mode 100755 index 0000000..50d51eb --- /dev/null +++ b/init @@ -0,0 +1,217 @@ +#!/usr/bin/env php + + * + * @link http://www.yiiframework.com/ + * @copyright Copyright (c) 2008 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +if (!extension_loaded('openssl')) { + die('The OpenSSL PHP extension is required by Yii2.'); +} + +$params = getParams(); +$root = str_replace('\\', '/', __DIR__); +$envs = require("$root/environments/index.php"); +$envNames = array_keys($envs); + +echo "Yii Application Initialization Tool v1.0\n\n"; + +$envName = null; +if (empty($params['env']) || $params['env'] === '1') { + echo "Which environment do you want the application to be initialized in?\n\n"; + foreach ($envNames as $i => $name) { + echo " [$i] $name\n"; + } + echo "\n Your choice [0-" . (count($envs) - 1) . ', or "q" to quit] '; + $answer = trim(fgets(STDIN)); + + if (!ctype_digit($answer) || !in_array($answer, range(0, count($envs) - 1))) { + echo "\n Quit initialization.\n"; + exit(0); + } + + if (isset($envNames[$answer])) { + $envName = $envNames[$answer]; + } +} else { + $envName = $params['env']; +} + +if (!in_array($envName, $envNames)) { + $envsList = implode(', ', $envNames); + echo "\n $envName is not a valid environment. Try one of the following: $envsList. \n"; + exit(2); +} + +$env = $envs[$envName]; + +if (empty($params['env'])) { + echo "\n Initialize the application under '{$envNames[$answer]}' environment? [yes|no] "; + $answer = trim(fgets(STDIN)); + if (strncasecmp($answer, 'y', 1)) { + echo "\n Quit initialization.\n"; + exit(0); + } +} + +echo "\n Start initialization ...\n\n"; +$files = getFileList("$root/environments/{$env['path']}"); +if (isset($env['skipFiles'])) { + $skipFiles = $env['skipFiles']; + array_walk($skipFiles, function(&$value) use($env, $root) { $value = "$root/$value"; }); + $files = array_diff($files, array_intersect_key($env['skipFiles'], array_filter($skipFiles, 'file_exists'))); +} +$all = false; +foreach ($files as $file) { + if (!copyFile($root, "environments/{$env['path']}/$file", $file, $all, $params)) { + break; + } +} + +$callbacks = ['setCookieValidationKey', 'setWritable', 'setExecutable', 'createSymlink']; +foreach ($callbacks as $callback) { + if (!empty($env[$callback])) { + $callback($root, $env[$callback]); + } +} + +echo "\n ... initialization completed.\n\n"; + +function getFileList($root, $basePath = '') +{ + $files = []; + $handle = opendir($root); + while (($path = readdir($handle)) !== false) { + if ($path === '.git' || $path === '.svn' || $path === '.' || $path === '..') { + continue; + } + $fullPath = "$root/$path"; + $relativePath = $basePath === '' ? $path : "$basePath/$path"; + if (is_dir($fullPath)) { + $files = array_merge($files, getFileList($fullPath, $relativePath)); + } else { + $files[] = $relativePath; + } + } + closedir($handle); + return $files; +} + +function copyFile($root, $source, $target, &$all, $params) +{ + if (!is_file($root . '/' . $source)) { + echo " skip $target ($source not exist)\n"; + return true; + } + if (is_file($root . '/' . $target)) { + if (file_get_contents($root . '/' . $source) === file_get_contents($root . '/' . $target)) { + echo " unchanged $target\n"; + return true; + } + if ($all) { + echo " overwrite $target\n"; + } else { + echo " exist $target\n"; + echo " ...overwrite? [Yes|No|All|Quit] "; + + + $answer = !empty($params['overwrite']) ? $params['overwrite'] : trim(fgets(STDIN)); + if (!strncasecmp($answer, 'q', 1)) { + return false; + } else { + if (!strncasecmp($answer, 'y', 1)) { + echo " overwrite $target\n"; + } else { + if (!strncasecmp($answer, 'a', 1)) { + echo " overwrite $target\n"; + $all = true; + } else { + echo " skip $target\n"; + return true; + } + } + } + } + file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source)); + return true; + } + echo " generate $target\n"; + @mkdir(dirname($root . '/' . $target), 0777, true); + file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source)); + return true; +} + +function getParams() +{ + $rawParams = []; + if (isset($_SERVER['argv'])) { + $rawParams = $_SERVER['argv']; + array_shift($rawParams); + } + + $params = []; + foreach ($rawParams as $param) { + if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) { + $name = $matches[1]; + $params[$name] = isset($matches[3]) ? $matches[3] : true; + } else { + $params[] = $param; + } + } + return $params; +} + +function setWritable($root, $paths) +{ + foreach ($paths as $writable) { + if (is_dir("$root/$writable")) { + echo " chmod 0777 $writable\n"; + @chmod("$root/$writable", 0777); + } else { + echo "\n Error. Directory $writable does not exist. \n"; + } + } +} + +function setExecutable($root, $paths) +{ + foreach ($paths as $executable) { + echo " chmod 0755 $executable\n"; + @chmod("$root/$executable", 0755); + } +} + +function setCookieValidationKey($root, $paths) +{ + foreach ($paths as $file) { + echo " generate cookie validation key in $file\n"; + $file = $root . '/' . $file; + $length = 32; + $bytes = openssl_random_pseudo_bytes($length); + $key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.'); + $content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file)); + file_put_contents($file, $content); + } +} + +function createSymlink($root, $links) { + foreach ($links as $link => $target) { + echo " symlink " . $root . "/" . $target . " " . $root . "/" . $link . "\n"; + //first removing folders to avoid errors if the folder already exists + @rmdir($root . "/" . $link); + //next removing existing symlink in order to update the target + if (is_link($root . "/" . $link)) { + @unlink($root . "/" . $link); + } + @symlink($root . "/" . $target, $root . "/" . $link); + } +} diff --git a/init.bat b/init.bat new file mode 100755 index 0000000..e50c242 --- /dev/null +++ b/init.bat @@ -0,0 +1,20 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line init script for Windows. +rem +rem @author Qiang Xue +rem @link http://www.yiiframework.com/ +rem @copyright Copyright (c) 2008 Yii Software LLC +rem @license http://www.yiiframework.com/license/ +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%init" %* + +@endlocal diff --git a/requirements.php b/requirements.php new file mode 100755 index 0000000..fd84f47 --- /dev/null +++ b/requirements.php @@ -0,0 +1,132 @@ +Error'; + echo '

    The path to yii framework seems to be incorrect.

    '; + echo '

    You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . '.

    '; + echo '

    Please refer to the README on how to install Yii.

    '; +} + +require_once($frameworkPath . '/requirements/YiiRequirementChecker.php'); +$requirementsChecker = new YiiRequirementChecker(); + +$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.'; +$gdOK = $imagickOK = false; + +if (extension_loaded('imagick')) { + $imagick = new Imagick(); + $imagickFormats = $imagick->queryFormats('PNG'); + if (in_array('PNG', $imagickFormats)) { + $imagickOK = true; + } else { + $imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.'; + } +} + +if (extension_loaded('gd')) { + $gdInfo = gd_info(); + if (!empty($gdInfo['FreeType Support'])) { + $gdOK = true; + } else { + $gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.'; + } +} + +/** + * Adjust requirements according to your application specifics. + */ +$requirements = array( + // Database : + array( + 'name' => 'PDO extension', + 'mandatory' => true, + 'condition' => extension_loaded('pdo'), + 'by' => 'All DB-related classes', + ), + array( + 'name' => 'PDO SQLite extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_sqlite'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for SQLite database.', + ), + array( + 'name' => 'PDO MySQL extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_mysql'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for MySQL database.', + ), + array( + 'name' => 'PDO PostgreSQL extension', + 'mandatory' => false, + 'condition' => extension_loaded('pdo_pgsql'), + 'by' => 'All DB-related classes', + 'memo' => 'Required for PostgreSQL database.', + ), + // Cache : + array( + 'name' => 'Memcache extension', + 'mandatory' => false, + 'condition' => extension_loaded('memcache') || extension_loaded('memcached'), + 'by' => 'MemCache', + 'memo' => extension_loaded('memcached') ? 'To use memcached set MemCache::useMemcached to true.' : '' + ), + array( + 'name' => 'APC extension', + 'mandatory' => false, + 'condition' => extension_loaded('apc'), + 'by' => 'ApcCache', + ), + // CAPTCHA: + array( + 'name' => 'GD PHP extension with FreeType support', + 'mandatory' => false, + 'condition' => $gdOK, + 'by' => 'Captcha', + 'memo' => $gdMemo, + ), + array( + 'name' => 'ImageMagick PHP extension with PNG support', + 'mandatory' => false, + 'condition' => $imagickOK, + 'by' => 'Captcha', + 'memo' => $imagickMemo, + ), + // PHP ini : + 'phpExposePhp' => array( + 'name' => 'Expose PHP', + 'mandatory' => false, + 'condition' => $requirementsChecker->checkPhpIniOff("expose_php"), + 'by' => 'Security reasons', + 'memo' => '"expose_php" should be disabled at php.ini', + ), + 'phpAllowUrlInclude' => array( + 'name' => 'PHP allow url include', + 'mandatory' => false, + 'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"), + 'by' => 'Security reasons', + 'memo' => '"allow_url_include" should be disabled at php.ini', + ), + 'phpSmtp' => array( + 'name' => 'PHP mail SMTP', + 'mandatory' => false, + 'condition' => strlen(ini_get('SMTP')) > 0, + 'by' => 'Email sending', + 'memo' => 'PHP mail SMTP server required', + ), +); +$requirementsChecker->checkYii()->check($requirements)->render(); diff --git a/storage/.htaccess b/storage/.htaccess new file mode 100755 index 0000000..0a379a4 --- /dev/null +++ b/storage/.htaccess @@ -0,0 +1,6 @@ +RewriteEngine on +RewriteBase / +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +RewriteRule . index.php diff --git a/storage/20160729185443-231a5a0d-6d4b-4a21-949a-196b39f16c151481286540.jpg b/storage/20160729185443-231a5a0d-6d4b-4a21-949a-196b39f16c151481286540.jpg new file mode 100755 index 0000000..8b87594 Binary files /dev/null and b/storage/20160729185443-231a5a0d-6d4b-4a21-949a-196b39f16c151481286540.jpg differ diff --git a/storage/Copy of 20160531190300-03c45e7b-853a-48a0-aa14-d9ce25a2e8d51481293807.jpg b/storage/Copy of 20160531190300-03c45e7b-853a-48a0-aa14-d9ce25a2e8d51481293807.jpg new file mode 100755 index 0000000..90f739c Binary files /dev/null and b/storage/Copy of 20160531190300-03c45e7b-853a-48a0-aa14-d9ce25a2e8d51481293807.jpg differ diff --git a/storage/Copy of 20160729185443-231a5a0d-6d4b-4a21-949a-196b39f16c151481281839.jpg b/storage/Copy of 20160729185443-231a5a0d-6d4b-4a21-949a-196b39f16c151481281839.jpg new file mode 100755 index 0000000..8b87594 Binary files /dev/null and b/storage/Copy of 20160729185443-231a5a0d-6d4b-4a21-949a-196b39f16c151481281839.jpg differ diff --git a/storage/Copy of 20160830194622-1834258c-8a6f-45cb-a74c-6958a0cc114a1481289025.jpg b/storage/Copy of 20160830194622-1834258c-8a6f-45cb-a74c-6958a0cc114a1481289025.jpg new file mode 100755 index 0000000..cd7231a Binary files /dev/null and b/storage/Copy of 20160830194622-1834258c-8a6f-45cb-a74c-6958a0cc114a1481289025.jpg differ diff --git a/storage/Copy of 20161012001246-99747bc1-d94e-4d71-937d-6d256c5c572f1481288311.jpg b/storage/Copy of 20161012001246-99747bc1-d94e-4d71-937d-6d256c5c572f1481288311.jpg new file mode 100755 index 0000000..b681f7d Binary files /dev/null and b/storage/Copy of 20161012001246-99747bc1-d94e-4d71-937d-6d256c5c572f1481288311.jpg differ diff --git a/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481289295.jpg b/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481289295.jpg new file mode 100755 index 0000000..0a4d207 Binary files /dev/null and b/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481289295.jpg differ diff --git a/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481290291.jpg b/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481290291.jpg new file mode 100755 index 0000000..0a4d207 Binary files /dev/null and b/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481290291.jpg differ diff --git a/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481293570.jpg b/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481293570.jpg new file mode 100755 index 0000000..0a4d207 Binary files /dev/null and b/storage/Copy of 20161027142823-4c242fd3-fdc0-4b7e-8d0b-21f9743234371481293570.jpg differ diff --git a/storage/Copy of 20161028215706-905b3fb5-c056-4b97-a084-b5a280f235921481286977.jpg b/storage/Copy of 20161028215706-905b3fb5-c056-4b97-a084-b5a280f235921481286977.jpg new file mode 100755 index 0000000..38c8d85 Binary files /dev/null and b/storage/Copy of 20161028215706-905b3fb5-c056-4b97-a084-b5a280f235921481286977.jpg differ diff --git a/storage/Copy of 20161122172935-a94b68dd-21fb-48d8-9fc5-d04021f3d5e11481293225.jpg b/storage/Copy of 20161122172935-a94b68dd-21fb-48d8-9fc5-d04021f3d5e11481293225.jpg new file mode 100755 index 0000000..2d49ae4 Binary files /dev/null and b/storage/Copy of 20161122172935-a94b68dd-21fb-48d8-9fc5-d04021f3d5e11481293225.jpg differ diff --git a/storage/Copy of 20161122173037-3149562c-b3e7-49ce-a9db-491a2f82bc601481212554.jpg b/storage/Copy of 20161122173037-3149562c-b3e7-49ce-a9db-491a2f82bc601481212554.jpg new file mode 100755 index 0000000..574c84c Binary files /dev/null and b/storage/Copy of 20161122173037-3149562c-b3e7-49ce-a9db-491a2f82bc601481212554.jpg differ diff --git a/storage/Copy of 20161122232902-3f70cabe-84fc-4d57-b286-14ab6e9232911481289701.jpg b/storage/Copy of 20161122232902-3f70cabe-84fc-4d57-b286-14ab6e9232911481289701.jpg new file mode 100755 index 0000000..8118324 Binary files /dev/null and b/storage/Copy of 20161122232902-3f70cabe-84fc-4d57-b286-14ab6e9232911481289701.jpg differ diff --git a/storage/Copy of 20161122233010-400613b5-81ea-4f9c-808e-76a16c985c651481290038.jpg b/storage/Copy of 20161122233010-400613b5-81ea-4f9c-808e-76a16c985c651481290038.jpg new file mode 100755 index 0000000..a802c3e Binary files /dev/null and b/storage/Copy of 20161122233010-400613b5-81ea-4f9c-808e-76a16c985c651481290038.jpg differ diff --git a/storage/IMG_26591481194641.jpg b/storage/IMG_26591481194641.jpg new file mode 100755 index 0000000..0819e39 Binary files /dev/null and b/storage/IMG_26591481194641.jpg differ diff --git a/storage/img-sl-11468507103.jpg b/storage/img-sl-11468507103.jpg new file mode 100755 index 0000000..5cad705 Binary files /dev/null and b/storage/img-sl-11468507103.jpg differ diff --git a/storage/img-sl-11468510357.jpg b/storage/img-sl-11468510357.jpg new file mode 100755 index 0000000..5cad705 Binary files /dev/null and b/storage/img-sl-11468510357.jpg differ diff --git a/storage/img-sl-21468507579.jpg b/storage/img-sl-21468507579.jpg new file mode 100755 index 0000000..d772051 Binary files /dev/null and b/storage/img-sl-21468507579.jpg differ diff --git a/storage/img-sl-31468510385.jpg b/storage/img-sl-31468510385.jpg new file mode 100755 index 0000000..6635715 Binary files /dev/null and b/storage/img-sl-31468510385.jpg differ diff --git a/storage/step1481193299.jpg b/storage/step1481193299.jpg new file mode 100755 index 0000000..0278599 Binary files /dev/null and b/storage/step1481193299.jpg differ diff --git a/tests/README.md b/tests/README.md new file mode 100755 index 0000000..112090f --- /dev/null +++ b/tests/README.md @@ -0,0 +1,59 @@ +This directory contains various tests for the advanced applications. + +Tests in `codeception` directory are developed with [Codeception PHP Testing Framework](http://codeception.com/). + +After creating and setting up the advanced application, follow these steps to prepare for the tests: + +1. Install Codeception if it's not yet installed: + + ``` + composer global require "codeception/codeception=2.1.*" "codeception/specify=*" "codeception/verify=*" + ``` + + If you've never used Composer for global packages run `composer global status`. It should output: + + ``` + Changed current directory to + ``` + + Then add `/vendor/bin` to you `PATH` environment variable. Now you're able to use `codecept` from command + line globally. + +2. Install faker extension by running the following from template root directory where `composer.json` is: + + ``` + composer require --dev yiisoft/yii2-faker:* + ``` + +3. Create a database for tests, adjust the `components['db']` configuration in `tests/codeception/config/config-local.php`, + then update it by applying migrations: + + ``` + codeception/bin/yii migrate + ``` + +4. In order to be able to run acceptance tests you need to start a webserver. The simplest way is to use PHP built in + webserver. In the root directory where `common`, `frontend` etc. are execute the following: + + ``` + php -S localhost:8080 + ``` + +5. Now you can run the tests with the following commands, assuming you are in the `tests/codeception` directory: + + ``` + # frontend tests + cd frontend + codecept build + codecept run + + # backend tests + + cd backend + codecept build + codecept run + + # etc. + ``` + + If you already have run `codecept build` for each application, you can skip that step and run all tests by a single `codecept run`. diff --git a/tests/codeception.yml b/tests/codeception.yml new file mode 100755 index 0000000..1a793ed --- /dev/null +++ b/tests/codeception.yml @@ -0,0 +1,11 @@ +include: + - codeception/common + - codeception/console + - codeception/backend + - codeception/frontend + +paths: + log: codeception/_output + +settings: + colors: true diff --git a/tests/codeception/_output/.gitignore b/tests/codeception/_output/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/tests/codeception/_output/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/codeception/backend/.gitignore b/tests/codeception/backend/.gitignore new file mode 100755 index 0000000..985dbb4 --- /dev/null +++ b/tests/codeception/backend/.gitignore @@ -0,0 +1,4 @@ +# these files are auto generated by codeception build +/unit/UnitTester.php +/functional/FunctionalTester.php +/acceptance/AcceptanceTester.php diff --git a/tests/codeception/backend/_bootstrap.php b/tests/codeception/backend/_bootstrap.php new file mode 100755 index 0000000..a28a3d2 --- /dev/null +++ b/tests/codeception/backend/_bootstrap.php @@ -0,0 +1,23 @@ +wantTo('ensure login page works'); + +$loginPage = LoginPage::openBy($I); + +$I->amGoingTo('submit login form with no data'); +$loginPage->login('', ''); +if (method_exists($I, 'wait')) { + $I->wait(3); // only for selenium +} +$I->expectTo('see validations errors'); +$I->see('Username cannot be blank.', '.help-block'); +$I->see('Password cannot be blank.', '.help-block'); + +$I->amGoingTo('try to login with wrong credentials'); +$I->expectTo('see validations errors'); +$loginPage->login('admin', 'wrong'); +if (method_exists($I, 'wait')) { + $I->wait(3); // only for selenium +} +$I->expectTo('see validations errors'); +$I->see('Incorrect username or password.', '.help-block'); + +$I->amGoingTo('try to login with correct credentials'); +$loginPage->login('erau', 'password_0'); +if (method_exists($I, 'wait')) { + $I->wait(3); // only for selenium +} +$I->expectTo('see that user is logged'); +$I->see('Logout (erau)', 'form button[type=submit]'); +$I->dontSeeLink('Login'); +$I->dontSeeLink('Signup'); +/** Uncomment if using WebDriver + * $I->click('Logout (erau)'); + * $I->dontSeeLink('Logout (erau)'); + * $I->seeLink('Login'); + */ diff --git a/tests/codeception/backend/acceptance/_bootstrap.php b/tests/codeception/backend/acceptance/_bootstrap.php new file mode 100755 index 0000000..411855e --- /dev/null +++ b/tests/codeception/backend/acceptance/_bootstrap.php @@ -0,0 +1,2 @@ +wantTo('ensure login page works'); + +$loginPage = LoginPage::openBy($I); + +$I->amGoingTo('submit login form with no data'); +$loginPage->login('', ''); +$I->expectTo('see validations errors'); +$I->see('Username cannot be blank.', '.help-block'); +$I->see('Password cannot be blank.', '.help-block'); + +$I->amGoingTo('try to login with wrong credentials'); +$I->expectTo('see validations errors'); +$loginPage->login('admin', 'wrong'); +$I->expectTo('see validations errors'); +$I->see('Incorrect username or password.', '.help-block'); + +$I->amGoingTo('try to login with correct credentials'); +$loginPage->login('erau', 'password_0'); +$I->expectTo('see that user is logged'); +$I->see('Logout (erau)', 'form button[type=submit]'); +$I->dontSeeLink('Login'); +$I->dontSeeLink('Signup'); diff --git a/tests/codeception/backend/functional/_bootstrap.php b/tests/codeception/backend/functional/_bootstrap.php new file mode 100755 index 0000000..94f3fbd --- /dev/null +++ b/tests/codeception/backend/functional/_bootstrap.php @@ -0,0 +1,2 @@ +run(); +exit($exitCode); diff --git a/tests/codeception/bin/yii.bat b/tests/codeception/bin/yii.bat new file mode 100755 index 0000000..d516b3a --- /dev/null +++ b/tests/codeception/bin/yii.bat @@ -0,0 +1,20 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line bootstrap script for Windows. +rem +rem @author Qiang Xue +rem @link http://www.yiiframework.com/ +rem @copyright Copyright (c) 2008 Yii Software LLC +rem @license http://www.yiiframework.com/license/ +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%yii" %* + +@endlocal diff --git a/tests/codeception/common/.gitignore b/tests/codeception/common/.gitignore new file mode 100755 index 0000000..985dbb4 --- /dev/null +++ b/tests/codeception/common/.gitignore @@ -0,0 +1,4 @@ +# these files are auto generated by codeception build +/unit/UnitTester.php +/functional/FunctionalTester.php +/acceptance/AcceptanceTester.php diff --git a/tests/codeception/common/_bootstrap.php b/tests/codeception/common/_bootstrap.php new file mode 100755 index 0000000..cea3ee5 --- /dev/null +++ b/tests/codeception/common/_bootstrap.php @@ -0,0 +1,15 @@ +actor->fillField('input[name="' . $loginForm->formName() . '[username]"]', $username); + $this->actor->fillField('input[name="' . $loginForm->formName() . '[password]"]', $password); + $this->actor->click('login-button'); + } +} diff --git a/tests/codeception/common/_support/FixtureHelper.php b/tests/codeception/common/_support/FixtureHelper.php new file mode 100755 index 0000000..63739ef --- /dev/null +++ b/tests/codeception/common/_support/FixtureHelper.php @@ -0,0 +1,73 @@ +loadFixtures(); + } + + /** + * Method is called after all suite tests run + */ + public function _afterSuite() + { + $this->unloadFixtures(); + } + + /** + * @inheritdoc + */ + public function globalFixtures() + { + return [ + InitDbFixture::className(), + ]; + } + + /** + * @inheritdoc + */ + public function fixtures() + { + return [ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => '@tests/codeception/common/fixtures/data/init_login.php', + ], + ]; + } +} diff --git a/tests/codeception/common/codeception.yml b/tests/codeception/common/codeception.yml new file mode 100755 index 0000000..e8a3407 --- /dev/null +++ b/tests/codeception/common/codeception.yml @@ -0,0 +1,13 @@ +namespace: tests\codeception\common +actor: Tester +paths: + tests: . + log: _output + data: _data + helpers: _support +settings: + bootstrap: _bootstrap.php + suite_class: \PHPUnit_Framework_TestSuite + colors: true + memory_limit: 1024M + log: true diff --git a/tests/codeception/common/fixtures/UserFixture.php b/tests/codeception/common/fixtures/UserFixture.php new file mode 100755 index 0000000..7153c8c --- /dev/null +++ b/tests/codeception/common/fixtures/UserFixture.php @@ -0,0 +1,13 @@ + 'erau', + 'auth_key' => 'tUu1qHcde0diwUol3xeI-18MuHkkprQI', + // password_0 + 'password_hash' => '$2y$13$nJ1WDlBaGcbCdbNC5.5l4.sgy.OMEKCqtDQOdQ2OWpgiKRWYyzzne', + 'password_reset_token' => 'RkD_Jw0_8HEedzLk7MM-ZKEFfYR7VbMr_1392559490', + 'created_at' => '1392559490', + 'updated_at' => '1392559490', + 'email' => 'sfriesen@jenkins.info', + ], +]; diff --git a/tests/codeception/common/templates/fixtures/user.php b/tests/codeception/common/templates/fixtures/user.php new file mode 100755 index 0000000..d3f83b5 --- /dev/null +++ b/tests/codeception/common/templates/fixtures/user.php @@ -0,0 +1,17 @@ +getSecurity(); + +return [ + 'username' => $faker->userName, + 'email' => $faker->email, + 'auth_key' => $security->generateRandomString(), + 'password_hash' => $security->generatePasswordHash('password_' . $index), + 'password_reset_token' => $security->generateRandomString() . '_' . time(), + 'created_at' => time(), + 'updated_at' => time(), +]; diff --git a/tests/codeception/common/unit.suite.yml b/tests/codeception/common/unit.suite.yml new file mode 100755 index 0000000..a0582a5 --- /dev/null +++ b/tests/codeception/common/unit.suite.yml @@ -0,0 +1,6 @@ +# Codeception Test Suite Configuration + +# suite for unit (internal) tests. +# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES. + +class_name: UnitTester diff --git a/tests/codeception/common/unit/DbTestCase.php b/tests/codeception/common/unit/DbTestCase.php new file mode 100755 index 0000000..2159a69 --- /dev/null +++ b/tests/codeception/common/unit/DbTestCase.php @@ -0,0 +1,11 @@ + 'bayer.hudson', + 'auth_key' => 'HP187Mvq7Mmm3CTU80dLkGmni_FUH_lR', + //password_0 + 'password_hash' => '$2y$13$EjaPFBnZOQsHdGuHI.xvhuDp1fHpo8hKRSk6yshqa9c5EG8s3C3lO', + 'password_reset_token' => 'ExzkCOaYc1L8IOBs4wdTGGbgNiG3Wz1I_1402312317', + 'created_at' => '1402312317', + 'updated_at' => '1402312317', + 'email' => 'nicole.paucek@schultz.info', + ], +]; diff --git a/tests/codeception/common/unit/models/LoginFormTest.php b/tests/codeception/common/unit/models/LoginFormTest.php new file mode 100755 index 0000000..54c8209 --- /dev/null +++ b/tests/codeception/common/unit/models/LoginFormTest.php @@ -0,0 +1,93 @@ + [ + 'user' => [ + 'class' => 'yii\web\User', + 'identityClass' => 'common\models\User', + ], + ], + ]); + } + + protected function tearDown() + { + Yii::$app->user->logout(); + parent::tearDown(); + } + + public function testLoginNoUser() + { + $model = new LoginForm([ + 'username' => 'not_existing_username', + 'password' => 'not_existing_password', + ]); + + $this->specify('user should not be able to login, when there is no identity', function () use ($model) { + expect('model should not login user', $model->login())->false(); + expect('user should not be logged in', Yii::$app->user->isGuest)->true(); + }); + } + + public function testLoginWrongPassword() + { + $model = new LoginForm([ + 'username' => 'bayer.hudson', + 'password' => 'wrong_password', + ]); + + $this->specify('user should not be able to login with wrong password', function () use ($model) { + expect('model should not login user', $model->login())->false(); + expect('error message should be set', $model->errors)->hasKey('password'); + expect('user should not be logged in', Yii::$app->user->isGuest)->true(); + }); + } + + public function testLoginCorrect() + { + + $model = new LoginForm([ + 'username' => 'bayer.hudson', + 'password' => 'password_0', + ]); + + $this->specify('user should be able to login with correct credentials', function () use ($model) { + expect('model should login user', $model->login())->true(); + expect('error message should not be set', $model->errors)->hasntKey('password'); + expect('user should be logged in', Yii::$app->user->isGuest)->false(); + }); + } + + /** + * @inheritdoc + */ + public function fixtures() + { + return [ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => '@tests/codeception/common/unit/fixtures/data/models/user.php' + ], + ]; + } +} diff --git a/tests/codeception/config/.gitignore b/tests/codeception/config/.gitignore new file mode 100755 index 0000000..059a02c --- /dev/null +++ b/tests/codeception/config/.gitignore @@ -0,0 +1 @@ +config-local.php diff --git a/tests/codeception/config/acceptance.php b/tests/codeception/config/acceptance.php new file mode 100755 index 0000000..9318da5 --- /dev/null +++ b/tests/codeception/config/acceptance.php @@ -0,0 +1,7 @@ + 'app-common', + 'basePath' => dirname(__DIR__), + ] +); diff --git a/tests/codeception/config/config.php b/tests/codeception/config/config.php new file mode 100755 index 0000000..b478679 --- /dev/null +++ b/tests/codeception/config/config.php @@ -0,0 +1,26 @@ + 'en-US', + 'controllerMap' => [ + 'fixture' => [ + 'class' => 'yii\faker\FixtureController', + 'fixtureDataPath' => '@tests/codeception/common/fixtures/data', + 'templatePath' => '@tests/codeception/common/templates/fixtures', + 'namespace' => 'tests\codeception\common\fixtures', + ], + ], + 'components' => [ + 'db' => [ + 'dsn' => 'mysql:host=localhost;dbname=yii2_advanced_tests', + ], + 'mailer' => [ + 'useFileTransport' => true, + ], + 'urlManager' => [ + 'showScriptName' => true, + ], + ], +]; diff --git a/tests/codeception/config/console/unit.php b/tests/codeception/config/console/unit.php new file mode 100755 index 0000000..3c24df0 --- /dev/null +++ b/tests/codeception/config/console/unit.php @@ -0,0 +1,15 @@ + [ + 'request' => [ + // it's not recommended to run functional tests with CSRF validation enabled + 'enableCsrfValidation' => false, + // but if you absolutely need it set cookie domain to localhost + /* + 'csrfCookie' => [ + 'domain' => 'localhost', + ], + */ + ], + ], +]; \ No newline at end of file diff --git a/tests/codeception/config/unit.php b/tests/codeception/config/unit.php new file mode 100755 index 0000000..6bd08d3 --- /dev/null +++ b/tests/codeception/config/unit.php @@ -0,0 +1,7 @@ + $value) { + $inputType = $field === 'body' ? 'textarea' : 'input'; + $this->actor->fillField($inputType . '[name="' . $contactForm->formName() . '[' . $field . ']"]', $value); + } + $this->actor->click('contact-button'); + } +} diff --git a/tests/codeception/frontend/_pages/SignupPage.php b/tests/codeception/frontend/_pages/SignupPage.php new file mode 100755 index 0000000..9a66708 --- /dev/null +++ b/tests/codeception/frontend/_pages/SignupPage.php @@ -0,0 +1,30 @@ + $value) { + $inputType = $field === 'body' ? 'textarea' : 'input'; + $this->actor->fillField($inputType . '[name="' . $signupForm->formName() . '[' . $field . ']"]', $value); + } + $this->actor->click('signup-button'); + } +} diff --git a/tests/codeception/frontend/acceptance.suite.yml b/tests/codeception/frontend/acceptance.suite.yml new file mode 100755 index 0000000..1828a04 --- /dev/null +++ b/tests/codeception/frontend/acceptance.suite.yml @@ -0,0 +1,28 @@ +# Codeception Test Suite Configuration + +# suite for acceptance tests. +# perform tests in browser using the Selenium-like tools. +# powered by Mink (http://mink.behat.org). +# (tip: that's what your customer will see). +# (tip: test your ajax and javascript by one of Mink drivers). + +# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES. + +class_name: AcceptanceTester +modules: + enabled: + - PhpBrowser + - tests\codeception\common\_support\FixtureHelper +# you can use WebDriver instead of PhpBrowser to test javascript and ajax. +# This will require you to install selenium. See http://codeception.com/docs/04-AcceptanceTests#Selenium +# "restart" option is used by the WebDriver to start each time per test-file new session and cookies, +# it is useful if you want to login in your app in each test. +# - WebDriver + config: + PhpBrowser: +# PLEASE ADJUST IT TO THE ACTUAL ENTRY POINT WITHOUT PATH INFO + url: http://localhost:8080 +# WebDriver: +# url: http://localhost:8080 +# browser: firefox +# restart: true diff --git a/tests/codeception/frontend/acceptance/AboutCept.php b/tests/codeception/frontend/acceptance/AboutCept.php new file mode 100755 index 0000000..84fe323 --- /dev/null +++ b/tests/codeception/frontend/acceptance/AboutCept.php @@ -0,0 +1,13 @@ +wantTo('ensure that about works'); +AboutPage::openBy($I); +$I->see('About', 'h1'); diff --git a/tests/codeception/frontend/acceptance/ContactCept.php b/tests/codeception/frontend/acceptance/ContactCept.php new file mode 100755 index 0000000..7ec05d4 --- /dev/null +++ b/tests/codeception/frontend/acceptance/ContactCept.php @@ -0,0 +1,59 @@ +wantTo('ensure that contact works'); + +$contactPage = ContactPage::openBy($I); + +$I->see('Contact', 'h1'); + +$I->amGoingTo('submit contact form with no data'); +$contactPage->submit([]); +if (method_exists($I, 'wait')) { + $I->wait(3); // only for selenium +} +$I->expectTo('see validations errors'); +$I->see('Contact', 'h1'); +$I->see('Name cannot be blank', '.help-block'); +$I->see('Email cannot be blank', '.help-block'); +$I->see('Subject cannot be blank', '.help-block'); +$I->see('Body cannot be blank', '.help-block'); +$I->see('The verification code is incorrect', '.help-block'); + +$I->amGoingTo('submit contact form with not correct email'); +$contactPage->submit([ + 'name' => 'tester', + 'email' => 'tester.email', + 'subject' => 'test subject', + 'body' => 'test content', + 'verifyCode' => 'testme', +]); +if (method_exists($I, 'wait')) { + $I->wait(3); // only for selenium +} +$I->expectTo('see that email address is wrong'); +$I->dontSee('Name cannot be blank', '.help-block'); +$I->see('Email is not a valid email address.', '.help-block'); +$I->dontSee('Subject cannot be blank', '.help-block'); +$I->dontSee('Body cannot be blank', '.help-block'); +$I->dontSee('The verification code is incorrect', '.help-block'); + +$I->amGoingTo('submit contact form with correct data'); +$contactPage->submit([ + 'name' => 'tester', + 'email' => 'tester@example.com', + 'subject' => 'test subject', + 'body' => 'test content', + 'verifyCode' => 'testme', +]); +if (method_exists($I, 'wait')) { + $I->wait(3); // only for selenium +} +$I->see('Thank you for contacting us. We will respond to you as soon as possible.'); diff --git a/tests/codeception/frontend/acceptance/HomeCept.php b/tests/codeception/frontend/acceptance/HomeCept.php new file mode 100755 index 0000000..9985ea0 --- /dev/null +++ b/tests/codeception/frontend/acceptance/HomeCept.php @@ -0,0 +1,16 @@ +wantTo('ensure that home page works'); +$I->amOnPage(Yii::$app->homeUrl); +$I->see('My Company'); +$I->seeLink('About'); +$I->click('About'); +$I->see('This is the About page.'); diff --git a/tests/codeception/frontend/acceptance/LoginCept.php b/tests/codeception/frontend/acceptance/LoginCept.php new file mode 100755 index 0000000..eebf938 --- /dev/null +++ b/tests/codeception/frontend/acceptance/LoginCept.php @@ -0,0 +1,37 @@ +wantTo('ensure login page works'); + +$loginPage = LoginPage::openBy($I); + +$I->amGoingTo('submit login form with no data'); +$loginPage->login('', ''); +$I->expectTo('see validations errors'); +$I->see('Username cannot be blank.', '.help-block'); +$I->see('Password cannot be blank.', '.help-block'); + +$I->amGoingTo('try to login with wrong credentials'); +$I->expectTo('see validations errors'); +$loginPage->login('admin', 'wrong'); +$I->expectTo('see validations errors'); +$I->see('Incorrect username or password.', '.help-block'); + +$I->amGoingTo('try to login with correct credentials'); +$loginPage->login('erau', 'password_0'); +$I->expectTo('see that user is logged'); +$I->see('Logout (erau)', 'form button[type=submit]'); +$I->dontSeeLink('Login'); +$I->dontSeeLink('Signup'); +/** Uncomment if using WebDriver + * $I->click('Logout (erau)'); + * $I->dontSeeLink('Logout (erau)'); + * $I->seeLink('Login'); + */ diff --git a/tests/codeception/frontend/acceptance/SignupCest.php b/tests/codeception/frontend/acceptance/SignupCest.php new file mode 100755 index 0000000..9a412cb --- /dev/null +++ b/tests/codeception/frontend/acceptance/SignupCest.php @@ -0,0 +1,82 @@ + 'tester.email@example.com', + 'username' => 'tester', + ]); + } + + /** + * This method is called when test fails. + * @param \Codeception\Event\FailEvent $event + */ + public function _fail($event) + { + } + + /** + * @param \tests\codeception\frontend\AcceptanceTester $I + * @param \Codeception\Scenario $scenario + */ + public function testUserSignup($I, $scenario) + { + $I->wantTo('ensure that signup works'); + + $signupPage = SignupPage::openBy($I); + $I->see('Signup', 'h1'); + $I->see('Please fill out the following fields to signup:'); + + $I->amGoingTo('submit signup form with no data'); + + $signupPage->submit([]); + + $I->expectTo('see validation errors'); + $I->see('Username cannot be blank.', '.help-block'); + $I->see('Email cannot be blank.', '.help-block'); + $I->see('Password cannot be blank.', '.help-block'); + + $I->amGoingTo('submit signup form with not correct email'); + $signupPage->submit([ + 'username' => 'tester', + 'email' => 'tester.email', + 'password' => 'tester_password', + ]); + + $I->expectTo('see that email address is wrong'); + $I->dontSee('Username cannot be blank.', '.help-block'); + $I->dontSee('Password cannot be blank.', '.help-block'); + $I->see('Email is not a valid email address.', '.help-block'); + + $I->amGoingTo('submit signup form with correct email'); + $signupPage->submit([ + 'username' => 'tester', + 'email' => 'tester.email@example.com', + 'password' => 'tester_password', + ]); + + $I->expectTo('see that user logged in'); + $I->see('Logout (tester)', 'form button[type=submit]'); + } +} diff --git a/tests/codeception/frontend/acceptance/_bootstrap.php b/tests/codeception/frontend/acceptance/_bootstrap.php new file mode 100755 index 0000000..b0a40ef --- /dev/null +++ b/tests/codeception/frontend/acceptance/_bootstrap.php @@ -0,0 +1,2 @@ +wantTo('ensure that about works'); +AboutPage::openBy($I); +$I->see('About', 'h1'); diff --git a/tests/codeception/frontend/functional/ContactCept.php b/tests/codeception/frontend/functional/ContactCept.php new file mode 100755 index 0000000..9eee14b --- /dev/null +++ b/tests/codeception/frontend/functional/ContactCept.php @@ -0,0 +1,50 @@ +wantTo('ensure that contact works'); + +$contactPage = ContactPage::openBy($I); + +$I->see('Contact', 'h1'); + +$I->amGoingTo('submit contact form with no data'); +$contactPage->submit([]); +$I->expectTo('see validations errors'); +$I->see('Contact', 'h1'); +$I->see('Name cannot be blank', '.help-block'); +$I->see('Email cannot be blank', '.help-block'); +$I->see('Subject cannot be blank', '.help-block'); +$I->see('Body cannot be blank', '.help-block'); +$I->see('The verification code is incorrect', '.help-block'); + +$I->amGoingTo('submit contact form with not correct email'); +$contactPage->submit([ + 'name' => 'tester', + 'email' => 'tester.email', + 'subject' => 'test subject', + 'body' => 'test content', + 'verifyCode' => 'testme', +]); +$I->expectTo('see that email address is wrong'); +$I->dontSee('Name cannot be blank', '.help-block'); +$I->see('Email is not a valid email address.', '.help-block'); +$I->dontSee('Subject cannot be blank', '.help-block'); +$I->dontSee('Body cannot be blank', '.help-block'); +$I->dontSee('The verification code is incorrect', '.help-block'); + +$I->amGoingTo('submit contact form with correct data'); +$contactPage->submit([ + 'name' => 'tester', + 'email' => 'tester@example.com', + 'subject' => 'test subject', + 'body' => 'test content', + 'verifyCode' => 'testme', +]); +$I->see('Thank you for contacting us. We will respond to you as soon as possible.'); diff --git a/tests/codeception/frontend/functional/HomeCept.php b/tests/codeception/frontend/functional/HomeCept.php new file mode 100755 index 0000000..fe45ded --- /dev/null +++ b/tests/codeception/frontend/functional/HomeCept.php @@ -0,0 +1,16 @@ +wantTo('ensure that home page works'); +$I->amOnPage(Yii::$app->homeUrl); +$I->see('My Company'); +$I->seeLink('About'); +$I->click('About'); +$I->see('This is the About page.'); diff --git a/tests/codeception/frontend/functional/LoginCept.php b/tests/codeception/frontend/functional/LoginCept.php new file mode 100755 index 0000000..d78c86e --- /dev/null +++ b/tests/codeception/frontend/functional/LoginCept.php @@ -0,0 +1,32 @@ +wantTo('ensure login page works'); + +$loginPage = LoginPage::openBy($I); + +$I->amGoingTo('submit login form with no data'); +$loginPage->login('', ''); +$I->expectTo('see validations errors'); +$I->see('Username cannot be blank.', '.help-block'); +$I->see('Password cannot be blank.', '.help-block'); + +$I->amGoingTo('try to login with wrong credentials'); +$I->expectTo('see validations errors'); +$loginPage->login('admin', 'wrong'); +$I->expectTo('see validations errors'); +$I->see('Incorrect username or password.', '.help-block'); + +$I->amGoingTo('try to login with correct credentials'); +$loginPage->login('erau', 'password_0'); +$I->expectTo('see that user is logged'); +$I->see('Logout (erau)', 'form button[type=submit]'); +$I->dontSeeLink('Login'); +$I->dontSeeLink('Signup'); diff --git a/tests/codeception/frontend/functional/SignupCest.php b/tests/codeception/frontend/functional/SignupCest.php new file mode 100755 index 0000000..2c3be8b --- /dev/null +++ b/tests/codeception/frontend/functional/SignupCest.php @@ -0,0 +1,88 @@ +loadFixtures(); + } + + /** + * This method is called when test fails. + * @param \tests\codeception\frontend\FunctionalTester $I + */ + public function _failed($I) + { + + } + + /** + * + * @param \tests\codeception\frontend\FunctionalTester $I + * @param \Codeception\Scenario $scenario + */ + public function testUserSignup($I, $scenario) + { + $I->wantTo('ensure that signup works'); + + $signupPage = SignupPage::openBy($I); + $I->see('Signup', 'h1'); + $I->see('Please fill out the following fields to signup:'); + + $I->amGoingTo('submit signup form with no data'); + + $signupPage->submit([]); + + $I->expectTo('see validation errors'); + $I->see('Username cannot be blank.', '.help-block'); + $I->see('Email cannot be blank.', '.help-block'); + $I->see('Password cannot be blank.', '.help-block'); + + $I->amGoingTo('submit signup form with not correct email'); + $signupPage->submit([ + 'username' => 'tester', + 'email' => 'tester.email', + 'password' => 'tester_password', + ]); + + $I->expectTo('see that email address is wrong'); + $I->dontSee('Username cannot be blank.', '.help-block'); + $I->dontSee('Password cannot be blank.', '.help-block'); + $I->see('Email is not a valid email address.', '.help-block'); + + $I->amGoingTo('submit signup form with correct email'); + $signupPage->submit([ + 'username' => 'tester', + 'email' => 'tester.email@example.com', + 'password' => 'tester_password', + ]); + + $I->expectTo('see that user is created'); + $I->seeRecord('common\models\User', [ + 'username' => 'tester', + 'email' => 'tester.email@example.com', + ]); + + $I->expectTo('see that user logged in'); + $I->see('Logout (tester)', 'form button[type=submit]'); + } +} diff --git a/tests/codeception/frontend/functional/_bootstrap.php b/tests/codeception/frontend/functional/_bootstrap.php new file mode 100755 index 0000000..1abc491 --- /dev/null +++ b/tests/codeception/frontend/functional/_bootstrap.php @@ -0,0 +1,3 @@ + 'okirlin', + 'auth_key' => 'iwTNae9t34OmnK6l4vT4IeaTk-YWI2Rv', + 'password_hash' => '$2y$13$CXT0Rkle1EMJ/c1l5bylL.EylfmQ39O5JlHJVFpNn618OUS1HwaIi', + 'password_reset_token' => 't5GU9NwpuGYSfb7FEZMAxqtuz2PkEvv_' . time(), + 'created_at' => '1391885313', + 'updated_at' => '1391885313', + 'email' => 'brady.renner@rutherford.com', + ], + [ + 'username' => 'troy.becker', + 'auth_key' => 'EdKfXrx88weFMV0vIxuTMWKgfK2tS3Lp', + 'password_hash' => '$2y$13$g5nv41Px7VBqhS3hVsVN2.MKfgT3jFdkXEsMC4rQJLfaMa7VaJqL2', + 'password_reset_token' => '4BSNyiZNAuxjs5Mty990c47sVrgllIi_' . time(), + 'created_at' => '1391885313', + 'updated_at' => '1391885313', + 'email' => 'nicolas.dianna@hotmail.com', + 'status' => '0', + ], +]; diff --git a/tests/codeception/frontend/unit/models/ContactFormTest.php b/tests/codeception/frontend/unit/models/ContactFormTest.php new file mode 100755 index 0000000..9aaf595 --- /dev/null +++ b/tests/codeception/frontend/unit/models/ContactFormTest.php @@ -0,0 +1,59 @@ +mailer->fileTransportCallback = function ($mailer, $message) { + return 'testing_message.eml'; + }; + } + + protected function tearDown() + { + unlink($this->getMessageFile()); + parent::tearDown(); + } + + public function testContact() + { + $model = new ContactForm(); + + $model->attributes = [ + 'name' => 'Tester', + 'email' => 'tester@example.com', + 'subject' => 'very important letter subject', + 'body' => 'body of current message', + ]; + + $model->sendEmail('admin@example.com'); + + $this->specify('email should be send', function () { + expect('email file should exist', file_exists($this->getMessageFile()))->true(); + }); + + $this->specify('message should contain correct data', function () use ($model) { + $emailMessage = file_get_contents($this->getMessageFile()); + + expect('email should contain user name', $emailMessage)->contains($model->name); + expect('email should contain sender email', $emailMessage)->contains($model->email); + expect('email should contain subject', $emailMessage)->contains($model->subject); + expect('email should contain body', $emailMessage)->contains($model->body); + }); + } + + private function getMessageFile() + { + return Yii::getAlias(Yii::$app->mailer->fileTransportPath) . '/testing_message.eml'; + } +} diff --git a/tests/codeception/frontend/unit/models/PasswordResetRequestFormTest.php b/tests/codeception/frontend/unit/models/PasswordResetRequestFormTest.php new file mode 100755 index 0000000..ced8cce --- /dev/null +++ b/tests/codeception/frontend/unit/models/PasswordResetRequestFormTest.php @@ -0,0 +1,87 @@ +mailer->fileTransportCallback = function ($mailer, $message) { + return 'testing_message.eml'; + }; + } + + protected function tearDown() + { + @unlink($this->getMessageFile()); + + parent::tearDown(); + } + + public function testSendEmailWrongUser() + { + $this->specify('no user with such email, message should not be sent', function () { + + $model = new PasswordResetRequestForm(); + $model->email = 'not-existing-email@example.com'; + + expect('email not sent', $model->sendEmail())->false(); + + }); + + $this->specify('user is not active, message should not be sent', function () { + + $model = new PasswordResetRequestForm(); + $model->email = $this->user[1]['email']; + + expect('email not sent', $model->sendEmail())->false(); + + }); + } + + public function testSendEmailCorrectUser() + { + $model = new PasswordResetRequestForm(); + $model->email = $this->user[0]['email']; + $user = User::findOne(['password_reset_token' => $this->user[0]['password_reset_token']]); + + expect('email sent', $model->sendEmail())->true(); + expect('user has valid token', $user->password_reset_token)->notNull(); + + $this->specify('message has correct format', function () use ($model) { + + expect('message file exists', file_exists($this->getMessageFile()))->true(); + + $message = file_get_contents($this->getMessageFile()); + expect('message "from" is correct', $message)->contains(Yii::$app->params['supportEmail']); + expect('message "to" is correct', $message)->contains($model->email); + + }); + } + + public function fixtures() + { + return [ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => '@tests/codeception/frontend/unit/fixtures/data/models/user.php' + ], + ]; + } + + private function getMessageFile() + { + return Yii::getAlias(Yii::$app->mailer->fileTransportPath) . '/testing_message.eml'; + } +} diff --git a/tests/codeception/frontend/unit/models/ResetPasswordFormTest.php b/tests/codeception/frontend/unit/models/ResetPasswordFormTest.php new file mode 100755 index 0000000..a4dd021 --- /dev/null +++ b/tests/codeception/frontend/unit/models/ResetPasswordFormTest.php @@ -0,0 +1,43 @@ +user[0]['password_reset_token']); + expect('password should be resetted', $form->resetPassword())->true(); + } + + public function fixtures() + { + return [ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => '@tests/codeception/frontend/unit/fixtures/data/models/user.php' + ], + ]; + } +} diff --git a/tests/codeception/frontend/unit/models/SignupFormTest.php b/tests/codeception/frontend/unit/models/SignupFormTest.php new file mode 100755 index 0000000..4d08e8c --- /dev/null +++ b/tests/codeception/frontend/unit/models/SignupFormTest.php @@ -0,0 +1,52 @@ + 'some_username', + 'email' => 'some_email@example.com', + 'password' => 'some_password', + ]); + + $user = $model->signup(); + + $this->assertInstanceOf('common\models\User', $user, 'user should be valid'); + + expect('username should be correct', $user->username)->equals('some_username'); + expect('email should be correct', $user->email)->equals('some_email@example.com'); + expect('password should be correct', $user->validatePassword('some_password'))->true(); + } + + public function testNotCorrectSignup() + { + $model = new SignupForm([ + 'username' => 'troy.becker', + 'email' => 'nicolas.dianna@hotmail.com', + 'password' => 'some_password', + ]); + + expect('username and email are in use, user should not be created', $model->signup())->null(); + } + + public function fixtures() + { + return [ + 'user' => [ + 'class' => UserFixture::className(), + 'dataFile' => '@tests/codeception/frontend/unit/fixtures/data/models/user.php', + ], + ]; + } +} diff --git a/vagrant/config/.gitignore b/vagrant/config/.gitignore new file mode 100755 index 0000000..0685a56 --- /dev/null +++ b/vagrant/config/.gitignore @@ -0,0 +1,2 @@ +# local configuration +vagrant-local.yml \ No newline at end of file diff --git a/vagrant/config/vagrant-local.example.yml b/vagrant/config/vagrant-local.example.yml new file mode 100755 index 0000000..32dd3ab --- /dev/null +++ b/vagrant/config/vagrant-local.example.yml @@ -0,0 +1,22 @@ +# Your personal GitHub token +github_token: +# Read more: https://github.com/blog/1509-personal-api-tokens +# You can generate it here: https://github.com/settings/tokens + +# Guest OS timezone +timezone: Europe/London + +# Are we need check box updates for every 'vagrant up'? +box_check_update: false + +# Virtual machine name +machine_name: y2aa + +# Virtual machine IP +ip: 192.168.83.137 + +# Virtual machine CPU cores number +cpus: 1 + +# Virtual machine RAM +memory: 512 diff --git a/vagrant/nginx/app.conf b/vagrant/nginx/app.conf new file mode 100755 index 0000000..856eace --- /dev/null +++ b/vagrant/nginx/app.conf @@ -0,0 +1,75 @@ +server { + charset utf-8; + client_max_body_size 128M; + + listen 80; ## listen for ipv4 + #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 + + server_name y2aa-frontend.dev; + root /app/frontend/web/; + index index.php; + + access_log /app/vagrant/nginx/log/frontend-access.log; + error_log /app/vagrant/nginx/log/frontend-error.log; + + location / { + # Redirect everything that isn't a real file to index.php + try_files $uri $uri/ /index.php$is_args$args; + } + + # uncomment to avoid processing of calls to non-existing static files by Yii + #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { + # try_files $uri =404; + #} + #error_page 404 /404.html; + + location ~ \.php$ { + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + #fastcgi_pass 127.0.0.1:9000; + fastcgi_pass unix:/var/run/php5-fpm.sock; + try_files $uri =404; + } + + location ~ /\.(ht|svn|git) { + deny all; + } +} + +server { + charset utf-8; + client_max_body_size 128M; + + listen 80; ## listen for ipv4 + #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 + + server_name y2aa-backend.dev; + root /app/backend/web/; + index index.php; + + access_log /app/vagrant/nginx/log/backend-access.log; + error_log /app/vagrant/nginx/log/backend-error.log; + + location / { + # Redirect everything that isn't a real file to index.php + try_files $uri $uri/ /index.php$is_args$args; + } + + # uncomment to avoid processing of calls to non-existing static files by Yii + #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { + # try_files $uri =404; + #} + #error_page 404 /404.html; + + location ~ \.php$ { + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + #fastcgi_pass 127.0.0.1:9000; + fastcgi_pass unix:/var/run/php5-fpm.sock; + try_files $uri =404; + } + + location ~ /\.(ht|svn|git) { + deny all; + } +} diff --git a/vagrant/nginx/log/.gitignore b/vagrant/nginx/log/.gitignore new file mode 100755 index 0000000..c15cedd --- /dev/null +++ b/vagrant/nginx/log/.gitignore @@ -0,0 +1,5 @@ +# nginx logs +backend-access.log +backend-error.log +frontend-access.log +frontend-error.log \ No newline at end of file diff --git a/vagrant/provision/always-as-root.sh b/vagrant/provision/always-as-root.sh new file mode 100755 index 0000000..f2465e7 --- /dev/null +++ b/vagrant/provision/always-as-root.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} + +#== Provision script == + +info "Provision-script user: `whoami`" + +info "Restart web-stack" +service php5-fpm restart +service nginx restart +service mysql restart \ No newline at end of file diff --git a/vagrant/provision/once-as-root.sh b/vagrant/provision/once-as-root.sh new file mode 100755 index 0000000..b3e8d0d --- /dev/null +++ b/vagrant/provision/once-as-root.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +#== Import script args == + +timezone=$(echo "$1") + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} + +#== Provision script == + +info "Provision-script user: `whoami`" + +info "Allocate swap for MySQL 5.6" +fallocate -l 2048M /swapfile +chmod 600 /swapfile +mkswap /swapfile +swapon /swapfile +echo '/swapfile none swap defaults 0 0' >> /etc/fstab + +info "Configure locales" +update-locale LC_ALL="C" +dpkg-reconfigure locales + +info "Configure timezone" +echo ${timezone} | tee /etc/timezone +dpkg-reconfigure --frontend noninteractive tzdata + +info "Prepare root password for MySQL" +debconf-set-selections <<< "mysql-server-5.6 mysql-server/root_password password \"''\"" +debconf-set-selections <<< "mysql-server-5.6 mysql-server/root_password_again password \"''\"" +echo "Done!" + +info "Update OS software" +apt-get update +apt-get upgrade -y + +info "Install additional software" +apt-get install -y git php5-curl php5-cli php5-intl php5-mysqlnd php5-gd php5-fpm nginx mysql-server-5.6 + +info "Configure MySQL" +sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf +echo "Done!" + +info "Configure PHP-FPM" +sed -i 's/user = www-data/user = vagrant/g' /etc/php5/fpm/pool.d/www.conf +sed -i 's/group = www-data/group = vagrant/g' /etc/php5/fpm/pool.d/www.conf +sed -i 's/owner = www-data/owner = vagrant/g' /etc/php5/fpm/pool.d/www.conf +echo "Done!" + +info "Configure NGINX" +sed -i 's/user www-data/user vagrant/g' /etc/nginx/nginx.conf +echo "Done!" + +info "Enabling site configuration" +ln -s /app/vagrant/nginx/app.conf /etc/nginx/sites-enabled/app.conf +echo "Done!" + +info "Initailize databases for MySQL" +mysql -uroot <<< "CREATE DATABASE yii2advanced" +mysql -uroot <<< "CREATE DATABASE yii2_advanced_tests" +echo "Done!" + +info "Install composer" +curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ No newline at end of file diff --git a/vagrant/provision/once-as-vagrant.sh b/vagrant/provision/once-as-vagrant.sh new file mode 100755 index 0000000..acd554e --- /dev/null +++ b/vagrant/provision/once-as-vagrant.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +#== Import script args == + +github_token=$(echo "$1") + +#== Bash helpers == + +function info { + echo " " + echo "--> $1" + echo " " +} + +#== Provision script == + +info "Provision-script user: `whoami`" + +info "Configure composer" +composer config --global github-oauth.github.com ${github_token} +echo "Done!" + +info "Install plugins for composer" +composer global require "fxp/composer-asset-plugin:~1.1.1" --no-progress + +info "Install codeception" +composer global require "codeception/codeception=2.0.*" "codeception/specify=*" "codeception/verify=*" --no-progress +echo 'export PATH=/home/vagrant/.config/composer/vendor/bin:$PATH' | tee -a /home/vagrant/.profile + +info "Install project dependencies" +cd /app +composer --no-progress --prefer-dist install + +info "Init project" +./init --env=Development --overwrite=y + +info "Apply migrations" +./yii migrate <<< "yes" + +info "Create bash-alias 'app' for vagrant user" +echo 'alias app="cd /app"' | tee /home/vagrant/.bash_aliases + +info "Enabling colorized prompt for guest console" +sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/" /home/vagrant/.bashrc \ No newline at end of file diff --git a/yii.bat b/yii.bat new file mode 100755 index 0000000..d516b3a --- /dev/null +++ b/yii.bat @@ -0,0 +1,20 @@ +@echo off + +rem ------------------------------------------------------------- +rem Yii command line bootstrap script for Windows. +rem +rem @author Qiang Xue +rem @link http://www.yiiframework.com/ +rem @copyright Copyright (c) 2008 Yii Software LLC +rem @license http://www.yiiframework.com/license/ +rem ------------------------------------------------------------- + +@setlocal + +set YII_PATH=%~dp0 + +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe + +"%PHP_COMMAND%" "%YII_PATH%yii" %* + +@endlocal -- libgit2 0.21.4