Commit 2bb287cd81165f7ccffc5e21db0067a0e977ed2b

Authored by Administrator
2 parents d7456409 4ed1f788

Merge remote-tracking branch 'origin/master'

common/models/CustomerSearch.php 0 → 100644
  1 +<?php
  2 +
  3 + namespace common\models;
  4 +
  5 + use Yii;
  6 + use yii\base\Model;
  7 + use yii\data\ActiveDataProvider;
  8 + use common\models\User;
  9 +
  10 + /**
  11 + * CustomerSearch represents the model behind the search form about `common\models\UserInfo`.
  12 + */
  13 + class CustomerSearch extends User
  14 + {
  15 +
  16 + public $type;
  17 +
  18 + public $rating;
  19 +
  20 + public $online;
  21 +
  22 + public $city;
  23 +
  24 + public $info;
  25 +
  26 + /**
  27 + * @inheritdoc
  28 + */
  29 + public function rules()
  30 + {
  31 + return [
  32 + [
  33 + [
  34 + 'type',
  35 + 'rating',
  36 + 'online',
  37 + ],
  38 + 'integer',
  39 + ],
  40 + [
  41 + [
  42 + 'city',
  43 + 'info',
  44 + ],
  45 + 'safe',
  46 + ],
  47 + ];
  48 + }
  49 +
  50 + /**
  51 + * @inheritdoc
  52 + */
  53 + public function attributeLabels()
  54 + {
  55 + return [
  56 + 'type' => Yii::t('app', 'Тип заказчика'),
  57 + 'rating' => Yii::t('app', 'Рейтинг'),
  58 + 'online' => Yii::t('app', 'Статус'),
  59 + 'city' => Yii::t('app', 'Город'),
  60 + 'info' => Yii::t('app', 'Любая информация о заказчике'),
  61 + ];
  62 + }
  63 +
  64 + /**
  65 + * @inheritdoc
  66 + */
  67 + public function scenarios()
  68 + {
  69 + // bypass scenarios() implementation in the parent class
  70 + return Model::scenarios();
  71 + }
  72 +
  73 + /**
  74 + * Creates data provider instance with search query applied
  75 + *
  76 + * @param array $params
  77 + *
  78 + * @return ActiveDataProvider
  79 + */
  80 + public function search($params)
  81 + {
  82 + $query = User::find()
  83 + ->joinWith('userInfo')
  84 + ->joinWith('companyInfo');
  85 +
  86 + $dataProvider = new ActiveDataProvider([
  87 + 'query' => $query,
  88 + ]);
  89 +
  90 + $this->load($params);
  91 +
  92 + if(!$this->validate()) {
  93 + // uncomment the following line if you do not want to return any records when validation fails
  94 + // $query->where('0=1');
  95 + return $dataProvider;
  96 + }
  97 +
  98 + $query->andWhere([
  99 + 'is_customer' => 1,
  100 + ]);
  101 +
  102 + if($this->type == 2) {
  103 + $query->andWhere([
  104 + 'not',
  105 + [ 'company_info.company_info_id' => NULL ],
  106 + ]);
  107 +
  108 + $query->andWhere([
  109 + 'type' => 2,
  110 + ]);
  111 + } elseif($this->type == 1) {
  112 + $query->andWhere([
  113 + 'type' => 1,
  114 + ]);
  115 + }
  116 +
  117 + if($this->online == 1) {
  118 + $query->andWhere([
  119 + '>=',
  120 + 'user_info.date_visit',
  121 + date('Y-m-d H:i:s.u', time() - 1800),
  122 + ]);
  123 + }
  124 +
  125 + $query->andFilterWhere([
  126 + 'like',
  127 + 'user_info.city',
  128 + $this->city,
  129 + ])->andFilterWhere([
  130 + 'or',
  131 + [
  132 + 'like',
  133 + 'LOWER(username)',
  134 + mb_strtolower($this->info),
  135 + ],
  136 + [
  137 + 'like',
  138 + 'LOWER(lastname)',
  139 + mb_strtolower($this->info),
  140 + ],
  141 + [
  142 + 'like',
  143 + 'LOWER(firstname)',
  144 + mb_strtolower($this->info),
  145 + ],
  146 + [
  147 + 'like',
  148 + 'LOWER(middlename)',
  149 + mb_strtolower($this->info),
  150 + ],
  151 + [
  152 + 'like',
  153 + 'LOWER(company_info.name)',
  154 + mb_strtolower($this->info),
  155 + ],
  156 + [
  157 + 'like',
  158 + 'LOWER(company_info.street)',
  159 + mb_strtolower($this->info),
  160 + ],
  161 + [
  162 + 'like',
  163 + 'LOWER(user_info.country)',
  164 + mb_strtolower($this->info),
  165 + ],
  166 + [
  167 + 'like',
  168 + 'LOWER(user_info.city)',
  169 + mb_strtolower($this->info),
  170 + ],
  171 + [
  172 + 'like',
  173 + 'LOWER(user_info.about)',
  174 + mb_strtolower($this->info),
  175 + ],
  176 + ]);
  177 +
  178 + return $dataProvider;
  179 + }
  180 + }
common/models/User.php
1 <?php 1 <?php
2 namespace common\models; 2 namespace common\models;
3 3
  4 + use common\modules\comment\models\Comment;
  5 + use common\modules\comment\models\Rating;
4 use Yii; 6 use Yii;
  7 + use yii\base\InvalidConfigException;
5 use yii\base\NotSupportedException; 8 use yii\base\NotSupportedException;
6 use yii\behaviors\TimestampBehavior; 9 use yii\behaviors\TimestampBehavior;
7 use yii\db\ActiveQuery; 10 use yii\db\ActiveQuery;
@@ -13,17 +16,18 @@ @@ -13,17 +16,18 @@
13 16
14 /** 17 /**
15 * User model 18 * User model
16 - * @property integer $id  
17 - * @property string $username  
18 - * @property string $password_hash  
19 - * @property string $password_reset_token  
20 - * @property string $email  
21 - * @property string $auth_key  
22 - * @property integer $status  
23 - * @property integer $created_at  
24 - * @property integer $updated_at  
25 - * @property string $password write-only password  
26 - * @property string $type 19 + * @property integer $id
  20 + * @property string $username
  21 + * @property string $password_hash
  22 + * @property string $password_reset_token
  23 + * @property string $email
  24 + * @property string $auth_key
  25 + * @property integer $status
  26 + * @property integer $created_at
  27 + * @property integer $updated_at
  28 + * @property string $password write-only password
  29 + * @property string $type
  30 + * @property UserInfo $userInfo
27 */ 31 */
28 class User extends ActiveRecord implements IdentityInterface, UserRbacInterface 32 class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
29 { 33 {
@@ -57,9 +61,6 @@ @@ -57,9 +61,6 @@
57 ]; 61 ];
58 } 62 }
59 63
60 -  
61 -  
62 -  
63 /** 64 /**
64 * @inheritdoc 65 * @inheritdoc
65 */ 66 */
@@ -93,10 +94,15 @@ @@ -93,10 +94,15 @@
93 [ 94 [
94 'specializationInput', 95 'specializationInput',
95 'paymentInput', 96 'paymentInput',
96 - 'type' 97 + 'type',
97 ], 98 ],
98 'safe', 99 'safe',
99 ], 100 ],
  101 + [
  102 + 'type',
  103 + 'default',
  104 + 'value' => 1,
  105 + ],
100 ]; 106 ];
101 } 107 }
102 108
@@ -107,8 +113,8 @@ @@ -107,8 +113,8 @@
107 { 113 {
108 return [ 114 return [
109 'firstname' => Yii::t('app', 'Имя'), 115 'firstname' => Yii::t('app', 'Имя'),
110 - 'lastname' => Yii::t('app', 'Фамилия'),  
111 - 'email' => Yii::t('app', 'Email'), 116 + 'lastname' => Yii::t('app', 'Фамилия'),
  117 + 'email' => Yii::t('app', 'Email'),
112 ]; 118 ];
113 } 119 }
114 120
@@ -343,7 +349,8 @@ @@ -343,7 +349,8 @@
343 */ 349 */
344 public function getUserInfo() 350 public function getUserInfo()
345 { 351 {
346 - return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ])->inverseOf('user'); 352 + return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ])
  353 + ->inverseOf('user');
347 } 354 }
348 355
349 /** 356 /**
@@ -403,11 +410,11 @@ @@ -403,11 +410,11 @@
403 $date1 = new \DateTime(date('Y-m-d H:i:s', $this->created_at)); 410 $date1 = new \DateTime(date('Y-m-d H:i:s', $this->created_at));
404 $result = explode(',', \Yii::$app->formatter->asDuration($date1->diff($now))); 411 $result = explode(',', \Yii::$app->formatter->asDuration($date1->diff($now)));
405 412
406 - if($result >= 4){ 413 + if($result >= 4) {
407 array_splice($result, 2); 414 array_splice($result, 2);
408 } 415 }
409 416
410 - return implode(',',$result); 417 + return implode(',', $result);
411 } 418 }
412 419
413 /** 420 /**
@@ -544,7 +551,8 @@ @@ -544,7 +551,8 @@
544 */ 551 */
545 public function getVacancies() 552 public function getVacancies()
546 { 553 {
547 - return $this->hasMany(Vacancy::className(), [ 'user_id' => 'id' ])->inverseOf('user'); 554 + return $this->hasMany(Vacancy::className(), [ 'user_id' => 'id' ])
  555 + ->inverseOf('user');
548 } 556 }
549 557
550 public function getGalleries() 558 public function getGalleries()
@@ -554,22 +562,44 @@ @@ -554,22 +562,44 @@
554 562
555 public function getOwner() 563 public function getOwner()
556 { 564 {
557 - if($this->type == 1){  
558 - return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]);  
559 - } else if($this->type == 2) { 565 + if($this->type == 2) {
560 return $this->hasOne(CompanyInfo::className(), [ 'user_id' => 'id' ]); 566 return $this->hasOne(CompanyInfo::className(), [ 'user_id' => 'id' ]);
  567 + } else {
  568 + return $this->hasOne(UserInfo::className(), [ 'user_id' => 'id' ]);
561 } 569 }
562 -  
563 } 570 }
564 571
565 - public function getName(){  
566 - if($this->type == 1){  
567 - return $this->firstname. ' '.$this->lastname;  
568 - } else if($this->type == 2){ 572 + public function getName()
  573 + {
  574 + if($this->type == 2) {
569 return $this->companyInfo->name; 575 return $this->companyInfo->name;
  576 + } else {
  577 + return $this->firstname . ' ' . $this->lastname;
570 } 578 }
  579 + }
571 580
  581 + public function getComments()
  582 + {
  583 + $entity = 'user-' . $this->id;
  584 + $comments = (new Comment())->getComments($entity);
  585 + return $comments;
572 } 586 }
573 587
  588 + public function getRatingPG()
  589 + {
  590 + if(\Yii::$app->db->driverName != 'pgsql') {
  591 + throw new InvalidConfigException('This method is available only in PostgreSQL');
  592 + }
  593 + $entity = 'user-' . $this->id;
  594 + $rating = (new Comment())->getComments($entity)
  595 + ->select('ROUND(SUM("rating"."value")/COUNT("rating"."rating_id")::float) as rating')
  596 + ->leftJoin(Rating::tableName(), "CONCAT('Comment-', \"comment\".\"comment_id\") = \"rating\".\"entity\"")
  597 + ->andWhere([
  598 + 'not',
  599 + [ 'rating.value' => NULL ],
  600 + ])
  601 + ->one();
  602 + return $rating;
  603 + }
574 604
575 } 605 }
common/modules/comment/models/Comment.php
1 <?php 1 <?php
2 namespace common\modules\comment\models; 2 namespace common\modules\comment\models;
3 3
  4 + use yii\db\ActiveQuery;
  5 +
4 /** 6 /**
5 * Class Comment 7 * Class Comment
6 * @property bool $guestComment 8 * @property bool $guestComment
@@ -19,6 +21,8 @@ @@ -19,6 +21,8 @@
19 const SCENARIO_USER = 'user'; 21 const SCENARIO_USER = 'user';
20 const SCENARIO_GUEST = 'guest'; 22 const SCENARIO_GUEST = 'guest';
21 23
  24 + public $rating;
  25 +
22 /** 26 /**
23 * @var bool 27 * @var bool
24 */ 28 */
@@ -130,12 +134,17 @@ @@ -130,12 +134,17 @@
130 $this->guestComment = $value; 134 $this->guestComment = $value;
131 } 135 }
132 136
  137 + /**
  138 + * @param string $entity
  139 + *
  140 + * @return ActiveQuery
  141 + */
133 public function getComments($entity) 142 public function getComments($entity)
134 { 143 {
135 return $this->find() 144 return $this->find()
136 ->where([ 145 ->where([
137 - 'entity' => $this->entity,  
138 - 'status' => 1, 146 + 'comment.entity' => $entity,
  147 + 'comment.status' => 1,
139 ]); 148 ]);
140 } 149 }
141 150
frontend/controllers/SearchController.php
1 <?php 1 <?php
2 namespace frontend\controllers; 2 namespace frontend\controllers;
3 3
  4 +use common\models\CustomerSearch;
4 use common\models\Project; 5 use common\models\Project;
5 use common\models\UserInfo; 6 use common\models\UserInfo;
6 use common\models\Vacancy; 7 use common\models\Vacancy;
@@ -68,7 +69,65 @@ class SearchController extends Controller @@ -68,7 +69,65 @@ class SearchController extends Controller
68 69
69 70
70 public function actionCustomer(){ 71 public function actionCustomer(){
  72 + $model = new CustomerSearch();
  73 + $dataProvider = $model->search(Yii::$app->request->queryParams);
  74 + $dataProvider->setPagination([
  75 + 'pageSize' => 5
  76 + ]);
  77 + $dataProvider->setSort([
  78 + 'attributes' => [
  79 + 'name' => [
  80 + 'asc' => [
  81 + 'company_info.name' => SORT_ASC,
  82 + 'firstname' => SORT_ASC,
  83 + 'lastname' => SORT_ASC,
  84 + ],
  85 + 'desc' => [
  86 + 'company_info.name' => SORT_DESC,
  87 + 'firstname' => SORT_DESC,
  88 + 'lastname' => SORT_DESC,
  89 + ],
  90 + 'default' => SORT_ASC,
  91 + 'label' => 'Название',
  92 + ],
  93 + 'staff' => [
  94 + 'asc' => [
  95 + 'company_info.staff' => SORT_ASC,
  96 + ],
  97 + 'desc' => [
  98 + 'company_info.staff' => SORT_DESC,
  99 + ],
  100 + 'default' => SORT_DESC,
  101 + 'label' => 'Количество сотрудников',
  102 + ],
  103 + 'visit' => [
  104 + 'asc' => [
  105 + 'user_info.date_visit' => SORT_ASC,
  106 + ],
  107 + 'desc' => [
  108 + 'user_info.date_visit' => SORT_DESC,
  109 + ],
  110 + 'default' => SORT_DESC,
  111 + 'label' => 'Последний визит',
  112 + ],
  113 + 'city' => [
  114 + 'asc' => [
  115 + 'user_info.city' => SORT_ASC,
  116 + ],
  117 + 'desc' => [
  118 + 'user_info.city' => SORT_DESC,
  119 + ],
  120 + 'default' => SORT_ASC,
  121 + 'label' => 'Город',
  122 + ],
  123 + ],
  124 + ]);
  125 + $model->load(Yii::$app->request->queryParams);
  126 + $cities = UserInfo::find()->select('city')->distinct()->asArray()->indexBy('city')->column();
71 return $this->render('customer',[ 127 return $this->render('customer',[
  128 + 'model' => $model,
  129 + 'dataProvider' => $dataProvider,
  130 + 'cities' => $cities,
72 ]); 131 ]);
73 } 132 }
74 133
frontend/views/layouts/company.php
@@ -16,10 +16,17 @@ $this-&gt;beginContent(&#39;@app/views/layouts/main.php&#39;); @@ -16,10 +16,17 @@ $this-&gt;beginContent(&#39;@app/views/layouts/main.php&#39;);
16 <div class="performance-vacancy-call-back"> 16 <div class="performance-vacancy-call-back">
17 <div class="performance-vacancy-call-back-title">Оставьте заявку<br />и мы вам перезвоним</div> 17 <div class="performance-vacancy-call-back-title">Оставьте заявку<br />и мы вам перезвоним</div>
18 <form class="callback" action=""> 18 <form class="callback" action="">
19 - <label for="callbac_name">Имя</label>  
20 - <input id="callbac_name" type="text"/>  
21 - <label for="callbac_phone">Телефон</label>  
22 - <input id="callbac_phone" type="text"/> 19 +
  20 + <div class="input-blocks-wrapper">
  21 + <label for="callbac_name">Имя</label>
  22 + <input id="callbac_name" type="text"/>
  23 + </div>
  24 +
  25 + <div class="input-blocks-wrapper">
  26 + <label for="callbac_phone">Телефон</label>
  27 + <input id="callbac_phone" type="text"/>
  28 + </div>
  29 +
23 <input id="callbac_submit" type="submit" value="Перезвонить мне"/> 30 <input id="callbac_submit" type="submit" value="Перезвонить мне"/>
24 </form> 31 </form>
25 <div class="performance-vacancy-call-back-conf">Гарантируем конфидециальность</div> 32 <div class="performance-vacancy-call-back-conf">Гарантируем конфидециальность</div>
frontend/views/search/_customer_list_view.php 0 → 100644
  1 +<?php
  2 + /**
  3 + * @var User $model
  4 + * @var mixed $key
  5 + * @var integer $index
  6 + * @var ListView $widget
  7 + */
  8 + use common\models\Project;
  9 + use common\models\User;
  10 + use frontend\helpers\TextHelper;
  11 + use yii\bootstrap\Html;
  12 + use yii\helpers\Url;
  13 + use yii\widgets\ListView;
  14 +?>
  15 +<div class="search_perform_txt-wr">
  16 + <div class="search_perform_title">
  17 + <?php
  18 + if($model->type == 2) {
  19 + echo Html::a($model->companyInfo->name, ['company/common', 'company_id' => $model->id]);
  20 + } else {
  21 + echo Html::a($model->firstname . $model->lastname, ['performer/common', 'performer_id' => $model->id]);
  22 + }
  23 + ?>
  24 + </div>
  25 + <div class="search_perform-stars-wr">
  26 + <div class="rating_search_performer">
  27 + <!--оценка-->
  28 + <?php
  29 + if($rating = $model->getRatingPG()->rating) {
  30 + echo "<input type='hidden' class='val' value='{$rating}'/>";
  31 + } else {
  32 + echo "<input type='hidden' class='val' value='0'/>";
  33 + }
  34 + ?>
  35 + <input type="hidden" class="val" value="4"/>
  36 + </div>
  37 + <div class="search_perform-stars-txt">
  38 + <?= $model->getComments()->count() ?> отзывов
  39 + <?php
  40 + if(!empty( $model->userInfo->city )) {
  41 + echo ", {$model->userInfo->city}";
  42 + }
  43 + ?>
  44 + </div>
  45 + </div>
  46 + <?php
  47 + if($model->type == 2 && !empty( $model->companyInfo->staff )) {
  48 + ?>
  49 + <div class="search_perform_leng">
  50 + <div>Сотрудники: <?= $model->companyInfo->staff ?></div>
  51 + </div>
  52 + <?php
  53 + }
  54 + ?>
  55 + <div class="search_perform_visit">
  56 + <span>Послелний визит:</span> <?= \Yii::$app->formatter->asRelativeTime($model->userInfo->date_visit) ?>
  57 + </div>
  58 + <div class="search_perform_projets_nam">
  59 + <?= Html::a("Заказано проектов {$model->getProjects()->count()}", ['search/project', (new Project())->formName().'[user_id]' => $model->id]) ?>
  60 + </div>
  61 +</div>
  62 +
  63 +<div class="right_search_perform_block-wr">
  64 + <div class="right_search_perform_foto-wr">
  65 + <div>
  66 + <?php
  67 + echo Html::img($model->userInfo->image?:"/images/search_performer_img-1.jpg", ['class' => 'search_customer_image']);
  68 + ?>
  69 + </div>
  70 + </div>
  71 + <a class="get-list" href="#">Добавить в закладки</a>
  72 +</div>
0 \ No newline at end of file 73 \ No newline at end of file
frontend/views/search/company.php
@@ -100,6 +100,12 @@ use yii\widgets\ListView; @@ -100,6 +100,12 @@ use yii\widgets\ListView;
100 <input type="submit" value="Найти"/> 100 <input type="submit" value="Найти"/>
101 </div> 101 </div>
102 </form> 102 </form>
  103 + <script>
  104 + $('div.rating').rating({
  105 + fx: 'full',
  106 + url: 'rating.php'
  107 + });
  108 + </script>
103 </div> 109 </div>
104 <div class="right-search-work"> 110 <div class="right-search-work">
105 <div class="search-worker-title style">Найти исполнителя</div> 111 <div class="search-worker-title style">Найти исполнителя</div>
@@ -144,6 +150,14 @@ use yii\widgets\ListView; @@ -144,6 +150,14 @@ use yii\widgets\ListView;
144 ?> 150 ?>
145 </div> 151 </div>
146 152
  153 + <script>
  154 + $('div.rating-new').rating({
  155 + fx: 'full',
  156 + readOnly: 'true',
  157 + url: 'rating.php'
  158 + });
  159 + </script>
  160 +
147 </div> 161 </div>
148 </div> 162 </div>
149 </div> 163 </div>
frontend/views/search/customer.php
1 <?php 1 <?php
2 -/**  
3 - * Created by PhpStorm.  
4 - * User: vitaliy  
5 - * Date: 09.03.16  
6 - * Time: 10:21  
7 - */ 2 + /**
  3 + * @var CustomerSearch $model
  4 + * @var ActiveDataProvider $dataProvider
  5 + * @var string[] $cities
  6 + */
  7 + use common\models\CustomerSearch;
  8 + use yii\data\ActiveDataProvider;
  9 + use yii\helpers\Html;
  10 + use yii\widgets\ActiveForm;
  11 + use yii\widgets\LinkSorter;
  12 + use yii\widgets\ListView;
  13 +
8 ?> 14 ?>
9 <div class="section-box-22 section-box-customer"> 15 <div class="section-box-22 section-box-customer">
10 <div class="box-wr"> 16 <div class="box-wr">
11 <div class="box-all"> 17 <div class="box-all">
  18 + <?php
  19 + // == Left filter ==
  20 + ?>
12 <div class="left-search-work"> 21 <div class="left-search-work">
13 - <form action="" class="search-work-form">  
14 - <div class="blocks-check-list-wrapp">  
15 - <div class="blocks-check-title"><label for="theme-1">Город</label></div>  
16 - <select id="theme-1">  
17 - <option selected="" value="">Любой</option>  
18 - <option value="">Киев</option>  
19 - <option value="">Житомир</option>  
20 - <option value="">Львов</option>  
21 - <option value="">Киев</option>  
22 - <option value="">Житомир</option>  
23 - <option value="">Львов</option> 22 + <?php
  23 + $form = ActiveForm::begin(['method' => 'get', 'options' => [ 'class' => 'search-work-form' ], 'action' => [''] ]);
24 24
25 - <option value="">Киев</option>  
26 - <option value="">Житомир</option>  
27 - <option value="">Львов</option>  
28 - <option value="">Киев</option>  
29 - <option value="">Житомир</option>  
30 - <option value="">Львов</option>  
31 - <option value="">Киев</option>  
32 - <option value="">Житомир</option>  
33 - <option value="">Львов</option>  
34 - <option value="">Киев</option>  
35 - <option value="">Житомир</option>  
36 - <option value="">Львов</option>  
37 - <option value="">Киев</option>  
38 - <option value="">Житомир</option>  
39 - <option value="">Львов</option>  
40 - <option value="">Киев</option>  
41 - <option value="">Житомир</option>  
42 - <option value="">Львов</option>  
43 - <option value="">Киев</option>  
44 - <option value="">Житомир</option>  
45 - <option value="">Львов</option>  
46 - <option value="">Киев</option>  
47 - <option value="">Житомир</option>  
48 - <option value="">Львов</option>  
49 - <option value="">Киев</option>  
50 - <option value="">Житомир</option>  
51 - <option value="">Львов</option>  
52 - <option value="">Киев</option>  
53 - <option value="">Житомир</option>  
54 - <option value="">Львов</option>  
55 - <option value="">Киев</option>  
56 - <option value="">Житомир</option>  
57 - <option value="">Львов</option>  
58 - <option value="">Киев</option>  
59 - <option value="">Житомир</option>  
60 - <option value="">Львов</option>  
61 - <option value="">Киев</option>  
62 - <option value="">Житомир</option>  
63 - <option value="">Львов</option>  
64 - <option value="">Киев</option>  
65 - <option value="">Житомир</option>  
66 - <option value="">Львов</option>  
67 - <option value="">Киев</option>  
68 - <option value="">Житомир</option>  
69 - <option value="">Львов</option>  
70 - <option value="">Киев</option>  
71 - <option value="">Житомир</option>  
72 - <option value="">Львов</option>  
73 - <option value="">Киев</option>  
74 - <option value="">Житомир</option>  
75 - <option value="">Львов</option>  
76 - <option value="">Киев</option>  
77 - <option value="">Житомир</option>  
78 - <option value="">Львов</option>  
79 - <option value="">Киев</option> 25 + echo $form->field($model, 'city', [
  26 + 'options' => [
  27 + 'class' => 'blocks-check-list-wrapp',
  28 + ],
  29 + 'template' => "<div class='blocks-check-title'>{label}</div>\n{input}<div class='select-after'></div>\n{hint}\n{error}",
  30 + ])
  31 + ->dropDownList($cities, [ 'prompt' => 'Любой' ]);
80 32
81 - </select><div class="select-after"></div>  
82 - </div>  
83 -  
84 - <div class="blocks-check-list-wrapp">  
85 - <div class="blocks-check-title"><label for="theme-3">Тип заказчика</label></div>  
86 - <select id="theme-3">  
87 - <option selected="" value="">Любая</option>  
88 - <option value="">Киев</option>  
89 - <option value="">Житомир</option>  
90 - <option value="">Львов</option>  
91 - <option value="">Киев</option>  
92 - <option value="">Житомир</option>  
93 - <option value="">Львов</option>  
94 - </select><div class="select-after"></div>  
95 - </div> 33 + echo $form->field($model, 'type', [
  34 + 'options' => [
  35 + 'class' => 'blocks-check-list-wrapp',
  36 + ],
  37 + 'template' => "<div class='blocks-check-title'>{label}</div>\n{input}<div class='select-after'></div>\n{hint}\n{error}",
  38 + ])
  39 + ->dropDownList([
  40 + 1 => 'Физическое лицо',
  41 + 2 => 'Компания',
  42 + ], [ 'prompt' => 'Любой' ]);
  43 + ?>
96 44
  45 + <?php
  46 + /* Рейтинг
  47 + ?>
97 <div class="blocks-check-list-wrapp"> 48 <div class="blocks-check-list-wrapp">
98 <div class="blocks-check-title">Рейтинг</div> 49 <div class="blocks-check-title">Рейтинг</div>
99 <div class="rating"> 50 <div class="rating">
@@ -101,56 +52,92 @@ @@ -101,56 +52,92 @@
101 <input type="hidden" class="val" value="0"> 52 <input type="hidden" class="val" value="0">
102 </div> 53 </div>
103 </div> 54 </div>
  55 + <?php
  56 + */
  57 + ?>
104 58
105 - <div class="blocks-check-list-wrapp">  
106 - <div class="blocks-check-title">Статус</div>  
107 - <div class="blocks-check-list">  
108 - <input type="radio" name="group3" class="check-search" id="theme-8"><label for="theme-8"><span></span>Онлайн</label>  
109 - </div>  
110 - <div class="blocks-check-list">  
111 - <input type="radio" name="group3" class="check-search" id="theme-9" checked=""><label for="theme-9"><span></span>Все</label>  
112 - </div>  
113 - </div> 59 + <?php
  60 + echo $form->field($model, 'online', [
  61 + 'options' => [
  62 + 'class' => 'blocks-check-list-wrapp',
  63 + ],
  64 + 'template' => "<div class='blocks-check-title'>{label}</div>\n{input}\n{hint}\n{error}",
  65 + ])
  66 + ->radioList([
  67 + '' => 'Все',
  68 + 1 => 'Онлайн',
  69 + ], [
  70 + 'item' => function($index, $label, $name, $checked, $value) use ($model) {
  71 + $checked = ($model->online == $value);
  72 + return "<div class='blocks-check-list'><input type='radio' id='{$model->formName()}-{$index}' name='{$name}' class='check-search' value='{$value}' " . ($checked?'checked':'') . "><label for='{$model->formName()}-{$index}'><span></span>{$label}</label></div>";
  73 + },
  74 + 'unselect' => NULL,
  75 + ]);
114 76
115 - <div class="blocks-check-list-submit">  
116 - <input type="submit" value="Найти">  
117 - </div>  
118 - </form> 77 + echo '<div class="blocks-check-list-submit">'.Html::submitInput('Найти').'</div>';
  78 +
  79 + $form->end();
  80 + ?>
119 <script> 81 <script>
120 - $('div.rating').rating({  
121 - fx: 'full',  
122 - url: 'rating.php'  
123 - }); 82 + $('div.rating').rating(
  83 + {
  84 + fx : 'full', url : 'rating.php'
  85 + }
  86 + );
124 </script> 87 </script>
125 </div> 88 </div>
126 89
  90 + <?php
  91 + // == End of left filter ==
  92 + ?>
  93 +
  94 + <?php
  95 + // == Page content ==
  96 + ?>
127 <div class="right-search-work"> 97 <div class="right-search-work">
128 <div class="search-worker-title style">Найти заказчика</div> 98 <div class="search-worker-title style">Найти заказчика</div>
129 - <div class="search-worker-title-two style">Заказчики готовые приступить к работе <span>145</span></div> 99 + <div class="search-worker-title-two style">Заказчики готовые приступить к работе
  100 + <span><?= $dataProvider->totalCount ?></span></div>
130 <div class="search-worker-search-wr style"> 101 <div class="search-worker-search-wr style">
131 - <form action="" class="search-worker-form">  
132 - <input id="srch-wrk-text" type="text" placeholder="Любая информация о заказчике" required="">  
133 - <input id="srch-wrk-sub" type="submit" value="Найти">  
134 - </form> 102 + <?php
  103 + $form2 = ActiveForm::begin(['method' => 'get', 'action' => [''], 'options' => ['class' => 'search-worker-form']]);
  104 + echo $form2->field($model, 'info', ['options' => ['tag' => false]])->label(false)->textInput(['placeholder' => $model->getAttributeLabel('info')]);
  105 + echo Html::submitInput('Найти');
  106 + $form2->end();
  107 + ?>
135 <a href="#" class="add-to-catalog-search-worker">Добавить себя в каталог</a> 108 <a href="#" class="add-to-catalog-search-worker">Добавить себя в каталог</a>
136 <div class="search-worker-sort-wr style"> 109 <div class="search-worker-sort-wr style">
137 <div class="search-worker-sort">Сортировать:&nbsp;</div> 110 <div class="search-worker-sort">Сортировать:&nbsp;</div>
138 <ul> 111 <ul>
139 <li class="activejob"> 112 <li class="activejob">
140 - <a href="#">рейтинг</a> 113 + <a href="#"></a>
141 <div class="sidebar-droped-wr style"> 114 <div class="sidebar-droped-wr style">
142 - <ul>  
143 - <li><a href="#">рейтинг</a></li>  
144 - <li><a href="#">1заказчик</a></li>  
145 - <li><a href="#">2заказчик</a></li>  
146 - <li><a href="#">3заказчик</a></li>  
147 - <li><a href="#">4заказчик</a></li>  
148 - </ul> 115 + <?php
  116 + echo LinkSorter::widget([
  117 + 'sort' => $dataProvider->sort,
  118 + ]);
  119 + ?>
149 </div> 120 </div>
150 </li> 121 </li>
151 </ul> 122 </ul>
152 </div> 123 </div>
153 </div> 124 </div>
  125 + <?php
  126 + echo ListView::widget([
  127 + 'dataProvider' => $dataProvider,
  128 + 'layout' => "{items}\n{pager}",
  129 + 'options' => [
  130 + 'class' => 'search-worker-blocks-wr style',
  131 + ],
  132 + 'itemOptions' => [
  133 + 'class' => 'search-worker-blocks',
  134 + ],
  135 + 'itemView' => '_customer_list_view',
  136 + ]);
  137 + ?>
  138 + <?php
  139 + /* == Layout ==
  140 + ?>
154 <div class="search-worker-blocks-wr style"> 141 <div class="search-worker-blocks-wr style">
155 142
156 <div class="search-worker-blocks"> 143 <div class="search-worker-blocks">
@@ -161,13 +148,16 @@ @@ -161,13 +148,16 @@
161 <!--оценка--> 148 <!--оценка-->
162 <input type="hidden" class="val" value="4"/> 149 <input type="hidden" class="val" value="4"/>
163 </div> 150 </div>
164 - <div class="search_perform-stars-txt">30 отзывов, Киев </div> 151 + <div class="search_perform-stars-txt">30 отзывов, Киев</div>
165 </div> 152 </div>
166 <div class="search_perform_leng"> 153 <div class="search_perform_leng">
167 <div>Сотрудники: более 40</div> 154 <div>Сотрудники: более 40</div>
168 </div> 155 </div>
169 - <div class="search_perform_visit"><span>Послелний визит:</span> 2 дня назад</div>  
170 - <div class="search_perform_projets_nam"><a href="#">Заказано проектов: 21</a></div> 156 + <div class="search_perform_visit">
  157 + <span>Послелний визит:</span> 2 дня назад
  158 + </div>
  159 + <div class="search_perform_projets_nam">
  160 + <a href="#">Заказано проектов: 21</a></div>
171 </div> 161 </div>
172 162
173 <div class="right_search_perform_block-wr"> 163 <div class="right_search_perform_block-wr">
@@ -186,13 +176,16 @@ @@ -186,13 +176,16 @@
186 <!--оценка--> 176 <!--оценка-->
187 <input type="hidden" class="val" value="2"/> 177 <input type="hidden" class="val" value="2"/>
188 </div> 178 </div>
189 - <div class="search_perform-stars-txt">30 отзывов, Киев </div> 179 + <div class="search_perform-stars-txt">30 отзывов, Киев</div>
190 </div> 180 </div>
191 <div class="search_perform_leng"> 181 <div class="search_perform_leng">
192 <!--<div>Сотрудники: более 40</div>--> 182 <!--<div>Сотрудники: более 40</div>-->
193 </div> 183 </div>
194 - <div class="search_perform_visit"><span>Послелний визит:</span> 2 дня назад</div>  
195 - <div class="search_perform_projets_nam"><a href="#">Заказано проектов: 21</a></div> 184 + <div class="search_perform_visit">
  185 + <span>Послелний визит:</span> 2 дня назад
  186 + </div>
  187 + <div class="search_perform_projets_nam">
  188 + <a href="#">Заказано проектов: 21</a></div>
196 </div> 189 </div>
197 190
198 <div class="right_search_perform_block-wr"> 191 <div class="right_search_perform_block-wr">
@@ -211,13 +204,16 @@ @@ -211,13 +204,16 @@
211 <!--оценка--> 204 <!--оценка-->
212 <input type="hidden" class="val" value="1"/> 205 <input type="hidden" class="val" value="1"/>
213 </div> 206 </div>
214 - <div class="search_perform-stars-txt">30 отзывов, Киев </div> 207 + <div class="search_perform-stars-txt">30 отзывов, Киев</div>
215 </div> 208 </div>
216 <div class="search_perform_leng"> 209 <div class="search_perform_leng">
217 <div>Сотрудники: более 40</div> 210 <div>Сотрудники: более 40</div>
218 </div> 211 </div>
219 - <div class="search_perform_visit"><span>Послелний визит:</span> 2 дня назад</div>  
220 - <div class="search_perform_projets_nam"><a href="#">Заказано проектов: 21</a></div> 212 + <div class="search_perform_visit">
  213 + <span>Послелний визит:</span> 2 дня назад
  214 + </div>
  215 + <div class="search_perform_projets_nam">
  216 + <a href="#">Заказано проектов: 21</a></div>
221 </div> 217 </div>
222 218
223 <div class="right_search_perform_block-wr"> 219 <div class="right_search_perform_block-wr">
@@ -236,13 +232,16 @@ @@ -236,13 +232,16 @@
236 <!--оценка--> 232 <!--оценка-->
237 <input type="hidden" class="val" value="5"/> 233 <input type="hidden" class="val" value="5"/>
238 </div> 234 </div>
239 - <div class="search_perform-stars-txt">30 отзывов, Киев </div> 235 + <div class="search_perform-stars-txt">30 отзывов, Киев</div>
240 </div> 236 </div>
241 <div class="search_perform_leng"> 237 <div class="search_perform_leng">
242 <!--<div>Сотрудники: более 40</div>--> 238 <!--<div>Сотрудники: более 40</div>-->
243 </div> 239 </div>
244 - <div class="search_perform_visit"><span>Послелний визит:</span> 2 дня назад</div>  
245 - <div class="search_perform_projets_nam"><a href="#">Заказано проектов: 21</a></div> 240 + <div class="search_perform_visit">
  241 + <span>Послелний визит:</span> 2 дня назад
  242 + </div>
  243 + <div class="search_perform_projets_nam">
  244 + <a href="#">Заказано проектов: 21</a></div>
246 </div> 245 </div>
247 246
248 <div class="right_search_perform_block-wr"> 247 <div class="right_search_perform_block-wr">
@@ -263,14 +262,21 @@ @@ -263,14 +262,21 @@
263 </ul> 262 </ul>
264 </div> 263 </div>
265 264
  265 + <?php
  266 + == End of layout == */
  267 + ?>
  268 +
266 <script> 269 <script>
267 - $('div.rating_search_performer').rating({  
268 - fx: 'full',  
269 - readOnly: 'true',  
270 - url: 'rating.php'  
271 - }); 270 + $('div.rating_search_performer').rating(
  271 + {
  272 + fx : 'full', readOnly : 'true', url : 'rating.php'
  273 + }
  274 + );
272 </script> 275 </script>
273 </div> 276 </div>
  277 + <?php
  278 + // == End of page content ==
  279 + ?>
274 </div> 280 </div>
275 </div> 281 </div>
276 </div> 282 </div>
277 \ No newline at end of file 283 \ No newline at end of file
frontend/views/search/performer.php
@@ -159,6 +159,12 @@ $this-&gt;title = &#39;My Yii Application&#39;; @@ -159,6 +159,12 @@ $this-&gt;title = &#39;My Yii Application&#39;;
159 <input type="submit" value="Найти"/> 159 <input type="submit" value="Найти"/>
160 </div> 160 </div>
161 </form> 161 </form>
  162 + <script>
  163 + $('div.rating').rating({
  164 + fx: 'full',
  165 + url: 'rating.php'
  166 + });
  167 + </script>
162 </div> 168 </div>
163 <div class="right-search-work"> 169 <div class="right-search-work">
164 <div class="search-worker-title style">Найти исполнителя</div> 170 <div class="search-worker-title style">Найти исполнителя</div>
@@ -203,6 +209,14 @@ $this-&gt;title = &#39;My Yii Application&#39;; @@ -203,6 +209,14 @@ $this-&gt;title = &#39;My Yii Application&#39;;
203 209
204 210
205 </div> 211 </div>
  212 +
  213 + <script>
  214 + $('div.rating-new').rating({
  215 + fx: 'full',
  216 + readOnly: 'true',
  217 + url: 'rating.php'
  218 + });
  219 + </script>
206 </div> 220 </div>
207 </div> 221 </div>
208 </div> 222 </div>
frontend/views/site/forms-modal-offer.php
@@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
44 <div class="form-resume-sub style">Предложить проект</div> 44 <div class="form-resume-sub style">Предложить проект</div>
45 <form action="" class="offer-project"> 45 <form action="" class="offer-project">
46 46
47 - <label>Выбрать проект</label><div style="clear:both;"></div> 47 + <label>Выбрать проект</label>
48 <div class="list_item title"> 48 <div class="list_item title">
49 <div class="main_item"> 49 <div class="main_item">
50 <div class="pr_title"></div> 50 <div class="pr_title"></div>
@@ -77,11 +77,6 @@ @@ -77,11 +77,6 @@
77 </div> 77 </div>
78 </div> 78 </div>
79 79
80 - <label for="off_name">Название проекта</label><input id="off_name" name="" type="text">  
81 -  
82 - <label for="off_text">Описание</label><textarea id="off_text" name=""></textarea>  
83 -  
84 - <label for="off_price">Цена</label><input id="off_price" name="" type="text">  
85 80
86 <input id="off_submit" type="submit" value="Предложить"> 81 <input id="off_submit" type="submit" value="Предложить">
87 </form> 82 </form>
@@ -89,5 +84,56 @@ @@ -89,5 +84,56 @@
89 </div> 84 </div>
90 </div> 85 </div>
91 86
  87 +<!--<div id="modal_form_offer">-->
  88 +<!-- <div class="closed-form"></div>-->
  89 +<!-- <div class="form-resume-wr offer">-->
  90 +<!-- <div class="form-resume-sub style">Предложить проект</div>-->
  91 +<!-- <form action="" class="offer-project">-->
  92 +<!---->
  93 +<!-- <label>Выбрать проект</label><div style="clear:both;"></div>-->
  94 +<!-- <div class="list_item title">-->
  95 +<!-- <div class="main_item">-->
  96 +<!-- <div class="pr_title"></div>-->
  97 +<!-- <span></span>-->
  98 +<!-- </div>-->
  99 +<!-- <div class="arrow up"></div>-->
  100 +<!-- <div class="off_list">-->
  101 +<!-- <ul class="content list-form-offer">-->
  102 +<!-- <li>-->
  103 +<!-- <div class="title1">Проект бассейна 1</div>-->
  104 +<!-- <div class="title2">Подряд: Вилла 1</div>-->
  105 +<!-- </li>-->
  106 +<!-- <li>-->
  107 +<!-- <div class="title1">Проект бассейна 2</div>-->
  108 +<!-- <div class="title2">Подряд: Вилла 2</div>-->
  109 +<!-- </li>-->
  110 +<!-- <li>-->
  111 +<!-- <div class="title1">Проект бассейна 3</div>-->
  112 +<!-- <div class="title2">Подряд: Вилла 3</div>-->
  113 +<!-- </li>-->
  114 +<!-- <li>-->
  115 +<!-- <div class="title1">Проект бассейна 4</div>-->
  116 +<!-- <div class="title2">Подряд: Вилла 4</div>-->
  117 +<!-- </li>-->
  118 +<!-- <li>-->
  119 +<!-- <div class="title1">Проект бассейна 5</div>-->
  120 +<!-- <div class="title2">Подряд: Вилла 5</div>-->
  121 +<!-- </li>-->
  122 +<!-- </ul>-->
  123 +<!-- </div>-->
  124 +<!-- </div>-->
  125 +<!---->
  126 +<!-- <label for="off_name">Название проекта</label><input id="off_name" name="" type="text">-->
  127 +<!---->
  128 +<!-- <label for="off_text">Описание</label><textarea id="off_text" name=""></textarea>-->
  129 +<!---->
  130 +<!-- <label for="off_price">Цена</label><input id="off_price" name="" type="text">-->
  131 +<!---->
  132 +<!-- <input id="off_submit" type="submit" value="Предложить">-->
  133 +<!-- </form>-->
  134 +<!-- <div class="res_form_line"></div>-->
  135 +<!-- </div>-->
  136 +<!--</div>-->
  137 +
92 138
93 139
frontend/views/site/login.php
@@ -11,42 +11,62 @@ @@ -11,42 +11,62 @@
11 $this->title = 'Авторизация'; 11 $this->title = 'Авторизация';
12 $this->params[ 'breadcrumbs' ][] = $this->title; 12 $this->params[ 'breadcrumbs' ][] = $this->title;
13 ?> 13 ?>
14 - <h1><?php echo Html::encode($this->title); ?></h1> 14 +<div class="box-wr">
  15 + <div class="box-all">
  16 + <div class="form_site_logn-wr">
  17 + <div class="form_site_logn_">
  18 + <h1><?php echo Html::encode($this->title); ?></h1>
  19 +
  20 + <?php
  21 + if(Yii::$app->getSession()
  22 + ->hasFlash('error')
  23 + ) {
  24 + echo '<div class="alert alert-danger">' . Yii::$app->getSession()
  25 + ->getFlash('error') . '</div>';
  26 + }
  27 + ?>
  28 +
  29 +
  30 + <?php //echo \nodge\eauth\Widget::widget([ 'action' => 'site/login' ]); ?>
  31 +
15 32
16 -<?php  
17 - if(Yii::$app->getSession()  
18 - ->hasFlash('error')  
19 - ) {  
20 - echo '<div class="alert alert-danger">' . Yii::$app->getSession()  
21 - ->getFlash('error') . '</div>';  
22 - }  
23 -?>  
24 33
  34 + <?php $form = ActiveForm::begin([
  35 + 'options' => [
  36 + 'class' => 'form-horizontal',
  37 + 'id' => 'login-form',
  38 + ],
  39 + ]); ?>
  40 + <div class="input-blocks-wrapper">
  41 + <?php echo $form->field($model, 'username')
  42 + ->textInput(['class'=>'custom-input-2']); ?>
  43 + </div>
25 44
26 -<?php //echo \nodge\eauth\Widget::widget([ 'action' => 'site/login' ]); ?> 45 + <div class="input-blocks-wrapper">
  46 + <?php echo $form->field($model, 'password')
  47 + ->passwordInput(['class'=>'custom-input-2']); ?>
  48 + </div>
27 49
  50 + <div class="login-check-remember style">
  51 + <?php echo $form->field($model, 'rememberMe', [ 'template' => "{input}\n{label}\n{error}" ])
  52 + ->label('<span></span>Запомнить меня')
  53 + ->checkbox([
  54 + 'class' => 'custom-check',
  55 + 'checked' => 'checked',
  56 + ], false); ?>
  57 + </div>
28 58
29 59
  60 + <div class="form-actions style">
  61 + <?php echo Html::submitButton('Вход', [ 'class' => 'btn btn-primary login-button' ]); ?>
  62 + </div>
  63 + <div class="style" style="text-align: center; font-size: 13px; margin-top: 16px">
  64 + <?= Html::a('Восстановить пароль', [ 'site/request-password-reset' ]) ?>
  65 + </div>
30 66
31 -<?php $form = ActiveForm::begin([  
32 - 'options' => [  
33 - 'class' => 'form-horizontal',  
34 - 'id' => 'login-form',  
35 - ],  
36 -]); ?>  
37 -<?php echo $form->field($model, 'username')  
38 - ->textInput(); ?>  
39 -<?php echo $form->field($model, 'password')  
40 - ->passwordInput(); ?>  
41 -<?php echo $form->field($model, 'rememberMe', [ 'template' => "{input}\n{label}\n{error}" ])  
42 - ->label('<span></span>Запомнить меня')  
43 - ->checkbox([  
44 - 'class' => 'custom-check',  
45 - 'checked' => 'checked',  
46 - ], false); ?> 67 + <?php ActiveForm::end(); ?>
  68 + </div>
  69 + </div>
47 70
48 - <div class="form-actions">  
49 - <?php echo Html::submitButton('Login', [ 'class' => 'btn btn-primary' ]); ?>  
50 </div> 71 </div>
51 -<?= Html::a('Восстановить пароль', [ 'site/request-password-reset' ]) ?>  
52 -<?php ActiveForm::end(); ?>  
53 \ No newline at end of file 72 \ No newline at end of file
  73 +</div>
frontend/web/css/style.css
@@ -945,13 +945,13 @@ li.project-home-active span{ @@ -945,13 +945,13 @@ li.project-home-active span{
945 margin-left: -120px; 945 margin-left: -120px;
946 margin-top: 22px; 946 margin-top: 22px;
947 } 947 }
948 -.form-resume-wr form label { 948 +.form-resume-wr form label, .form_site_logn-wr label {
949 font-size: 13px; 949 font-size: 13px;
950 font-weight: 700; 950 font-weight: 700;
951 width: 100%; 951 width: 100%;
952 float: left; 952 float: left;
953 } 953 }
954 -.form-resume-wr form input { 954 +.form-resume-wr form input, .form_site_logn-wr form input {
955 width: 240px; 955 width: 240px;
956 height: 29px; 956 height: 29px;
957 border: 1px solid #dcdcdc; 957 border: 1px solid #dcdcdc;
@@ -2724,12 +2724,14 @@ input[type=file]::-webkit-file-upload-button { @@ -2724,12 +2724,14 @@ input[type=file]::-webkit-file-upload-button {
2724 .search-worker-blocks:first-child{margin-top: 20px} 2724 .search-worker-blocks:first-child{margin-top: 20px}
2725 .search-worker-blocks-foto-wr { 2725 .search-worker-blocks-foto-wr {
2726 width: 318px; 2726 width: 318px;
2727 - 2727 + min-height: 320px;
2728 float: left; 2728 float: left;
2729 } 2729 }
2730 .search-worker-blocks-text-wr { 2730 .search-worker-blocks-text-wr {
2731 width: 382px; 2731 width: 382px;
2732 float: right; 2732 float: right;
  2733 + min-height: 320px;
  2734 + position: relative;
2733 } 2735 }
2734 .search-worker-blocks-ico-wr { 2736 .search-worker-blocks-ico-wr {
2735 width: 48px; 2737 width: 48px;
@@ -2752,7 +2754,7 @@ input[type=file]::-webkit-file-upload-button { @@ -2752,7 +2754,7 @@ input[type=file]::-webkit-file-upload-button {
2752 text-align: center; 2754 text-align: center;
2753 } 2755 }
2754 .search-worker-blocks-title { 2756 .search-worker-blocks-title {
2755 - font-size: 18px; margin-top: -4px; 2757 + font-size: 18px; margin-top: -1px;
2756 } 2758 }
2757 .rating-new { 2759 .rating-new {
2758 float: left; 2760 float: left;
@@ -2877,8 +2879,14 @@ input[type=file]::-webkit-file-upload-button { @@ -2877,8 +2879,14 @@ input[type=file]::-webkit-file-upload-button {
2877 .search-worker-blocks-buttons { 2879 .search-worker-blocks-buttons {
2878 margin-top: 49px; 2880 margin-top: 49px;
2879 } 2881 }
2880 -  
2881 - 2882 +.search-worker-blocks-buttons {
  2883 + margin-top: 0;
  2884 + position: absolute;
  2885 + bottom: 0;
  2886 + left: 0;
  2887 +}
  2888 +.search-worker-blocks .search-worker-blocks-jobs-portfolio {margin-bottom: 41px}
  2889 +.search-company-block-left .search-worker-blocks-jobs-portfolio {margin-bottom: 31px}
2882 2890
2883 .gallery-box-search { 2891 .gallery-box-search {
2884 width: 100%; 2892 width: 100%;
@@ -3258,10 +3266,13 @@ ul.proektant-comments {margin-top: 15px} @@ -3258,10 +3266,13 @@ ul.proektant-comments {margin-top: 15px}
3258 .search-company-block-left { 3266 .search-company-block-left {
3259 width: 400px; 3267 width: 400px;
3260 float: left; 3268 float: left;
  3269 + min-height: 320px;
  3270 + position: relative;
3261 } 3271 }
3262 .search-company-block-right { 3272 .search-company-block-right {
3263 width: 320px; 3273 width: 320px;
3264 float: right; 3274 float: right;
  3275 + min-height: 320px;
3265 } 3276 }
3266 .search-company-block-left .search-worker-blocks-title-wr {float: left; width: 100% !important;} 3277 .search-company-block-left .search-worker-blocks-title-wr {float: left; width: 100% !important;}
3267 .search-company-block-left .land-stars-pro, .land-stars-new {margin-right: 11px} 3278 .search-company-block-left .land-stars-pro, .land-stars-new {margin-right: 11px}
@@ -3422,7 +3433,8 @@ ul.proektant-comments {margin-top: 15px} @@ -3422,7 +3433,8 @@ ul.proektant-comments {margin-top: 15px}
3422 .favorite-user-profile-add span{line-height: 18px} 3433 .favorite-user-profile-add span{line-height: 18px}
3423 3434
3424 form.offer-project { 3435 form.offer-project {
3425 - height: 531px; 3436 + /*height: 531px;*/
  3437 + height: 211px;
3426 } 3438 }
3427 #off_submit { 3439 #off_submit {
3428 bottom: 25px; 3440 bottom: 25px;
@@ -4114,7 +4126,8 @@ ul.min_markers_two @@ -4114,7 +4126,8 @@ ul.min_markers_two
4114 /*** message-read***/ 4126 /*** message-read***/
4115 .comments_block{width:938px;height:498px;background-color:#fcfcfc;border:1px solid #b7b7b7;border-right:none;margin-bottom:57px;color:#333;font-family:Roboto;font-size:13px;position:relative;overflow:hidden;outline:none}.comment_type{width:940px}.comment_type .pole{width:660px;margin:0 auto;position:relative}.comment_type .mes_title{font-size:18px;color:#333;margin:18px 0}.message_text{width:638px;height:78px;resize:none;border:1px solid #c2c2c2;margin:0 auto;margin-bottom:26px;margin-top:18px;padding:10px;font-family:Roboto}.send_mess_but{outline:none;border:none;cursor:pointer;font-size:12px!important;padding-top:2px;width:170px;height:43px;text-align:center;text-transform:uppercase;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr = '#148ad6',endColorstr = '#0072bc');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr = '#148ad6',endColorstr = '#0072bc')";background-image:-moz-linear-gradient(top,#148ad6,#0072bc);background-image:-ms-linear-gradient(top,#148ad6,#0072bc);background-image:-o-linear-gradient(top,#148ad6,#0072bc);background-image:-webkit-gradient(linear,center top,center bottom,from(#148ad6),to(#0072bc));background-image:-webkit-linear-gradient(top,#148ad6,#0072bc);background-image:linear-gradient(top,#148ad6,#0072bc);color:#fff;border-bottom:2px solid #0054a6;border-radius:4px;transition:.1s;top:170px;line-height:3.5}.send_mess_but:hover{opacity:.9}.send_mess_but:active{line-height:3.7}.pick_file{position:absolute;top:170px;right:0;width:130px}.pick_file .link:after{content:'';background:url(/images/skrpk.png) left center no-repeat;position:absolute;width:19px;height:21px;left:-28px;top:0}.pick_file .link{text-transform:uppercase;color:#0276c0;font-size:13px;cursor:pointer;text-decoration:none;border-bottom:1px solid #70b2db;position:relative}.pick_file .capt{color:#c2c2c2;font-size:11px;line-height:16px;margin-top:3px}.comment_text{position:relative;padding:12px 13px;width:602px;border:1px solid #c2c2c2;min-height:74px;left:10px;line-height:1.3;background-color:#fff}.comment.left .comment_text{float:left}.comment.right .comment_text{float:right}.comment.left .comment_text:before{content:'';background:url(/images/mes_bord_left.png);position:absolute;width:11px;height:11px;top:-1px;left:-11px}.comment.right .comment_text:before{content:'';background:url(/images/mes_bord_right.png);position:absolute;width:11px;height:11px;top:-1px;right:-11px}.comment.left .author_pic{float:left;margin:0 10px}.comment.right .author_pic{float:right;margin:0 25px 0 30px}.comment_time{color:#c6c6c6;font-family:Roboto;font-size:13px;font-weight:600;line-height:32px;position:absolute}.comment.left .comment_time{top: 17px; right: -120px; width: 100px;}.comment.right .comment_time{ top: 18px; left: -88px; width: 100px;}.comment{position:relative;margin:30px 21px 30px 1px}.comment .offer_link a{color:#0173bd;display:block; height:25px; position:relative}.comment .offer_link a:before{content:'';position:absolute;background:url(/images/skrpk_sm.png) left center no-repeat;width:19px;height:21px;left:-26px;top:-3px}.comment.right .offer_link{float:right;margin-right:94px;margin-top:12px;margin-bottom:-17px}.comment.left .offer_link{left:104px;bottom:-27px}.comment_block .content{overflow:auto;width:938px;height:498px}.fileform{background-color:#FFF;border:1px solid #CCC;border-radius:2px;cursor:pointer;height:26px;overflow:hidden;padding:2px;position:relative;text-align:left;vertical-align:middle;width:230px}.comment_type form{width:660px;margin:0 auto}.comment_type form label{color:#333;font-family:Roboto;font-size:18px}.input_file_text{color:#c2c2c2;font-size:11px;font-family:Roboto;width:125px;position:absolute;right:0;line-height:16px;top:18px;overflow:hidden;text-overflow:ellipsis;white-space:pre-line}.inputfile{float:right;position:relative;width:153px;padding-bottom:10px;background-repeat:no-repeat}.input_file{opacity:0;cursor:pointer;width:160px}.inputfile .file_input_title{position:absolute;color:#0276c0;border-bottom:1px solid #0276c0;text-transform:uppercase;font-family:Roboto;font-size:13px;right:0}.jspArrow{background-color:#0173bd;width:20px;height:20px}.jspVerticalBar{width:20px}.jspVerticalBar .jspArrow{height:20px}.jspTrack{background:#ebebeb;position:relative}.jspDrag{background:#c2c2c2;position:relative;top:0;left:0;cursor:pointer;border-left:2px solid #ebebeb;border-right:2px solid #ebebeb}.jspVerticalBar{background:#ebebeb}.jspArrowUp{background:#0173bd url(/images/scroll_up.png) center center no-repeat}.jspArrowUp:hover{opacity:.8}.jspArrowUp:active{background-position-y:1px!important}.jspDisabled.jspArrowUp{background:#80808d url(/images/scroll_up_grey.png) center center no-repeat}.jspArrowDown{background:#0173bd url(/images/scroll_down.png) center center no-repeat}.jspArrowDown:hover{opacity:.8}.jspArrowDown:active{background-position-y:1px!important}.jspArrowDown{background:#0173bd url(/images/scroll_down.png) center center no-repeat}.jspDisabled.jspArrowDown{background:#80808d url(/images/scroll_down_grey.png) center center no-repeat}.jspContainer{outline:none;border:none} 4127 .comments_block{width:938px;height:498px;background-color:#fcfcfc;border:1px solid #b7b7b7;border-right:none;margin-bottom:57px;color:#333;font-family:Roboto;font-size:13px;position:relative;overflow:hidden;outline:none}.comment_type{width:940px}.comment_type .pole{width:660px;margin:0 auto;position:relative}.comment_type .mes_title{font-size:18px;color:#333;margin:18px 0}.message_text{width:638px;height:78px;resize:none;border:1px solid #c2c2c2;margin:0 auto;margin-bottom:26px;margin-top:18px;padding:10px;font-family:Roboto}.send_mess_but{outline:none;border:none;cursor:pointer;font-size:12px!important;padding-top:2px;width:170px;height:43px;text-align:center;text-transform:uppercase;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr = '#148ad6',endColorstr = '#0072bc');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr = '#148ad6',endColorstr = '#0072bc')";background-image:-moz-linear-gradient(top,#148ad6,#0072bc);background-image:-ms-linear-gradient(top,#148ad6,#0072bc);background-image:-o-linear-gradient(top,#148ad6,#0072bc);background-image:-webkit-gradient(linear,center top,center bottom,from(#148ad6),to(#0072bc));background-image:-webkit-linear-gradient(top,#148ad6,#0072bc);background-image:linear-gradient(top,#148ad6,#0072bc);color:#fff;border-bottom:2px solid #0054a6;border-radius:4px;transition:.1s;top:170px;line-height:3.5}.send_mess_but:hover{opacity:.9}.send_mess_but:active{line-height:3.7}.pick_file{position:absolute;top:170px;right:0;width:130px}.pick_file .link:after{content:'';background:url(/images/skrpk.png) left center no-repeat;position:absolute;width:19px;height:21px;left:-28px;top:0}.pick_file .link{text-transform:uppercase;color:#0276c0;font-size:13px;cursor:pointer;text-decoration:none;border-bottom:1px solid #70b2db;position:relative}.pick_file .capt{color:#c2c2c2;font-size:11px;line-height:16px;margin-top:3px}.comment_text{position:relative;padding:12px 13px;width:602px;border:1px solid #c2c2c2;min-height:74px;left:10px;line-height:1.3;background-color:#fff}.comment.left .comment_text{float:left}.comment.right .comment_text{float:right}.comment.left .comment_text:before{content:'';background:url(/images/mes_bord_left.png);position:absolute;width:11px;height:11px;top:-1px;left:-11px}.comment.right .comment_text:before{content:'';background:url(/images/mes_bord_right.png);position:absolute;width:11px;height:11px;top:-1px;right:-11px}.comment.left .author_pic{float:left;margin:0 10px}.comment.right .author_pic{float:right;margin:0 25px 0 30px}.comment_time{color:#c6c6c6;font-family:Roboto;font-size:13px;font-weight:600;line-height:32px;position:absolute}.comment.left .comment_time{top: 17px; right: -120px; width: 100px;}.comment.right .comment_time{ top: 18px; left: -88px; width: 100px;}.comment{position:relative;margin:30px 21px 30px 1px}.comment .offer_link a{color:#0173bd;display:block; height:25px; position:relative}.comment .offer_link a:before{content:'';position:absolute;background:url(/images/skrpk_sm.png) left center no-repeat;width:19px;height:21px;left:-26px;top:-3px}.comment.right .offer_link{float:right;margin-right:94px;margin-top:12px;margin-bottom:-17px}.comment.left .offer_link{left:104px;bottom:-27px}.comment_block .content{overflow:auto;width:938px;height:498px}.fileform{background-color:#FFF;border:1px solid #CCC;border-radius:2px;cursor:pointer;height:26px;overflow:hidden;padding:2px;position:relative;text-align:left;vertical-align:middle;width:230px}.comment_type form{width:660px;margin:0 auto}.comment_type form label{color:#333;font-family:Roboto;font-size:18px}.input_file_text{color:#c2c2c2;font-size:11px;font-family:Roboto;width:125px;position:absolute;right:0;line-height:16px;top:18px;overflow:hidden;text-overflow:ellipsis;white-space:pre-line}.inputfile{float:right;position:relative;width:153px;padding-bottom:10px;background-repeat:no-repeat}.input_file{opacity:0;cursor:pointer;width:160px}.inputfile .file_input_title{position:absolute;color:#0276c0;border-bottom:1px solid #0276c0;text-transform:uppercase;font-family:Roboto;font-size:13px;right:0}.jspArrow{background-color:#0173bd;width:20px;height:20px}.jspVerticalBar{width:20px}.jspVerticalBar .jspArrow{height:20px}.jspTrack{background:#ebebeb;position:relative}.jspDrag{background:#c2c2c2;position:relative;top:0;left:0;cursor:pointer;border-left:2px solid #ebebeb;border-right:2px solid #ebebeb}.jspVerticalBar{background:#ebebeb}.jspArrowUp{background:#0173bd url(/images/scroll_up.png) center center no-repeat}.jspArrowUp:hover{opacity:.8}.jspArrowUp:active{background-position-y:1px!important}.jspDisabled.jspArrowUp{background:#80808d url(/images/scroll_up_grey.png) center center no-repeat}.jspArrowDown{background:#0173bd url(/images/scroll_down.png) center center no-repeat}.jspArrowDown:hover{opacity:.8}.jspArrowDown:active{background-position-y:1px!important}.jspArrowDown{background:#0173bd url(/images/scroll_down.png) center center no-repeat}.jspDisabled.jspArrowDown{background:#80808d url(/images/scroll_down_grey.png) center center no-repeat}.jspContainer{outline:none;border:none}
4116 /***form-order***/ 4128 /***form-order***/
4117 -#modal_form_offer {height: 505px;} 4129 +#modal_form_offer { /*height: 505px;*/ height: 309px; }
  4130 +#modal_form_offer .form-resume-wr {overflow: visible}
4118 #modal_form_offer,#modal_form_question, #modal_form_question{margin-top: 70px;} 4131 #modal_form_offer,#modal_form_question, #modal_form_question{margin-top: 70px;}
4119 .form-resume-wr form input[type="submit"]{margin-left: 55px;} 4132 .form-resume-wr form input[type="submit"]{margin-left: 55px;}
4120 .form-resume-wr form{top:72px;} 4133 .form-resume-wr form{top:72px;}
@@ -4140,6 +4153,7 @@ ul.min_markers_two @@ -4140,6 +4153,7 @@ ul.min_markers_two
4140 border: 1px solid #dcdcdc; 4153 border: 1px solid #dcdcdc;
4141 position: relative; 4154 position: relative;
4142 cursor:pointer; 4155 cursor:pointer;
  4156 + z-index: 2;
4143 } 4157 }
4144 .list_item.title{margin-bottom: 15px;} 4158 .list_item.title{margin-bottom: 15px;}
4145 .list_item .arrow{ 4159 .list_item .arrow{
@@ -4169,14 +4183,13 @@ ul.min_markers_two @@ -4169,14 +4183,13 @@ ul.min_markers_two
4169 border: 4px solid transparent; 4183 border: 4px solid transparent;
4170 border-top-color: white; 4184 border-top-color: white;
4171 } 4185 }
4172 -form.offer-project {height: 406px;} 4186 +
4173 .list_item .main_item{padding: 10px 37px 12px 12px;transition:0.3s;} 4187 .list_item .main_item{padding: 10px 37px 12px 12px;transition:0.3s;}
4174 .off_list ul li:hover{background-color: #fffccc; } 4188 .off_list ul li:hover{background-color: #fffccc; }
4175 .act-offer-li{opacity: 0.6; cursor: default } 4189 .act-offer-li{opacity: 0.6; cursor: default }
4176 .act-offer-li:hover{background-color: #fff !important; } 4190 .act-offer-li:hover{background-color: #fff !important; }
4177 .off_list{ 4191 .off_list{
4178 position: absolute; 4192 position: absolute;
4179 - width: 100%;  
4180 width: 238px; 4193 width: 238px;
4181 background-color: white; 4194 background-color: white;
4182 border: 1px solid #dcdcdc; 4195 border: 1px solid #dcdcdc;
@@ -5286,23 +5299,6 @@ input.disabled.admin-check:checked + label, input.disabled.admin-check:checked + @@ -5286,23 +5299,6 @@ input.disabled.admin-check:checked + label, input.disabled.admin-check:checked +
5286 left: -12px; 5299 left: -12px;
5287 width: 15px; 5300 width: 15px;
5288 } 5301 }
5289 -  
5290 -.help-block {  
5291 - /*width: 320px;*/  
5292 - /*margin-left: -10px;*/  
5293 - /*text-align: center;*/  
5294 - /*position: relative;*/  
5295 - /*border: 1px solid #c1c1c1;*/  
5296 - /*margin-top: 25px;*/  
5297 - /*box-shadow: 3px 3px 7px 0 rgba(200, 200, 200, .5), inset 0 -3px 0 0 #c1c1c1;*/  
5298 - /*padding: 15px 0;*/  
5299 - /*display: none;*/  
5300 -}  
5301 -.has-error .help-block {  
5302 - /*display: block;*/  
5303 - /*color: inherit;*/  
5304 - /*background: #fff;*/  
5305 -}  
5306 .new-portf-add-comm .help-block{ 5302 .new-portf-add-comm .help-block{
5307 width: 230px; 5303 width: 230px;
5308 margin-left: 0; 5304 margin-left: 0;
@@ -5344,7 +5340,7 @@ top: 272px; @@ -5344,7 +5340,7 @@ top: 272px;
5344 margin-top: 6px; 5340 margin-top: 6px;
5345 margin-bottom: 60px; 5341 margin-bottom: 60px;
5346 } 5342 }
5347 -.form-resume-wr .required:before, .site-request-password-reset .required:before{ 5343 +.form-resume-wr .required:before, .site-request-password-reset .required:before, .form_site_logn-wr .required:before{
5348 display: block; 5344 display: block;
5349 content: "*"; 5345 content: "*";
5350 color: #D40000; 5346 color: #D40000;
@@ -5356,7 +5352,7 @@ top: 272px; @@ -5356,7 +5352,7 @@ top: 272px;
5356 .site-request-password-reset .required:before{ 5352 .site-request-password-reset .required:before{
5357 left: 125px; 5353 left: 125px;
5358 } 5354 }
5359 -.form-resume-wr .help-block { 5355 +.form-resume-wr .help-block, .form_site_logn-wr .help-block {
5360 width: 320px; 5356 width: 320px;
5361 margin: 0; 5357 margin: 0;
5362 text-align: center; 5358 text-align: center;
@@ -5368,12 +5364,12 @@ top: 272px; @@ -5368,12 +5364,12 @@ top: 272px;
5368 padding: 15px 0; 5364 padding: 15px 0;
5369 display: none; 5365 display: none;
5370 } 5366 }
5371 -.form-resume-wr .has-error .help-block { 5367 +.form-resume-wr .has-error .help-block, .form_site_logn-wr .has-error .help-block{
5372 display: block; 5368 display: block;
5373 color: inherit; 5369 color: inherit;
5374 background: #fff; 5370 background: #fff;
5375 } 5371 }
5376 -.form-resume-wr .help-block:before { 5372 +.form-resume-wr .help-block:before, .form_site_logn-wr .help-block:before {
5377 width: 20px; 5373 width: 20px;
5378 height: 20px; 5374 height: 20px;
5379 background: #fff; 5375 background: #fff;
@@ -5384,7 +5380,7 @@ top: 272px; @@ -5384,7 +5380,7 @@ top: 272px;
5384 left: -2px; 5380 left: -2px;
5385 margin-top: -10px; 5381 margin-top: -10px;
5386 } 5382 }
5387 -.form-resume-wr .help-block:after { 5383 +.form-resume-wr .help-block:after, .form_site_logn-wr .help-block:after {
5388 height: 20px; 5384 height: 20px;
5389 background: #fff; 5385 background: #fff;
5390 transform: rotate(45deg); 5386 transform: rotate(45deg);
@@ -6641,8 +6637,8 @@ input[disabled], select[disabled] { @@ -6641,8 +6637,8 @@ input[disabled], select[disabled] {
6641 .rating_search_performer .vote-success, .rating_search_performer .vote-result { 6637 .rating_search_performer .vote-success, .rating_search_performer .vote-result {
6642 display: none; 6638 display: none;
6643 } 6639 }
6644 -.rating_search_performer .vote-active {  
6645 - background: url("/images/stars.png") 0px 14px !important; 6640 +.vote-active {
  6641 + top: -1px !important;
6646 } 6642 }
6647 .rating_search_performer .div.vote-stars, .rating_search_performer div.vote-active { 6643 .rating_search_performer .div.vote-stars, .rating_search_performer div.vote-active {
6648 cursor: default; 6644 cursor: default;
@@ -6659,4 +6655,29 @@ input[disabled], select[disabled] { @@ -6659,4 +6655,29 @@ input[disabled], select[disabled] {
6659 text-align: center; 6655 text-align: center;
6660 } 6656 }
6661 .right_search_perform_foto-wr {vertical-align: middle} 6657 .right_search_perform_foto-wr {vertical-align: middle}
6662 -.section-box-customer .search-worker-blocks {margin-top: 20px}  
6663 \ No newline at end of file 6658 \ No newline at end of file
  6659 +.section-box-customer .search-worker-blocks {margin-top: 20px}
  6660 +.form_site_logn-wr {
  6661 + width: 240px;
  6662 + margin: 0 auto;
  6663 +}
  6664 +.form_site_logn_ {
  6665 + width: 100%;
  6666 + padding: 30px 0;
  6667 + float: left;
  6668 + position: relative;
  6669 +}
  6670 +.form_site_logn-wr h1 {
  6671 + font-size: 24px;
  6672 + width: 100%;
  6673 + text-align: center;
  6674 +}
  6675 +
  6676 +.form_site_logn-wr .login-check-remember {
  6677 + margin-bottom: 19px;
  6678 +}
  6679 +.form_site_logn-wr input.custom-check + label span {margin-top: 1px; margin-right: 6px}
  6680 +.callback .input-blocks-wrapper {margin-top: 0}
  6681 +.list_item.title {margin-top: 20px}
  6682 +.search_customer_image {
  6683 + height: 100%;
  6684 +}
6664 \ No newline at end of file 6685 \ No newline at end of file
frontend/web/js/forms.js
@@ -54,6 +54,7 @@ $(document).ready(function(){ @@ -54,6 +54,7 @@ $(document).ready(function(){
54 var newMarg = $(window).scrollTop(); 54 var newMarg = $(window).scrollTop();
55 $('#overlay').fadeIn(400, 55 $('#overlay').fadeIn(400,
56 function(){ 56 function(){
  57 + $('body').css({overflowY:'hidden'})
57 $('.forms-modal-hide>div') 58 $('.forms-modal-hide>div')
58 .css({display:'block', marginTop:-230+newMarg}) 59 .css({display:'block', marginTop:-230+newMarg})
59 .animate({opacity: 1, top: '50%'}, 200); 60 .animate({opacity: 1, top: '50%'}, 200);
@@ -110,6 +111,7 @@ $(document).ready(function(){ @@ -110,6 +111,7 @@ $(document).ready(function(){
110 clocseModalForms() 111 clocseModalForms()
111 function clocseModalForms(){ 112 function clocseModalForms(){
112 $('body').on('click','.closed-form, #overlay', function(){ 113 $('body').on('click','.closed-form, #overlay', function(){
  114 + $('body').css({overflowY:'visible'})
113 $('.forms-modal-hide>div') 115 $('.forms-modal-hide>div')
114 .animate({opacity: 0, top: '30%'}, 200, 116 .animate({opacity: 0, top: '30%'}, 200,
115 function(){ 117 function(){