


/******** /js/jquery.suggestions.min.js **************/

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):t(e.jQuery)}(this,function(e){"use strict";function t(e){return function(t){if(0===t.length)return!1;if(1===t.length)return!0;var n=e(t[0].value);return 0===t.filter(function(t){return 0!==e(t.value).indexOf(n)}).length}}function n(e,t){return function(n,i){var s,o=[];return t(i)&&(s=C.splitTokens(C.split(n,e)),h.each(i,function(t,i){var a=t.value;if(C.stringEncloses(n,a))return!1;var r=C.splitTokens(C.split(a,e));0===h.minus(s,r).length&&o.push(i)})),1===o.length?o[0]:-1}}function i(e,t){var n=e.data&&e.data[t];return n&&new RegExp("^"+C.escapeRegExChars(n)+"(["+x+"]|$)","i").test(e.value)}function s(e,t){var n=/<strong>/;return n.test(t)&&!n.test(e)?t:e}function o(e,t,n,i,o){var a=this;return s(a.highlightMatches(e,n,i,o),a.highlightMatches(t,n,i,o))}function a(t,n){var i=this;i.element=t,i.el=e(t),i.suggestions=[],i.badQueries=[],i.selectedIndex=-1,i.currentValue=i.element.value,i.intervalId=0,i.cachedResponse={},i.enrichmentCache={},i.currentRequest=null,i.inputPhase=e.Deferred(),i.fetchPhase=e.Deferred(),i.enrichPhase=e.Deferred(),i.onChangeTimeout=null,i.triggering={},i.$wrapper=null,i.options=e.extend({},j,n),i.classes=b,i.disabled=!1,i.selection=null,i.$viewport=e(window),i.$body=e(document.body),i.type=null,i.status={},i.setupElement(),i.initializer=e.Deferred(),i.el.is(":visible")?i.initializer.resolve():i.deferInitialization(),i.initializer.done(e.proxy(i.initialize,i))}function r(){T.each(H,function(e){e.abort()}),H={}}function u(){K=null,j.geoLocation=G}function l(t){return e.map(t,function(e){var t=T.escapeHtml(e.text);return t&&e.matched&&(t="<strong>"+t+"</strong>"),t}).join("")}function c(t,n){var i=t.split(", ");return 1===i.length?t:e.map(i,function(e){return'<span class="'+n+'">'+e+"</span>"}).join(", ")}function d(t,n){var i=!1;return e.each(t,function(e,t){if(i=t.value==n.value&&t!=n)return!1}),i}function f(e,t){var n=t.selection,i=n&&n.data&&t.bounds;return i&&h.each(t.bounds.all,function(t,s){return i=n.data[t]===e.data[t]}),i}function p(e){var t=e.replace(/^(\d{2})(\d*?)(0+)$/g,"$1$2"),n=t.length,i=-1;return n<=2?i=2:n>2&&n<=5?i=5:n>5&&n<=8?i=8:n>8&&n<=11?i=11:n>11&&n<=15?i=15:n>15&&(i=19),C.padEnd(t,i,"0")}e=e&&"default"in e?e.default:e;var g={isArray:function(e){return Array.isArray(e)},isFunction:function(e){return"[object Function]"===Object.prototype.toString.call(e)},isEmptyObject:function(e){return 0===Object.keys(e).length&&e.constructor===Object},isPlainObject:function(e){return void 0!==e&&"object"==typeof e&&null!==e&&!e.nodeType&&e!==e.window&&!(e.constructor&&!Object.prototype.hasOwnProperty.call(e.constructor.prototype,"isPrototypeOf"))}},h={compact:function(e){return e.filter(function(e){return!!e})},each:function(e,t){if(Array.isArray(e))return void e.some(function(e,n){return!1===t(e,n)});Object.keys(e).some(function(n){var i=e[n];return!1===t(i,n)})},intersect:function(e,t){var n=[];return Array.isArray(e)&&Array.isArray(t)?e.filter(function(e){return-1!==t.indexOf(e)}):n},minus:function(e,t){return t&&0!==t.length?e.filter(function(e){return-1===t.indexOf(e)}):e},makeArray:function(e){return g.isArray(e)?Array.prototype.slice.call(e):[e]},minusWithPartialMatching:function(e,t){return t&&0!==t.length?e.filter(function(e){return!t.some(function(t){return 0===t.indexOf(e)})}):e},slice:function(e,t){return Array.prototype.slice.call(e,t)}},m={delay:function(e,t){return setTimeout(e,t||0)}},y={areSame:function e(t,n){var i=!0;return typeof t==typeof n&&("object"==typeof t&&null!=t&&null!=n?(h.each(t,function(t,s){return i=e(t,n[s])}),i):t===n)},assign:function(e,t){if("function"==typeof Object.assign)return Object.assign.apply(null,arguments);if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var n=Object(e),i=1;i<arguments.length;i++){var s=arguments[i];if(null!=s)for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(n[o]=s[o])}return n},clone:function(e){return JSON.parse(JSON.stringify(e))},compact:function(e){var t=y.clone(e);return h.each(t,function(e,n){null!==e&&void 0!==e&&""!==e||delete t[n]}),t},fieldsAreNotEmpty:function(e,t){if(!g.isPlainObject(e))return!1;var n=!0;return h.each(t,function(t,i){return n=!!e[t]}),n},getDeepValue:function e(t,n){var i=n.split("."),s=i.shift();return t&&(i.length?e(t[s],i.join(".")):t[s])},indexObjectsById:function(e,t,n){var i={};return h.each(e,function(e,s){var o=e[t],a={};n&&(a[n]=s),i[o]=y.assign(a,e)}),i}},v={ENTER:13,ESC:27,TAB:9,SPACE:32,UP:38,DOWN:40},b={hint:"suggestions-hint",mobile:"suggestions-mobile",nowrap:"suggestions-nowrap",promo:"suggestions-promo",selected:"suggestions-selected",suggestion:"suggestions-suggestion",subtext:"suggestions-subtext",subtext_inline:"suggestions-subtext suggestions-subtext_inline",subtext_delimiter:"suggestions-subtext-delimiter",subtext_label:"suggestions-subtext suggestions-subtext_label",removeConstraint:"suggestions-remove",value:"suggestions-value"},_=".suggestions",x="\\s\"'~\\*\\.,:\\|\\[\\]\\(\\)\\{\\}<>№",S=new RegExp("["+x+"]+","g"),w=new RegExp("[\\-\\+\\\\\\?!@#$%^&]+","g"),C={escapeHtml:function(e){var t={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"};return e&&h.each(t,function(t,n){e=e.replace(new RegExp(n,"g"),t)}),e},escapeRegExChars:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},formatToken:function(e){return e&&e.toLowerCase().replace(/[ёЁ]/g,"е")},getWordExtractorRegExp:function(){return new RegExp("([^"+x+"]*)(["+x+"]*)","g")},normalize:function(e,t){return C.split(e,t).join(" ")},padEnd:function(e,t,n){return String.prototype.padEnd?e.padEnd(t,n):(t>>=0,n=String(void 0!==n?n:" "),e.length>t?String(e):(t-=e.length,t>n.length&&(n+=n.repeat(t/n.length)),String(e)+n.slice(0,t)))},split:function(e,t){e=e.toLowerCase(),e=e.replace("ё","е").replace(/(\d+)([а-я]{2,})/g,"$1 $2").replace(/([а-я]+)(\d+)/g,"$1 $2");var n=h.compact(e.split(S)),i=n.pop(),s=h.minus(n,t);return s.push(i),s},splitTokens:function(e){var t=[];return h.each(e,function(e,n){var i=e.split(w);t=t.concat(h.compact(i))}),t},stringEncloses:function(e,t){return e.length>t.length&&-1!==e.toLowerCase().indexOf(t.toLowerCase())},tokenize:function(e,t){var n=h.compact(C.formatToken(e).split(S)),i=h.minus(n,t),s=h.minus(n,i);return n=C.withSubTokens(i.concat(s))},withSubTokens:function(e){var t=[];return h.each(e,function(e,n){var i=e.split(w);t.push(e),i.length>1&&(t=t.concat(h.compact(i)))}),t}},E={Deferred:function(){return e.Deferred()},ajax:function(t){return e.ajax(t)},extend:function(){return e.extend.apply(null,arguments)},isJqObject:function(t){return t instanceof e},param:function(t){return e.param(t)},proxy:function(t,n){return e.proxy(t,n)},select:function(t){return e(t)},supportsCors:function(){return e.support.cors}},k={getDefaultType:function(){return E.supportsCors()?"POST":"GET"},getDefaultContentType:function(){return E.supportsCors()?"application/json":"application/x-www-form-urlencoded"},fixURLProtocol:function(e){return E.supportsCors()?e:e.replace(/^https?:/,location.protocol)},addUrlParams:function(e,t){return e+(/\?/.test(e)?"&":"?")+E.param(t)},serialize:function(e){return E.supportsCors()?JSON.stringify(e,function(e,t){return null===t?void 0:t}):(e=y.compact(e),E.param(e,!0))}},P=function(){var e=0;return function(t){return(t||"")+ ++e}}(),T={escapeRegExChars:C.escapeRegExChars,escapeHtml:C.escapeHtml,formatToken:C.formatToken,normalize:C.normalize,reWordExtractor:C.getWordExtractorRegExp,stringEncloses:C.stringEncloses,addUrlParams:k.addUrlParams,getDefaultContentType:k.getDefaultContentType,getDefaultType:k.getDefaultType,fixURLProtocol:k.fixURLProtocol,serialize:k.serialize,arrayMinus:h.minus,arrayMinusWithPartialMatching:h.minusWithPartialMatching,arraysIntersection:h.intersect,compact:h.compact,each:h.each,makeArray:h.makeArray,slice:h.slice,delay:m.delay,areSame:y.areSame,compactObject:y.compact,getDeepValue:y.getDeepValue,fieldsNotEmpty:y.fieldsAreNotEmpty,indexBy:y.indexObjectsById,isArray:g.isArray,isEmptyObject:g.isEmptyObject,isFunction:g.isFunction,isPlainObject:g.isPlainObject,uniqueId:P},j={autoSelectFirst:!1,serviceUrl:"https://suggestions.dadata.ru/suggestions/api/4_1/rs",url:null,onSearchStart:e.noop,onSearchComplete:e.noop,onSearchError:e.noop,onSuggestionsFetch:null,onSelect:null,onSelectNothing:null,onInvalidateSelection:null,minChars:1,deferRequestBy:100,enrichmentEnabled:!0,params:{},paramName:"query",timeout:3e3,formatResult:null,formatSelected:null,noCache:!1,containerClass:"suggestions-suggestions",tabDisabled:!1,triggerSelectOnSpace:!1,triggerSelectOnEnter:!0,triggerSelectOnBlur:!0,preventBadQueries:!1,hint:"Выберите вариант или продолжите ввод",noSuggestionsHint:null,type:null,requestMode:"suggest",count:5,$helpers:null,headers:null,scrollOnFocus:!0,mobileWidth:980,initializeInterval:100},V=t(function(e){return e}),O=t(function(e){return e.replace(/, (?:д|вл|двлд|к) .+$/,"")}),B={matchByNormalizedQuery:function(e){return function(t,n){var i=C.normalize(t,e),s=[];return h.each(n,function(n,o){var a=n.value.toLowerCase();return!C.stringEncloses(t,a)&&(!(a.indexOf(i)>0)&&void(i===C.normalize(a,e)&&s.push(o)))}),1===s.length?s[0]:-1}},matchByWords:function(e){return n(e,V)},matchByWordsAddress:function(e){return n(e,O)},matchByFields:function(e){return function(t,n){var i=C.splitTokens(C.split(t)),s=[];return 1===n.length&&(e&&h.each(e,function(e,t){var i=y.getDeepValue(n[0],t),o=i&&C.splitTokens(C.split(i,e));o&&o.length&&(s=s.concat(o))}),0===h.minusWithPartialMatching(i,s).length)?0:-1}}},L=["ао","аобл","дом","респ","а/я","аал","автодорога","аллея","арбан","аул","б-р","берег","бугор","вал","вл","волость","въезд","высел","г","городок","гск","д","двлд","днп","дор","дп","ж/д_будка","ж/д_казарм","ж/д_оп","ж/д_платф","ж/д_пост","ж/д_рзд","ж/д_ст","жилзона","жилрайон","жт","заезд","заимка","зона","к","казарма","канал","кв","кв-л","км","кольцо","комн","кордон","коса","кп","край","линия","лпх","м","массив","местность","мкр","мост","н/п","наб","нп","обл","округ","остров","оф","п","п/о","п/р","п/ст","парк","пгт","пер","переезд","пл","пл-ка","платф","погост","полустанок","починок","пр-кт","проезд","промзона","просек","просека","проселок","проток","протока","проулок","р-н","рзд","россия","рп","ряды","с","с/а","с/мо","с/о","с/п","с/с","сад","сквер","сл","снт","спуск","ст","ст-ца","стр","тер","тракт","туп","у","ул","уч-к","ф/х","ферма","х","ш","бульвар","владение","выселки","гаражно-строительный","город","деревня","домовладение","дорога","квартал","километр","комната","корпус","литер","леспромхоз","местечко","микрорайон","набережная","область","переулок","платформа","площадка","площадь","поселение","поселок","проспект","разъезд","район","республика","село","сельсовет","слобода","сооружение","станица","станция","строение","территория","тупик","улица","улус","участок","хутор","шоссе"],D=[{id:"kladr_id",fields:["kladr_id"],forBounds:!1,forLocations:!0},{id:"postal_code",fields:["postal_code"],forBounds:!1,forLocations:!0},{id:"country",fields:["country"],forBounds:!1,forLocations:!0},{id:"region_fias_id",fields:["region_fias_id"],forBounds:!1,forLocations:!0},{id:"region_type_full",fields:["region_type_full"],forBounds:!1,forLocations:!0,kladrFormat:{digits:2,zeros:11},fiasType:"region_fias_id"},{id:"region",fields:["region","region_type","region_type_full","region_with_type"],forBounds:!0,forLocations:!0,kladrFormat:{digits:2,zeros:11},fiasType:"region_fias_id"},{id:"area_fias_id",fields:["area_fias_id"],forBounds:!1,forLocations:!0},{id:"area_type_full",fields:["area_type_full"],forBounds:!1,forLocations:!0,kladrFormat:{digits:5,zeros:8},fiasType:"area_fias_id"},{id:"area",fields:["area","area_type","area_type_full","area_with_type"],forBounds:!0,forLocations:!0,kladrFormat:{digits:5,zeros:8},fiasType:"area_fias_id"},{id:"city_fias_id",fields:["city_fias_id"],forBounds:!1,forLocations:!0},{id:"city_type_full",fields:["city_type_full"],forBounds:!1,forLocations:!0,kladrFormat:{digits:8,zeros:5},fiasType:"city_fias_id"},{id:"city",fields:["city","city_type","city_type_full","city_with_type"],forBounds:!0,forLocations:!0,kladrFormat:{digits:8,zeros:5},fiasType:"city_fias_id"},{id:"city_district_fias_id",fields:["city_district_fias_id"],forBounds:!1,forLocations:!0},{id:"city_district_type_full",fields:["city_district_type_full"],forBounds:!1,forLocations:!0,kladrFormat:{digits:11,zeros:2},fiasType:"city_district_fias_id"},{id:"city_district",fields:["city_district","city_district_type","city_district_type_full","city_district_with_type"],forBounds:!0,forLocations:!0,kladrFormat:{digits:11,zeros:2},fiasType:"city_district_fias_id"},{id:"settlement_fias_id",fields:["settlement_fias_id"],forBounds:!1,forLocations:!0},{id:"settlement_type_full",fields:["settlement_type_full"],forBounds:!1,forLocations:!0,kladrFormat:{digits:11,zeros:2},fiasType:"settlement_fias_id"},{id:"settlement",fields:["settlement","settlement_type","settlement_type_full","settlement_with_type"],forBounds:!0,forLocations:!0,kladrFormat:{digits:11,zeros:2},fiasType:"settlement_fias_id"},{id:"street_fias_id",fields:["street_fias_id"],forBounds:!1,forLocations:!0},{id:"street_type_full",fields:["street_type_full"],forBounds:!1,forLocations:!0,kladrFormat:{digits:15,zeros:2},fiasType:"street_fias_id"},{id:"street",fields:["street","street_type","street_type_full","street_with_type"],forBounds:!0,forLocations:!0,kladrFormat:{digits:15,zeros:2},fiasType:"street_fias_id"},{id:"house",fields:["house","house_type","house_type_full","block","block_type"],forBounds:!0,forLocations:!1,kladrFormat:{digits:19}}],R={urlSuffix:"address",noSuggestionsHint:"Неизвестный адрес",matchers:[B.matchByNormalizedQuery(L),B.matchByWordsAddress(L)],dataComponents:D,dataComponentsById:y.indexObjectsById(D,"id","index"),unformattableTokens:L,enrichmentEnabled:!0,enrichmentMethod:"suggest",enrichmentParams:{count:1,locations:null,locations_boost:null,from_bound:null,to_bound:null},getEnrichmentQuery:function(e){return e.unrestricted_value},geoEnabled:!0,isDataComplete:function(e){var t=[this.bounds.to||"flat"],n=e.data;return!g.isPlainObject(n)||y.fieldsAreNotEmpty(n,t)},composeValue:function(e,t){var n=e.region_with_type||h.compact([e.region,e.region_type]).join(" ")||e.region_type_full,i=e.area_with_type||h.compact([e.area_type,e.area]).join(" ")||e.area_type_full,s=e.city_with_type||h.compact([e.city_type,e.city]).join(" ")||e.city_type_full,o=e.settlement_with_type||h.compact([e.settlement_type,e.settlement]).join(" ")||e.settlement_type_full,a=e.city_district_with_type||h.compact([e.city_district_type,e.city_district]).join(" ")||e.city_district_type_full,r=e.street_with_type||h.compact([e.street_type,e.street]).join(" ")||e.street_type_full,u=h.compact([e.house_type,e.house,e.block_type,e.block]).join(" "),l=h.compact([e.flat_type,e.flat]).join(" "),c=e.postal_box&&"а/я "+e.postal_box;return n===s&&(n=""),t&&t.saveCityDistrict||(t&&t.excludeCityDistrict?a="":a&&!e.city_district_fias_id&&(a="")),h.compact([n,i,s,a,o,r,u,l,c]).join(", ")},formatResult:function(){var e=[],t=!1;return D.forEach(function(n){t&&e.push(n.id),"city_district"===n.id&&(t=!0)}),function(t,n,i,s){var o,a,r,u=this,l=i.data&&i.data.city_district_with_type,c=s&&s.unformattableTokens,d=i.data&&i.data.history_values;return d&&d.length>0&&(o=C.tokenize(n,c),a=this.type.findUnusedTokens(o,t),(r=this.type.getFormattedHistoryValues(a,d))&&(t+=r)),t=u.highlightMatches(t,n,i,s),t=u.wrapFormattedValue(t,i),l&&(!u.bounds.own.length||u.bounds.own.indexOf("street")>=0)&&!g.isEmptyObject(u.copyDataComponents(i.data,e))&&(t+='<div class="'+u.classes.subtext+'">'+u.highlightMatches(l,n,i)+"</div>"),t}}(),findUnusedTokens:function(e,t){return e.filter(function(e){return-1===t.indexOf(e)})},getFormattedHistoryValues:function(e,t){var n=[],i="";return t.forEach(function(t){h.each(e,function(e){if(t.toLowerCase().indexOf(e)>=0)return n.push(t),!1})}),n.length>0&&(i=" (бывш. "+n.join(", ")+")"),i},getSuggestionValue:function(e,t){var n=null;return t.hasSameValues?n=e.options.restrict_value?this.getValueWithinConstraints(e,t.suggestion):e.bounds.own.length?this.getValueWithinBounds(e,t.suggestion):t.suggestion.unrestricted_value:t.hasBeenEnriched&&e.options.restrict_value&&(n=this.getValueWithinConstraints(e,t.suggestion,{excludeCityDistrict:!0})),n},getValueWithinConstraints:function(e,t,n){return this.composeValue(e.getUnrestrictedData(t.data),n)},getValueWithinBounds:function(e,t,n){var i=e.copyDataComponents(t.data,e.bounds.own.concat(["city_district_fias_id"]));return this.composeValue(i,n)}},I={urlSuffix:"fio",noSuggestionsHint:!1,matchers:[B.matchByNormalizedQuery(),B.matchByWords()],fieldNames:{surname:"фамилия",name:"имя",patronymic:"отчество"},isDataComplete:function(e){var t,n=this,s=n.options.params,o=e.data;return g.isFunction(s)&&(s=s.call(n.element,e.value)),s&&s.parts?t=s.parts.map(function(e){return e.toLowerCase()}):(t=["surname","name"],i(e,"surname")&&t.push("patronymic")),y.fieldsAreNotEmpty(o,t)},composeValue:function(e){return h.compact([e.surname,e.name,e.patronymic]).join(" ")}},$={LEGAL:[2,2,5,1],INDIVIDUAL:[2,2,6,2]},F={urlSuffix:"party",noSuggestionsHint:"Неизвестная организация",matchers:[B.matchByFields({value:null,"data.address.value":L,"data.inn":null,"data.ogrn":null})],dataComponents:D,enrichmentEnabled:!0,enrichmentMethod:"findById",enrichmentParams:{count:1,locations_boost:null},getEnrichmentQuery:function(e){return e.data.hid},geoEnabled:!0,formatResult:function(e,t,n,i){var a=this,r=a.type.formatResultInn.call(a,n,t),u=a.highlightMatches(y.getDeepValue(n.data,"ogrn"),t,n),l=s(r,u),c=a.highlightMatches(y.getDeepValue(n.data,"management.name"),t,n),d=y.getDeepValue(n.data,"address.value")||"";return a.isMobile&&((i||(i={})).maxLength=50),e=o.call(a,e,y.getDeepValue(n.data,"name.latin"),t,n,i),e=a.wrapFormattedValue(e,n),d&&(d=d.replace(/^(\d{6}?\s+|Россия,\s+)/i,""),d=a.isMobile?d.replace(new RegExp("^([^"+x+"]+["+x+"]+[^"+x+"]+).*"),"$1"):a.highlightMatches(d,t,n,{unformattableTokens:L})),(l||d||c)&&(e+='<div class="'+a.classes.subtext+'"><span class="'+a.classes.subtext_inline+'">'+(l||"")+"</span>"+(s(d,c)||"")+"</div>"),e},formatResultInn:function(e,t){var n,i,s=this,o=e.data&&e.data.inn,a=$[e.data&&e.data.type],r=/\d/;if(o)return i=s.highlightMatches(o,t,e),a&&(i=i.split(""),n=a.map(function(e){for(var t,n="";e&&(t=i.shift());)n+=t,r.test(t)&&e--;return n}),i=n.join('<span class="'+s.classes.subtext_delimiter+'"></span>')+i.join("")),i}},q={urlSuffix:"email",noSuggestionsHint:!1,matchers:[B.matchByNormalizedQuery()],isQueryRequestable:function(e){return this.options.suggest_local||e.indexOf("@")>=0}},A={urlSuffix:"bank",noSuggestionsHint:"Неизвестный банк",matchers:[B.matchByFields({value:null,"data.bic":null,"data.swift":null})],dataComponents:D,geoEnabled:!0,formatResult:function(e,t,n,i){var s=this,o=s.highlightMatches(y.getDeepValue(n.data,"bic"),t,n),a=y.getDeepValue(n.data,"address.value")||"";return e=s.highlightMatches(e,t,n,i),e=s.wrapFormattedValue(e,n),a&&(a=a.replace(/^\d{6}( РОССИЯ)?, /i,""),a=s.isMobile?a.replace(new RegExp("^([^"+x+"]+["+x+"]+[^"+x+"]+).*"),"$1"):s.highlightMatches(a,t,n,{unformattableTokens:L})),(o||a)&&(e+='<div class="'+s.classes.subtext+'"><span class="'+s.classes.subtext_inline+'">'+o+"</span>"+a+"</div>"),e},formatSelected:function(e){return y.getDeepValue(e,"data.name.payment")||null}},z={NAME:I,ADDRESS:R,PARTY:F,EMAIL:q,BANK:A};E.extend(j,{suggest_local:!0});var M={chains:{},on:function(e,t){return this.get(e).push(t),this},get:function(e){var t=this.chains;return t[e]||(t[e]=[])}},N={suggest:{defaultParams:{type:T.getDefaultType(),dataType:"json",contentType:T.getDefaultContentType()},addTypeInUrl:!0},detectAddressByIp:{defaultParams:{type:"GET",dataType:"json"},addTypeInUrl:!1},status:{defaultParams:{type:"GET",dataType:"json"},addTypeInUrl:!0},findById:{defaultParams:{type:T.getDefaultType(),dataType:"json",contentType:T.getDefaultContentType()},addTypeInUrl:!0}},U={suggest:{method:"suggest",userSelect:!0,updateValue:!0,enrichmentEnabled:!0},findById:{method:"findById",userSelect:!1,updateValue:!1,enrichmentEnabled:!1}};a.prototype={initialize:function(){var e=this;e.uniqueId=T.uniqueId("i"),e.createWrapper(),e.notify("initialize"),e.bindWindowEvents(),e.setOptions(),e.fixPosition()},deferInitialization:function(){var e,t=this,n="mouseover focus keydown",i=function(){t.initializer.resolve(),t.enable()};t.initializer.always(function(){t.el.off(n,i),clearInterval(e)}),t.disabled=!0,t.el.on(n,i),e=setInterval(function(){t.el.is(":visible")&&i()},t.options.initializeInterval)},isInitialized:function(){return"resolved"===this.initializer.state()},dispose:function(){var e=this;e.initializer.reject(),e.notify("dispose"),e.el.removeData("suggestions").removeClass("suggestions-input"),e.unbindWindowEvents(),e.removeWrapper(),e.el.trigger("suggestions-dispose")},notify:function(t){var n=this,i=T.slice(arguments,1);return e.map(M.get(t),function(e){return e.apply(n,i)})},createWrapper:function(){var t=this;t.$wrapper=e('<div class="suggestions-wrapper"/>'),t.el.after(t.$wrapper),t.$wrapper.on("mousedown"+_,e.proxy(t.onMousedown,t))},removeWrapper:function(){var t=this;t.$wrapper&&t.$wrapper.remove(),e(t.options.$helpers).off(_)},onMousedown:function(t){var n=this;t.preventDefault(),n.cancelBlur=!0,T.delay(function(){delete n.cancelBlur}),0==e(t.target).closest(".ui-menu-item").length&&T.delay(function(){e(document).one("mousedown",function(t){var i=n.el.add(n.$wrapper).add(n.options.$helpers);n.options.floating&&(i=i.add(n.$container)),i=i.filter(function(){return this===t.target||e.contains(this,t.target)}),i.length||n.hide()})})},bindWindowEvents:function(){var t=this,n=e.proxy(t.fixPosition,t);t.$viewport.on("resize"+_+t.uniqueId,n).on("scroll"+_+t.uniqueId,n)},unbindWindowEvents:function(){this.$viewport.off("resize"+_+this.uniqueId).off("scroll"+_+this.uniqueId)},scrollToTop:function(){var t=this,n=t.options.scrollOnFocus;!0===n&&(n=t.el),n instanceof e&&n.length>0&&e("body,html").animate({scrollTop:n.offset().top},"fast")},setOptions:function(t){var n=this;e.extend(n.options,t),e.each({type:z,requestMode:U},function(t,i){if(n[t]=i[n.options[t]],!n[t])throw n.disable(),"`"+t+"` option is incorrect! Must be one of: "+e.map(i,function(e,t){return'"'+t+'"'}).join(", ")}),e(n.options.$helpers).off(_).on("mousedown"+_,e.proxy(n.onMousedown,n)),n.isInitialized()&&n.notify("setOptions")},fixPosition:function(t){var n,i,s=this,o={};s.isMobile=s.$viewport.width()<=s.options.mobileWidth,s.isInitialized()&&(!t||"scroll"!=t.type||s.options.floating||s.isMobile)&&(s.$container.appendTo(s.options.floating?s.$body:s.$wrapper),s.notify("resetPosition"),s.el.css("paddingLeft",""),s.el.css("paddingRight",""),o.paddingLeft=parseFloat(s.el.css("paddingLeft")),o.paddingRight=parseFloat(s.el.css("paddingRight")),e.extend(o,s.el.offset()),o.borderTop="none"==s.el.css("border-top-style")?0:parseFloat(s.el.css("border-top-width")),o.borderLeft="none"==s.el.css("border-left-style")?0:parseFloat(s.el.css("border-left-width")),o.innerHeight=s.el.innerHeight(),o.innerWidth=s.el.innerWidth(),o.outerHeight=s.el.outerHeight(),o.componentsLeft=0,o.componentsRight=0,n=s.$wrapper.offset(),i={top:o.top-n.top,left:o.left-n.left},s.notify("fixPosition",i,o),o.componentsLeft>o.paddingLeft&&s.el.css("paddingLeft",o.componentsLeft+"px"),o.componentsRight>o.paddingRight&&s.el.css("paddingRight",o.componentsRight+"px"))},clearCache:function(){this.cachedResponse={},this.enrichmentCache={},this.badQueries=[]},clear:function(){var e=this,t=e.selection;e.isInitialized()&&(e.clearCache(),e.currentValue="",e.selection=null,e.hide(),e.suggestions=[],e.el.val(""),e.el.trigger("suggestions-clear"),e.notify("clear"),e.trigger("InvalidateSelection",t))},disable:function(){var e=this;e.disabled=!0,e.abortRequest(),e.visible&&e.hide()},enable:function(){this.disabled=!1},isUnavailable:function(){return this.disabled},update:function(){var e=this,t=e.el.val();e.isInitialized()&&(e.currentValue=t,e.isQueryRequestable(t)?e.updateSuggestions(t):e.hide())},setSuggestion:function(t){var n,i,s=this;e.isPlainObject(t)&&e.isPlainObject(t.data)&&(t=e.extend(!0,{},t),s.isUnavailable()&&s.initializer&&"pending"===s.initializer.state()&&(s.initializer.resolve(),s.enable()),s.bounds.own.length&&(s.checkValueBounds(t),n=s.copyDataComponents(t.data,s.bounds.all),t.data.kladr_id&&(n.kladr_id=s.getBoundedKladrId(t.data.kladr_id,s.bounds.all)),t.data=n),s.selection=t,s.suggestions=[t],i=s.getSuggestionValue(t)||"",s.currentValue=i,s.el.val(i),s.abortRequest(),s.el.trigger("suggestions-set"))},fixData:function(){var t=this,n=t.extendedCurrentValue(),i=t.el.val(),s=e.Deferred();s.done(function(e){t.selectSuggestion(e,0,i,{hasBeenEnriched:!0}),t.el.trigger("suggestions-fixdata",e)}).fail(function(){t.selection=null,t.el.trigger("suggestions-fixdata")}),t.isQueryRequestable(n)?(t.currentValue=n,t.getSuggestions(n,{count:1,from_bound:null,to_bound:null}).done(function(e){var t=e[0];t?s.resolve(t):s.reject()}).fail(function(){s.reject()})):s.reject()},extendedCurrentValue:function(){var t=this,n=t.getParentInstance(),i=n&&n.extendedCurrentValue(),s=e.trim(t.el.val());return T.compact([i,s]).join(" ")},getAjaxParams:function(t,n){var i=this,s=e.trim(i.options.token),o=e.trim(i.options.partner),r=i.options.serviceUrl,u=i.options.url,l=N[t],c=e.extend({timeout:i.options.timeout},l.defaultParams),d={};return u?r=u:(/\/$/.test(r)||(r+="/"),r+=t,l.addTypeInUrl&&(r+="/"+i.type.urlSuffix)),r=T.fixURLProtocol(r),e.support.cors?(s&&(d.Authorization="Token "+s),o&&(d["X-Partner"]=o),d["X-Version"]=a.version,c.headers||(c.headers={}),c.xhrFields||(c.xhrFields={}),e.extend(c.headers,i.options.headers,d),c.xhrFields.withCredentials=!1):(s&&(d.token=s),o&&(d.partner=o),d.version=a.version,r=T.addUrlParams(r,d)),c.url=r,e.extend(c,n)},isQueryRequestable:function(e){var t,n=this;return t=e.length>=n.options.minChars,t&&n.type.isQueryRequestable&&(t=n.type.isQueryRequestable.call(n,e)),t},constructRequestParams:function(t,n){var i=this,s=i.options,o=e.isFunction(s.params)?s.params.call(i.element,t):e.extend({},s.params);return i.type.constructRequestParams&&e.extend(o,i.type.constructRequestParams.call(i)),e.each(i.notify("requestParams"),function(t,n){e.extend(o,n)}),o[s.paramName]=t,e.isNumeric(s.count)&&s.count>0&&(o.count=s.count),e.extend(o,n)},updateSuggestions:function(e){var t=this;t.fetchPhase=t.getSuggestions(e).done(function(n){t.assignSuggestions(n,e)})},getSuggestions:function(t,n,i){var s,o=this,a=o.options,r=i&&i.noCallbacks,u=i&&i.useEnrichmentCache,l=i&&i.method||o.requestMode.method,c=o.constructRequestParams(t,n),d=e.param(c||{}),f=e.Deferred();return s=o.cachedResponse[d],s&&e.isArray(s.suggestions)?f.resolve(s.suggestions):o.isBadQuery(t)?f.reject():r||!1!==a.onSearchStart.call(o.element,c)?o.doGetSuggestions(c,l).done(function(e){o.processResponse(e)&&t==o.currentValue?(a.noCache||(u?o.enrichmentCache[t]=e.suggestions[0]:(o.enrichResponse(e,t),o.cachedResponse[d]=e,a.preventBadQueries&&0===e.suggestions.length&&o.badQueries.push(t))),f.resolve(e.suggestions)):f.reject(),r||a.onSearchComplete.call(o.element,t,e.suggestions)}).fail(function(e,n,i){f.reject(),r||"abort"===n||a.onSearchError.call(o.element,t,e,n,i)}):f.reject(),f},doGetSuggestions:function(t,n){var i=this,s=e.ajax(i.getAjaxParams(n,{data:T.serialize(t)}));return i.abortRequest(),i.currentRequest=s,i.notify("request"),s.always(function(){i.currentRequest=null,i.notify("request")}),s},isBadQuery:function(t){if(!this.options.preventBadQueries)return!1;var n=!1;return e.each(this.badQueries,function(e,i){return!(n=0===t.indexOf(i))}),n},abortRequest:function(){var e=this;e.currentRequest&&e.currentRequest.abort()},processResponse:function(t){var n,i=this;return!(!t||!e.isArray(t.suggestions))&&(i.verifySuggestionsFormat(t.suggestions),i.setUnrestrictedValues(t.suggestions),e.isFunction(i.options.onSuggestionsFetch)&&(n=i.options.onSuggestionsFetch.call(i.element,t.suggestions),e.isArray(n)&&(t.suggestions=n)),!0)},verifySuggestionsFormat:function(t){"string"==typeof t[0]&&e.each(t,function(e,n){t[e]={value:n,data:null}})},getSuggestionValue:function(t,n){var i,s=this,o=s.options.formatSelected||s.type.formatSelected,a=n&&n.hasSameValues,r=n&&n.hasBeenEnriched,u=null;return e.isFunction(o)&&(i=o.call(s,t)),"string"!=typeof i&&(i=t.value,s.type.getSuggestionValue&&null!==(u=s.type.getSuggestionValue(s,{suggestion:t,hasSameValues:a,hasBeenEnriched:r}))&&(i=u)),i},hasSameValues:function(t){var n=!1;return e.each(this.suggestions,function(e,i){if(i.value===t.value&&i!==t)return n=!0,!1}),n},assignSuggestions:function(e,t){var n=this;n.suggestions=e,n.notify("assignSuggestions",t)},shouldRestrictValues:function(){var e=this;return e.options.restrict_value&&e.constraints&&1==Object.keys(e.constraints).length},setUnrestrictedValues:function(t){var n=this,i=n.shouldRestrictValues(),s=n.getFirstConstraintLabel();e.each(t,function(e,t){t.unrestricted_value||(t.unrestricted_value=i?s+", "+t.value:t.value)})},areSuggestionsSame:function(e,t){return e&&t&&e.value===t.value&&T.areSame(e.data,t.data)},getNoSuggestionsHint:function(){var e=this;return!1!==e.options.noSuggestionsHint&&(e.options.noSuggestionsHint||e.type.noSuggestionsHint)}};var W={setupElement:function(){this.el.attr("autocomplete","off").attr("autocorrect","off").attr("autocapitalize","off").attr("spellcheck","false").addClass("suggestions-input").css("box-sizing","border-box")},bindElementEvents:function(){var t=this;t.el.on("keydown"+_,e.proxy(t.onElementKeyDown,t)),t.el.on(["keyup"+_,"cut"+_,"paste"+_,"input"+_].join(" "),e.proxy(t.onElementKeyUp,t)),t.el.on("blur"+_,e.proxy(t.onElementBlur,t)),t.el.on("focus"+_,e.proxy(t.onElementFocus,t))},unbindElementEvents:function(){this.el.off(_)},onElementBlur:function(){var e=this;if(e.cancelBlur)return void(e.cancelBlur=!1);e.options.triggerSelectOnBlur?e.isUnavailable()||e.selectCurrentValue({noSpace:!0}).always(function(){e.hide()}):e.hide(),e.fetchPhase.abort&&e.fetchPhase.abort()},onElementFocus:function(){var t=this;t.cancelFocus||T.delay(e.proxy(t.completeOnFocus,t)),t.cancelFocus=!1},onElementKeyDown:function(e){var t=this;if(!t.isUnavailable())if(t.visible){switch(e.which){case v.ESC:t.el.val(t.currentValue),t.hide(),t.abortRequest();break;case v.TAB:if(!1===t.options.tabDisabled)return;break;case v.ENTER:t.options.triggerSelectOnEnter&&t.selectCurrentValue();break;case v.SPACE:return void(t.options.triggerSelectOnSpace&&t.isCursorAtEnd()&&(e.preventDefault(),t.selectCurrentValue({continueSelecting:!0,dontEnrich:!0}).fail(function(){t.currentValue+=" ",t.el.val(t.currentValue),t.proceedChangedValue()})));case v.UP:t.moveUp();break;case v.DOWN:t.moveDown();break;default:return}e.stopImmediatePropagation(),e.preventDefault()}else switch(e.which){case v.DOWN:t.suggest();break;case v.ENTER:t.options.triggerSelectOnEnter&&t.triggerOnSelectNothing()}},onElementKeyUp:function(e){var t=this;if(!t.isUnavailable()){switch(e.which){case v.UP:case v.DOWN:case v.ENTER:return}clearTimeout(t.onChangeTimeout),t.inputPhase.reject(),t.currentValue!==t.el.val()&&t.proceedChangedValue()}},proceedChangedValue:function(){var t=this;t.abortRequest(),t.inputPhase=e.Deferred().done(e.proxy(t.onValueChange,t)),t.options.deferRequestBy>0?t.onChangeTimeout=T.delay(function(){t.inputPhase.resolve()},t.options.deferRequestBy):t.inputPhase.resolve()},onValueChange:function(){var e,t=this;t.selection&&(e=t.selection,t.selection=null,t.trigger("InvalidateSelection",e)),t.selectedIndex=-1,t.update(),t.notify("valueChange")},completeOnFocus:function(){var e=this;e.isUnavailable()||e.isElementFocused()&&(e.fixPosition(),e.update(),e.isMobile&&(e.setCursorAtEnd(),e.scrollToTop()))},isElementFocused:function(){return document.activeElement===this.element},isElementDisabled:function(){
return Boolean(this.element.getAttribute("disabled")||this.element.getAttribute("readonly"))},isCursorAtEnd:function(){var e,t,n=this,i=n.el.val().length;try{if("number"==typeof(e=n.element.selectionStart))return e===i}catch(e){}return!document.selection||(t=document.selection.createRange(),t.moveStart("character",-i),i===t.text.length)},setCursorAtEnd:function(){var e=this.element;try{e.selectionEnd=e.selectionStart=e.value.length,e.scrollLeft=e.scrollWidth}catch(t){e.value=e.value}}};e.extend(a.prototype,W),M.on("initialize",W.bindElementEvents).on("dispose",W.unbindElementEvents);var H={};r();var Q={checkStatus:function(){function e(e){T.isFunction(t.options.onSearchError)&&t.options.onSearchError.call(t.element,null,s,"error",e)}var t=this,n=t.options.token&&t.options.token.trim()||"",i=t.options.type+n,s=H[i];s||(s=H[i]=E.ajax(t.getAjaxParams("status"))),s.done(function(n){n.search?E.extend(t.status,n):e("Service Unavailable")}).fail(function(){e(s.statusText)})}};a.resetTokens=r,E.extend(a.prototype,Q),M.on("setOptions",Q.checkStatus);var K,G=!0,J={checkLocation:function(){var t=this,n=t.options.geoLocation;t.type.geoEnabled&&n&&(t.geoLocation=e.Deferred(),e.isPlainObject(n)||e.isArray(n)?t.geoLocation.resolve(n):(K||(K=e.ajax(t.getAjaxParams("detectAddressByIp"))),K.done(function(e){var n=e&&e.location&&e.location.data;n&&n.kladr_id?t.geoLocation.resolve(n):t.geoLocation.reject()}).fail(function(){t.geoLocation.reject()})))},getGeoLocation:function(){return this.geoLocation},constructParams:function(){var t=this,n={};return t.geoLocation&&e.isFunction(t.geoLocation.promise)&&"resolved"==t.geoLocation.state()&&t.geoLocation.done(function(t){n.locations_boost=e.makeArray(t)}),n}};"GET"!=T.getDefaultType()&&(e.extend(j,{geoLocation:G}),e.extend(a,{resetLocation:u}),e.extend(a.prototype,{getGeoLocation:J.getGeoLocation}),M.on("setOptions",J.checkLocation).on("requestParams",J.constructParams));var X={enrichSuggestion:function(t,n){var i=this,s=e.Deferred();if(!i.options.enrichmentEnabled||!i.type.enrichmentEnabled||!i.requestMode.enrichmentEnabled||n&&n.dontEnrich)return s.resolve(t);if(t.data&&null!=t.data.qc)return s.resolve(t);i.disableDropdown();var o=i.type.getEnrichmentQuery(t),a=i.type.enrichmentParams,r={noCallbacks:!0,useEnrichmentCache:!0,method:i.type.enrichmentMethod};return i.currentValue=o,i.enrichPhase=i.getSuggestions(o,a,r).always(function(){i.enableDropdown()}).done(function(e){var n=e&&e[0];s.resolve(n||t,!!n)}).fail(function(){s.resolve(t)}),s},enrichResponse:function(t,n){var i=this,s=i.enrichmentCache[n];s&&e.each(t.suggestions,function(e,i){if(i.value===n)return t.suggestions[e]=s,!1})}};e.extend(a.prototype,X);var Y={width:"auto",floating:!1},Z={createContainer:function(){var t=this,n="."+t.classes.suggestion,i=t.options,s=e("<div/>").addClass(i.containerClass).css({position:"absolute",display:"none"});t.$container=s,s.on("click"+_,n,e.proxy(t.onSuggestionClick,t))},getContainer:function(){return this.$container.get(0)},removeContainer:function(){var e=this;e.options.floating&&e.$container.remove()},setContainerOptions:function(){var t=this;t.$container.off("mousedown.suggestions"),t.options.floating&&t.$container.on("mousedown.suggestions",e.proxy(t.onMousedown,t))},onSuggestionClick:function(t){var n,i=this,s=e(t.target);if(!i.dropdownDisabled){for(i.cancelFocus=!0,i.el.focus();s.length&&!(n=s.attr("data-index"));)s=s.closest("."+i.classes.suggestion);n&&!isNaN(n)&&i.select(+n)}},setDropdownPosition:function(e,t){var n,i=this,s=i.$viewport.scrollLeft();i.isMobile?(n=i.options.floating?{left:s+"px",top:t.top+t.outerHeight+"px"}:{left:e.left-t.left+s+"px",top:e.top+t.outerHeight+"px"},n.width=i.$viewport.width()+"px"):(n=i.options.floating?{left:t.left+"px",top:t.top+t.borderTop+t.innerHeight+"px"}:{left:e.left+"px",top:e.top+t.borderTop+t.innerHeight+"px"},T.delay(function(){var e=i.options.width;"auto"===e&&(e=i.el.outerWidth()),i.$container.outerWidth(e)})),i.$container.toggleClass(i.classes.mobile,i.isMobile).css(n),i.containerItemsPadding=t.left+t.borderLeft+t.paddingLeft-s},setItemsPositions:function(){var e=this;e.getSuggestionsItems().css("paddingLeft",e.isMobile?e.containerItemsPadding+"px":"")},getSuggestionsItems:function(){return this.$container.children("."+this.classes.suggestion)},toggleDropdownEnabling:function(e){this.dropdownDisabled=!e,this.$container.attr("disabled",!e)},disableDropdown:function(){this.toggleDropdownEnabling(!1)},enableDropdown:function(){this.toggleDropdownEnabling(!0)},hasSuggestionsToChoose:function(){var t=this;return t.suggestions.length>1||1===t.suggestions.length&&(!t.selection||e.trim(t.suggestions[0].value)!==e.trim(t.selection.value))},suggest:function(){var t=this,n=t.options,i=[];if(t.requestMode.userSelect){if(t.hasSuggestionsToChoose())!t.isMobile&&n.hint&&t.suggestions.length&&i.push('<div class="'+t.classes.hint+'">'+n.hint+"</div>"),t.selectedIndex=-1,t.suggestions.forEach(function(e,n){e==t.selection&&(t.selectedIndex=n),t.buildSuggestionHtml(e,n,i)});else{if(t.suggestions.length)return void t.hide();var s=t.getNoSuggestionsHint();if(!s)return void t.hide();i.push('<div class="'+t.classes.hint+'">'+s+"</div>")}i.push('<div class="'+b.promo+'"></div>'),i.push("</div>"),t.$container.html(i.join("")),n.autoSelectFirst&&-1===t.selectedIndex&&(t.selectedIndex=0),-1!==t.selectedIndex&&t.getSuggestionsItems().eq(t.selectedIndex).addClass(t.classes.selected),e.isFunction(n.beforeRender)&&n.beforeRender.call(t.element,t.$container),t.$container.show(),t.visible=!0,t.fixPosition(),t.setItemsPositions()}},buildSuggestionHtml:function(e,t,n){n.push('<div class="'+this.classes.suggestion+'" data-index="'+t+'">');var i=this.options.formatResult||this.type.formatResult||this.formatResult;n.push(i.call(this,e.value,this.currentValue,e,{unformattableTokens:this.type.unformattableTokens}));var s=this.makeSuggestionLabel(this.suggestions,e);s&&n.push('<span class="'+this.classes.subtext_label+'">'+T.escapeHtml(s)+"</span>"),n.push("</div>")},wrapFormattedValue:function(e,t){var n=this,i=T.getDeepValue(t.data,"state.status");return'<span class="'+n.classes.value+'"'+(i?' data-suggestion-status="'+i+'"':"")+">"+e+"</span>"},formatResult:function(e,t,n,i){var s=this;return e=s.highlightMatches(e,t,n,i),s.wrapFormattedValue(e,n)},highlightMatches:function(t,n,i,s){var o,a,r,u,d,f,p,g=this,h=[],m=s&&s.unformattableTokens,y=s&&s.maxLength,v=T.reWordExtractor();if(!t)return"";for(o=C.tokenize(n,m),a=e.map(o,function(e){return new RegExp("^((.*)([\\-\\+\\\\\\?!@#$%^&]+))?("+T.escapeRegExChars(e)+")([^\\-\\+\\\\\\?!@#$%^&]*[\\-\\+\\\\\\?!@#$%^&]*)","i")});(r=v.exec(t))&&r[0];)u=r[1],h.push({text:u,hasUpperCase:u.toLowerCase()!==u,formatted:T.formatToken(u),matchable:!0}),r[2]&&h.push({text:r[2]});for(d=0;d<h.length;d++)f=h[d],!f.matchable||f.matched||-1!==e.inArray(f.formatted,m)&&!f.hasUpperCase||e.each(a,function(e,t){var n,i=t.exec(f.formatted),s=d+1;if(i)return i={before:i[1]||"",beforeText:i[2]||"",beforeDelimiter:i[3]||"",text:i[4]||"",after:i[5]||""},i.before&&(h.splice(d,0,{text:f.text.substr(0,i.beforeText.length),formatted:i.beforeText,matchable:!0},{text:i.beforeDelimiter}),s+=2,n=i.before.length,f.text=f.text.substr(n),f.formatted=f.formatted.substr(n),d--),n=i.text.length+i.after.length,f.formatted.length>n&&(h.splice(s,0,{text:f.text.substr(n),formatted:f.formatted.substr(n),matchable:!0}),f.text=f.text.substr(0,n),f.formatted=f.formatted.substr(0,n)),i.after&&(n=i.text.length,h.splice(s,0,{text:f.text.substr(n),formatted:f.formatted.substr(n)}),f.text=f.text.substr(0,n),f.formatted=f.formatted.substr(0,n)),f.matched=!0,!1});if(y){for(d=0;d<h.length&&y>=0;d++)f=h[d],(y-=f.text.length)<0&&(f.text=f.text.substr(0,f.text.length+y)+"...");h.length=d}return p=l(h),c(p,g.classes.nowrap)},makeSuggestionLabel:function(t,n){var i,s,o=this,a=o.type.fieldNames,r={},u=T.reWordExtractor(),l=[];if(a&&d(t,n)&&n.data&&(e.each(a,function(e){var t=n.data[e];t&&(r[e]=T.formatToken(t))}),!e.isEmptyObject(r))){for(;(i=u.exec(T.formatToken(n.value)))&&(s=i[1]);)e.each(r,function(e,t){if(t==s)return l.push(a[e]),delete r[e],!1});if(l.length)return l.join(", ")}},hide:function(){var e=this;e.visible=!1,e.selectedIndex=-1,e.$container.hide().empty()},activate:function(e){var t,n,i=this,s=i.classes.selected;return!i.dropdownDisabled&&(n=i.getSuggestionsItems(),n.removeClass(s),i.selectedIndex=e,-1!==i.selectedIndex&&n.length>i.selectedIndex)?(t=n.eq(i.selectedIndex),t.addClass(s),t):null},deactivate:function(e){var t=this;t.dropdownDisabled||(t.selectedIndex=-1,t.getSuggestionsItems().removeClass(t.classes.selected),e&&t.el.val(t.currentValue))},moveUp:function(){var e=this;if(!e.dropdownDisabled)return-1===e.selectedIndex?void(e.suggestions.length&&e.adjustScroll(e.suggestions.length-1)):0===e.selectedIndex?void e.deactivate(!0):void e.adjustScroll(e.selectedIndex-1)},moveDown:function(){var e=this;if(!e.dropdownDisabled)return e.selectedIndex===e.suggestions.length-1?void e.deactivate(!0):void e.adjustScroll(e.selectedIndex+1)},adjustScroll:function(e){var t,n,i,s=this,o=s.activate(e),a=s.$container.scrollTop();o&&o.length&&(t=o.position().top,t<0?s.$container.scrollTop(a+t):(n=t+o.outerHeight(),i=s.$container.innerHeight(),n>i&&s.$container.scrollTop(a-i+n)),s.el.val(s.suggestions[e].value))}};e.extend(j,Y),e.extend(a.prototype,Z),M.on("initialize",Z.createContainer).on("dispose",Z.removeContainer).on("setOptions",Z.setContainerOptions).on("fixPosition",Z.setDropdownPosition).on("fixPosition",Z.setItemsPositions).on("assignSuggestions",Z.suggest);var ee={addon:null},te={NONE:"none",SPINNER:"spinner",CLEAR:"clear"},ne=function(e){var t=E.select('<span class="suggestions-addon"/>');this.owner=e,this.$el=t,this.type=te.NONE,this.visible=!1,this.initialPadding=null,t.on("click",E.proxy(this,"onClick"))};ne.prototype={checkType:function(){var e=this.owner.options.addon,t=!1;h.each(te,function(n,i){if(t=n==e)return!1}),t||(e=this.owner.isMobile?te.CLEAR:te.SPINNER),e!=this.type&&(this.type=e,this.$el.attr("data-addon-type",e),this.toggle(!0))},isEnabled:function(){return!this.owner.isElementDisabled()},toggle:function(e){var t;switch(this.type){case te.CLEAR:t=!!this.owner.currentValue;break;case te.SPINNER:t=!!this.owner.currentRequest;break;default:t=!1}this.isEnabled()||(t=!1),t!=this.visible&&(this.visible=t,t?this.show(e):this.hide(e))},show:function(e){var t=this,n={opacity:1};e?(this.$el.show().css(n),this.showBackground(!0)):this.$el.stop(!0,!0).delay(50).queue(function(){t.$el.show(),t.showBackground(),t.$el.dequeue()}).animate(n,"fast")},hide:function(e){var t=this,n={opacity:0};e&&this.$el.hide().css(n),this.$el.stop(!0).animate(n,{duration:"fast",complete:function(){t.$el.hide(),t.hideBackground()}})},fixPosition:function(e,t){var n=t.innerHeight;this.checkType(),this.$el.css({left:e.left+t.borderLeft+t.innerWidth-n+"px",top:e.top+t.borderTop+"px",height:n,width:n}),this.initialPadding=t.paddingRight,this.width=n,this.visible&&(t.componentsRight+=n)},showBackground:function(e){var t=this.owner.el,n={paddingRight:this.width};this.width>this.initialPadding&&(this.stopBackground(),e?t.css(n):t.animate(n,{duration:"fast",queue:"addon"}).dequeue("addon"))},hideBackground:function(e){var t=this.owner.el,n={paddingRight:this.initialPadding};this.width>this.initialPadding&&(this.stopBackground(!0),e?t.css(n):t.delay(1e3,"addon").animate(n,{duration:"fast",queue:"addon"}).dequeue("addon"))},stopBackground:function(e){this.owner.el.stop("addon",!0,e)},onClick:function(e){this.isEnabled()&&this.type==te.CLEAR&&this.owner.clear()}};var ie={createAddon:function(){var e=new ne(this);this.$wrapper.append(e.$el),this.addon=e},fixAddonPosition:function(e,t){this.addon.fixPosition(e,t)},checkAddonType:function(){this.addon.checkType()},checkAddonVisibility:function(){this.addon.toggle()},stopBackground:function(){this.addon.stopBackground()}};E.extend(j,ee),M.on("initialize",ie.createAddon).on("setOptions",ie.checkAddonType).on("fixPosition",ie.fixAddonPosition).on("clear",ie.checkAddonVisibility).on("valueChange",ie.checkAddonVisibility).on("request",ie.checkAddonVisibility).on("resetPosition",ie.stopBackground);var se={constraints:null,restrict_value:!1},oe=["region_fias_id","area_fias_id","city_fias_id","city_district_fias_id","settlement_fias_id","street_fias_id"],ae=function(e,t){var n,i,s=this,o={};s.instance=t,s.fields={},s.specificity=-1,g.isPlainObject(e)&&t.type.dataComponents&&h.each(t.type.dataComponents,function(t,n){var i=t.id;t.forLocations&&e[i]&&(s.fields[i]=e[i],s.specificity=n)}),n=Object.keys(s.fields),i=h.intersect(n,oe),i.length?(h.each(i,function(e,t){o[e]=s.fields[e]}),s.fields=o,s.specificity=s.getFiasSpecificity(i)):s.fields.kladr_id&&(s.fields={kladr_id:s.fields.kladr_id},s.significantKladr=p(s.fields.kladr_id),s.specificity=s.getKladrSpecificity(s.significantKladr))};E.extend(ae.prototype,{getLabel:function(){return this.instance.type.composeValue(this.fields,{saveCityDistrict:!0})},getFields:function(){return this.fields},isValid:function(){return!g.isEmptyObject(this.fields)},getKladrSpecificity:function(e){var t=-1,n=e.length;return h.each(this.instance.type.dataComponents,function(e,i){e.kladrFormat&&n===e.kladrFormat.digits&&(t=i)}),t},getFiasSpecificity:function(e){var t=-1;return h.each(this.instance.type.dataComponents,function(n,i){n.fiasType&&e.indexOf(n.fiasType)>-1&&t<i&&(t=i)}),t},containsData:function(e){var t=!0;return this.fields.kladr_id?!!e.kladr_id&&0===e.kladr_id.indexOf(this.significantKladr):(h.each(this.fields,function(n,i){return t=!!e[i]&&e[i].toLowerCase()===n.toLowerCase()}),t)}}),a.ConstraintLocation=ae;var re=function(e,t){this.id=P("c"),this.deletable=!!e.deletable,this.instance=t;var n=h.makeArray(e&&(e.locations||e.restrictions));this.locations=n.map(function(e){return new ae(e,t)}),this.locations=this.locations.filter(function(e){return e.isValid()}),this.label=e.label,null==this.label&&t.type.composeValue&&(this.label=this.locations.map(function(e){return e.getLabel()}).join(", ")),this.label&&this.isValid()&&(this.$el=E.select(document.createElement("li")).append(E.select(document.createElement("span")).text(this.label)).attr("data-constraint-id",this.id),this.deletable&&this.$el.append(E.select(document.createElement("span")).addClass(t.classes.removeConstraint)))};E.extend(re.prototype,{isValid:function(){return this.locations.length>0},getFields:function(){return this.locations.map(function(e){return e.getFields()})}});var ue={createConstraints:function(){var e=this;e.constraints={},e.$constraints=E.select('<ul class="suggestions-constraints"/>'),e.$wrapper.append(e.$constraints),e.$constraints.on("click","."+e.classes.removeConstraint,E.proxy(e.onConstraintRemoveClick,e))},setConstraintsPosition:function(e,t){var n=this;n.$constraints.css({left:e.left+t.borderLeft+t.paddingLeft+"px",top:e.top+t.borderTop+Math.round((t.innerHeight-n.$constraints.height())/2)+"px"}),t.componentsLeft+=n.$constraints.outerWidth(!0)+t.paddingLeft},onConstraintRemoveClick:function(e){var t=this,n=E.select(e.target).closest("li"),i=n.attr("data-constraint-id");delete t.constraints[i],t.update(),n.fadeOut("fast",function(){t.removeConstraint(i)})},setupConstraints:function(){var e,t=this,n=t.options.constraints;if(!n)return void t.unbindFromParent();E.isJqObject(n)||"string"==typeof n||"number"==typeof n.nodeType?(e=E.select(n),e.is(t.constraints)||(t.unbindFromParent(),e.is(t.el)||(t.constraints=e,t.bindToParent()))):(t._constraintsUpdating=!0,h.each(t.constraints,function(e,n){t.removeConstraint(n)}),h.each(h.makeArray(n),function(e,n){t.addConstraint(e)}),t._constraintsUpdating=!1,t.fixPosition())},filteredLocation:function(e){var t=[],n={};if(h.each(this.type.dataComponents,function(){this.forLocations&&t.push(this.id)}),g.isPlainObject(e)&&h.each(e,function(e,i){e&&t.indexOf(i)>=0&&(n[i]=e)}),!g.isEmptyObject(n))return n.kladr_id?{kladr_id:n.kladr_id}:n},addConstraint:function(e){var t=this;e=new re(e,t),e.isValid()&&(t.constraints[e.id]=e,e.$el&&(t.$constraints.append(e.$el),t._constraintsUpdating||t.fixPosition()))},removeConstraint:function(e){var t=this;delete t.constraints[e],t.$constraints.children('[data-constraint-id="'+e+'"]').remove(),t._constraintsUpdating||t.fixPosition()},constructConstraintsParams:function(){for(var e,t,n=this,i=[],s=n.constraints,o={};E.isJqObject(s)&&(e=s.suggestions())&&!(t=y.getDeepValue(e,"selection.data"));)s=e.constraints;return E.isJqObject(s)?(t=new ae(t,e).getFields())&&(n.bounds.own.indexOf("city")>-1&&delete t.city_fias_id,o.locations=[t],o.restrict_value=!0):s&&(h.each(s,function(e,t){i=i.concat(e.getFields())}),i.length&&(o.locations=i,o.restrict_value=n.options.restrict_value)),o},getFirstConstraintLabel:function(){var e=this,t=g.isPlainObject(e.constraints)&&Object.keys(e.constraints)[0];return t?e.constraints[t].label:""},bindToParent:function(){var e=this;e.constraints.on(["suggestions-select."+e.uniqueId,"suggestions-invalidateselection."+e.uniqueId,"suggestions-clear."+e.uniqueId].join(" "),E.proxy(e.onParentSelectionChanged,e)).on("suggestions-dispose."+e.uniqueId,E.proxy(e.onParentDispose,e))},unbindFromParent:function(){var e=this,t=e.constraints;E.isJqObject(t)&&t.off("."+e.uniqueId)},onParentSelectionChanged:function(e,t,n){("suggestions-select"!==e.type||n)&&this.clear()},onParentDispose:function(e){this.unbindFromParent()},getParentInstance:function(){return E.isJqObject(this.constraints)&&this.constraints.suggestions()},shareWithParent:function(e){var t=this.getParentInstance();t&&t.type===this.type&&!f(e,t)&&(t.shareWithParent(e),t.setSuggestion(e))},getUnrestrictedData:function(e){var t=this,n=[],i={},s=-1;return h.each(t.constraints,function(t,n){h.each(t.locations,function(t,n){t.containsData(e)&&t.specificity>s&&(s=t.specificity)})}),s>=0?(e.region_kladr_id&&e.region_kladr_id===e.city_kladr_id&&n.push.apply(n,t.type.dataComponentsById.city.fields),h.each(t.type.dataComponents.slice(0,s+1),function(e,t){n.push.apply(n,e.fields)}),h.each(e,function(e,t){-1===n.indexOf(t)&&(i[t]=e)})):i=e,i}};E.extend(j,se),E.extend(a.prototype,ue),"GET"!=k.getDefaultType()&&M.on("initialize",ue.createConstraints).on("setOptions",ue.setupConstraints).on("fixPosition",ue.setConstraintsPosition).on("requestParams",ue.constructConstraintsParams).on("dispose",ue.unbindFromParent);var le={proceedQuery:function(e){var t=this;e.length>=t.options.minChars?t.updateSuggestions(e):t.hide()},selectCurrentValue:function(e){var t=this,n=E.Deferred();return t.inputPhase.resolve(),t.fetchPhase.done(function(){var i;t.selection&&!t.visible?n.reject():(i=t.findSuggestionIndex(),t.select(i,e),-1===i?n.reject():n.resolve(i))}).fail(function(){n.reject()}),n},selectFoundSuggestion:function(){var e=this;e.requestMode.userSelect||e.select(0)},findSuggestionIndex:function(){var e,t=this,n=t.selectedIndex;return-1===n&&(e=t.el.val().trim())&&t.type.matchers.some(function(i){return-1!==(n=i(e,t.suggestions))}),n},select:function(e,t){var n,i=this,s=i.suggestions[e],o=t&&t.continueSelecting,a=i.currentValue;if(!i.triggering.Select){if(!s)return o||i.selection||i.triggerOnSelectNothing(),void i.onSelectComplete(o);n=i.hasSameValues(s),i.enrichSuggestion(s,t).done(function(s,o){var r=E.extend({hasBeenEnriched:o,hasSameValues:n},t);i.selectSuggestion(s,e,a,r)})}},selectSuggestion:function(e,t,n,i){var s=this,o=i.continueSelecting,a=!s.type.isDataComplete||s.type.isDataComplete.call(s,e),r=s.selection;s.triggering.Select||(s.type.alwaysContinueSelecting&&(o=!0),a&&(o=!1),i.hasBeenEnriched&&s.suggestions[t]&&(s.suggestions[t].data=e.data),s.requestMode.updateValue&&(s.checkValueBounds(e),s.currentValue=s.getSuggestionValue(e,i),!s.currentValue||i.noSpace||a||(s.currentValue+=" "),s.el.val(s.currentValue)),s.currentValue?(s.selection=e,s.areSuggestionsSame(e,r)||s.trigger("Select",e,s.currentValue!=n),s.requestMode.userSelect&&s.onSelectComplete(o)):(s.selection=null,s.triggerOnSelectNothing()),s.shareWithParent(e))},onSelectComplete:function(e){var t=this;e?(t.selectedIndex=-1,t.updateSuggestions(t.currentValue)):t.hide()},triggerOnSelectNothing:function(){var e=this;e.triggering.SelectNothing||e.trigger("SelectNothing",e.currentValue)},trigger:function(e){var t=this,n=T.slice(arguments,1),i=t.options["on"+e];t.triggering[e]=!0,T.isFunction(i)&&i.apply(t.element,n),t.el.trigger.call(t.el,"suggestions-"+e.toLowerCase(),n),t.triggering[e]=!1}};E.extend(a.prototype,le),M.on("assignSuggestions",le.selectFoundSuggestion);var ce={bounds:null},de={setupBounds:function(){this.bounds={from:null,to:null}},setBoundsOptions:function(){var t,n,i=this,s=[],o=e.trim(i.options.bounds).split("-"),a=o[0],r=o[o.length-1],u=[],l=[];i.type.dataComponents&&e.each(i.type.dataComponents,function(){this.forBounds&&s.push(this.id)}),-1===e.inArray(a,s)&&(a=null),n=e.inArray(r,s),-1!==n&&n!==s.length-1||(r=null),(a||r)&&(t=!a,e.each(s,function(e,n){if(n==a&&(t=!0),l.push(n),t&&u.push(n),n==r)return!1})),i.bounds.from=a,i.bounds.to=r,i.bounds.all=l,i.bounds.own=u},constructBoundsParams:function(){var e=this,t={};return e.bounds.from&&(t.from_bound={value:e.bounds.from}),e.bounds.to&&(t.to_bound={value:e.bounds.to}),t},checkValueBounds:function(e){var t,n=this;if(n.bounds.own.length&&n.type.composeValue){var i=n.bounds.own.slice(0);1===i.length&&"city_district"===i[0]&&i.push("city_district_fias_id"),t=n.copyDataComponents(e.data,i),e.value=n.type.composeValue(t)}},copyDataComponents:function(t,n){var i={},s=this.type.dataComponentsById;return s&&e.each(n,function(n,o){e.each(s[o].fields,function(e,n){null!=t[n]&&(i[n]=t[n])})}),i},getBoundedKladrId:function(t,n){var i,s=n[n.length-1];return e.each(this.type.dataComponents,function(e,t){if(t.id===s)return i=t.kladrFormat,!1}),t.substr(0,i.digits)+new Array((i.zeros||0)+1).join("0")}};e.extend(j,ce),e.extend(a.prototype,de),M.on("initialize",de.setupBounds).on("setOptions",de.setBoundsOptions).on("requestParams",de.constructBoundsParams),a.defaultOptions=j,a.version="18.3.3",e.Suggestions=a,e.fn.suggestions=function(t,n){return 0===arguments.length?this.first().data("suggestions"):this.each(function(){var i=e(this),s=i.data("suggestions");"string"==typeof t?s&&"function"==typeof s[t]&&s[t](n):(s&&s.dispose&&s.dispose(),s=new a(this,t),i.data("suggestions",s))})}});


/******** /js/datepicker.js **************/

/*
xCal datepicker version 1.8
Alex Fadeev elderfadeev(a)gmail.com
Free to use under mit licence
http://cssworld.ru/datepicker/
*/
;(function() {
var lang = { // lang[a.lang].x
	"en": {
x: "Close", nex: "Next month", pre: "Previous month", clear: "Clear",
m: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],
mo: ["January","February","March","April","May","June","July","August","September","October","November","December"],
w: "Mo</td><td>Tu</td><td>We</td><td>Th</td><td>Fr</td><td>Sa</td><td>Su"
	},
	"ru": {
x: "Закрыть", nex: "Следующий месяц", pre: "Предыдущий месяц", clear: "Очистить",
m: ["Янв","Фев","Мрт","Апр","Май","Июн","Июл","Авг","Сен","Окт","Нбр","Дек"],
mo: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],
w: "Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td>Сб</td><td>Вс"
	}
}
var def = {
	lang: "ru", // en/ru
	id: "",
	"class": "xcalend",
	delim: ".",
	order: 0, // 0/1/2
	o: {value: ""},
	year: -1, month: -1, dat: -1, day: -1, dop: "",
	autoOn: 1, autoOff: 1, now:1, set0: 0, x: 1, hide: 1, to: "", fn: ""
}
function iss(n){if(typeof n==="undefined" || n===null)return false;return true}
function Nod(n){if(typeof n=='string') n=document.getElementById(n);return n}
function Del(n){n=Nod(n); if(!n)return; if(typeof(n.remove)=="function") n.remove(); else n.parentNode.removeChild(n)}
function HTM(n,h,b){if(!iss(b))b="beforeend"; Nod(n).insertAdjacentHTML(b,h)}
function Eve(e,evTyp,fn) {
if(e.addEventListener) e.addEventListener(evTyp,fn,false)
else if(e.attachEvent) e.attachEvent('on'+evTyp,fn)
else e['on'+evTyp]=fn
}
function scrol(y) {
	var a={'X': 'scrollLeft', 'Y': 'scrollTop'}
	if(typeof y==="undefined" || !(y in a)) y='Y';
	return (window['page'+y+'Offset'] || document.documentElement[a[y]] || document.body[a[y]]);
}

window.xCal = function(ob, delim, order) { // xCal(this,'-',1) // xCal() == close
var a={};
for(var key in def) a[key] = def[key];
if(typeof delim==="object") {
	for(var key in delim) a[key] = delim[key];
} else {
	if(iss(delim)) a.delim = delim;
	if(iss(order)) a.order = order;
}
if(a.id==="") a.id = a['class'];

if(typeof ob!=="object") {
	if((typeof ob==="undefined" || ob==0 || ob==1) && Nod(a.id)) { // Close
		if(a.hide==1) {
/*			if(typeof delim!=="string") Nod(a.id).style.display="none";
			else Nod(delim).style.display="none";
*/
		}
		return false;
	}
	if(ob==2 || ob==="now") { // Return Now
		var D = new Date(), d = D.getDate(), m = D.getMonth()+1, y = D.getFullYear();
		if(d<10) d = "0"+d;
		if(m<10) m = "0"+m;
		if(a.order==1) return y+a.delim+m+a.delim+d;
		if(a.order==2) return m+a.delim+d+a.delim+y;
		else return d+a.delim+m+a.delim+y;
	}
}
a.o = Nod(ob);
a.f = function() {
	var m = a.month+1, d = a.dat, y = a.year;
	a.sdat = a.dat; a.smonth = a.month; a.syear = a.year;
	if(a.order==1) {d = y; y = a.dat}
	else if(a.order==2) {d = m; m = a.dat}
	if(y<10) y="0"+y;
	if(m<10) m="0"+m;
	if(d<10) d="0"+d;
	d += a.delim+m+a.delim+y;
	if(a.dop!=="") d += " "+a.dop;
	if(a.o) a.o.value = xCal.value = d;
	if(a.hide==1) Nod(a.id).style.display="none";
	if(typeof a.fn==="function") a.fn(d, a);
	else if(typeof a.fn==="string" && a.fn!=="") eval(a.fn+"('"+d+"');");
}

if(typeof a.o==="undefined") return false;
a=xCal.gVal(a);
a=xCal.gDat(a);


if(!Nod(a.id)) {
	if(a.to=="") a.to=document.body; else a.to=Nod(a.to);
	HTM(a.to, '<table id="'+a.id+'" class="'+a['class']+'"><thead></thead><tbody></tbody><tfoot></tfoot></table>');
} else Nod(a.id).style.display="";

var oo = a.o.getBoundingClientRect();

Nod(a.id).style.left=(oo.left+scrol('X')-250)+"px";
if (a.o.classList.contains("-std")) Nod(a.id).style.left = parseInt(Nod(a.id).style.left)+250+"px";
Nod(a.id).style.width = "250px";
if ($(a.o).hasClass("btm")) {
    Nod(a.id).style.top=oo.bottom+scrol()-300+"px";
} else {
    Nod(a.id).style.top=oo.bottom+scrol()+"px";
}

xCal.fM = function(a) {
var m=a.month, ca='', j=1,
months=lang[a.lang].m;
ca += '<td colspan=2 title="12"';
if(m==11) ca += ' class="today"';
else if(a.tmonth==(11)) ca += ' class="tday"';
ca += '>'+lang[a.lang].m[11]+'</td>';
for(var i=0; i<(months.length-1); i++) {
	j++;
	ca += '<td colspan=2 title="'+(i+1)+'"';
	if(m==i) ca += ' class="today"';
	else if(a.tmonth==(i)) ca += ' class="tday"';
	ca += '>'+months[i]+"</td>";
	if(j>2) {ca += '</tr><tr>'; j=0}
}
Del(document.querySelector("#"+a.id+" tbody"));
HTM(a.id, '<tbody><tr><th rowspan=4 valign=bottom><a href="http://cssworld.ru/datepicker/" target="_blank">?</a></th>'+ca+'</tr></tbody>');
var k = document.querySelectorAll("#"+a.id+" tbody td");
for(var i=0; i<k.length; i++) {
	k[i].onclick = function() {
		var t = this.title;
		if(t=='') return;
		a.month=parseInt(t)-1;
		xCal.f(a);
	}
}
}

xCal.fY = function(a) {
var y=a.year%100, ca='', j=0;
y+=(y<80?2000:1900);
for(var i=-8; i<7; i++) {
	j++;
	ca += '<td colspan=2';
	if(y==(y+i)) ca += ' class="today"';
	else if(a.tyear==(y+i)) ca += ' class="tday"';
	ca += '>'+(y+i)+"</td>";
	if(j>2) {ca += '</tr><tr>'; j=0}
}
Del(document.querySelector("#"+a.id+" tbody"));
HTM(a.id, '<tbody><tr><th rowspan=5 valign=bottom><a href="http://cssworld.ru/datepicker/" target="_blank">?</a></th>'+ca+'</tr></tbody>');
var k = document.querySelectorAll("#"+a.id+" tbody td");
for(var i=0; i<k.length; i++) {
	k[i].onclick = function() {
		var t = this.innerHTML;
		if(t=='' || t=="&nbsp;") return;
		a.year=parseInt(t);
		xCal.f(a);
	}
}
}

xCal.f = function(a) {
Del(document.querySelector("#"+a.id+" thead"));
Del(document.querySelector("#"+a.id+" tbody"));
Del(document.querySelector("#"+a.id+" tfoot"));
var mm, y=a.year, m=a.month, dat=a.dat,
	Dlast = new Date(y, m+1, 0).getDate(),
	DNlast = new Date(y, m, Dlast).getDay(),
	DNfirst = new Date(y, m, 1).getDay(),
	ca = '', j=0,
	months=lang[a.lang].mo;
if(DNfirst != 0) j = DNfirst-1;
else j = 6;

HTM(a.id, '<thead><tr><td class="cal-l" title="'+lang[a.lang].pre+'">‹</td><td colspan=3 class="cal-m"></td><td colspan=2 class="cal-y"></td><td class="cal-r" title="'+lang[a.lang].nex+'">›</td></tr><tr><td>'+lang[a.lang].w+'</td></tr></thead>');

if(j>0) {// ‹ &larr;
	if(m==0) mm = 11; else mm = m-1;
	if(j>1) {
		ca += '<td colspan='+j+' class="cal-l" align=left title="'+lang[a.lang].pre+' '+lang[a.lang].mo[mm]+'"><b>‹ '+lang[a.lang].m[mm]+'</b></td>';
	} else ca += '<td class="cal-l" title="'+lang[a.lang].pre+' '+lang[a.lang].mo[mm]+'"><b>‹</b></td>';
}

var __x , _xmn = $(a.o).attr("min")*1000, _xmx = $(a.o).attr("max")*1000, wcls = "";
var newYear = [new Date(2019, 11, 31).getTime(), new Date(2020, 0, 1).getTime(), new Date(2020, 0, 2).getTime(), new Date(2020, 0, 7).getTime()];
for(var i=1; i<=Dlast; i++) {
	j++;
	wcls = j>=6 ? " -weekend" : "";
	ca += '<td';
	__x = new Date(a.year, a.month, i).getTime();
	if (__x<_xmn || __x>_xmx || newYear.indexOf(__x) != -1) ca+=' disabled';
	if(i==dat) {
		if(m==a.smonth && y==a.syear) ca += ' class="today'+wcls+'"';
		else ca += ' class="tday'+wcls+'"';
	} else if(i==a.tdat && m==a.tmonth && y==a.tyear) ca += ' class="tday'+wcls+'"'
	else if (wcls!="") ca+=' class="'+wcls+'"' 
	ca += '>'+i+'</td>';
	if(j>6) {ca += '</tr><tr>'; j=0}
}
if(DNlast>0) {// › &rarr;
	if(m>10) mm = 0; else mm = m+1;
	if(DNlast<6) {
		ca += '<td colspan='+(7-DNlast)+' class="cal-r" align=right title="'+lang[a.lang].nex+' '+lang[a.lang].mo[mm]+'"><b>'+lang[a.lang].m[mm]+' ›</b></td>';
	} else ca += '<td class="cal-r" title="'+lang[a.lang].nex+' '+lang[a.lang].mo[mm]+'"><b>›</b></td>';
}


HTM(a.id, '<tbody><tr class="cal-first">'+ca+'</tr></tbody>');
ca='';
var k, kk=[3,3,1];
if(!a.now) kk[0]=0;
if(!a.set0) kk[1]=0;
if(!a.x) kk[2]=0;
if(a.now) {
	k=kk[0]+kk[1]+kk[2];
	if(k<7) kk[0] += (7-k);
	ca += '<td colspan='+kk[0]+' class="cal-nw"></td>';
}
if(a.set0) {
	k=kk[0]+kk[1]+kk[2];
	if(k<7) kk[1] += (7-k);
	ca += '<td colspan='+kk[1]+' class="cal-s0">'+lang[a.lang].clear+'</td>';
}
if(a.x) {
	k=kk[0]+kk[1]+kk[2];
	if(k<7) kk[2] += (7-k);
	ca += '<td colspan='+kk[2]+' onClick="document.getElementById(\''+a.id+'\').style.display=\'none\'" title="'+lang[a.lang].x+'" class="bold">'+(kk[2]>2 ? lang[a.lang].x : '&#215;')+'</td>';
}
HTM(a.id, '<tfoot><tr>'+ca+'</tr></tfoot>');

var _y0=y%100;
if (_y0<80) _y0+= 2000; else if(_y0<=100) _y0+=1900;
document.querySelector("#"+a.id+" thead td.cal-m").innerHTML = months[m];
document.querySelector("#"+a.id+" thead td.cal-y").innerHTML = _y0;
document.querySelector("#"+a.id+" thead td.cal-l").onclick = function() {xCal.mmm(a);}
document.querySelector("#"+a.id+" thead td.cal-r").onclick = function() {xCal.mpp(a);}
document.querySelector("#"+a.id+" thead td.cal-m").onclick = function() {xCal.fM(a);}
document.querySelector("#"+a.id+" thead td.cal-y").onclick = function() {xCal.fY(a);}

k = document.querySelector("#"+a.id+" tfoot td.cal-nw");
if(k) { // a.now
	k.innerHTML = xCal(2, a);
	k.onclick = function() {
	
		var dop="";
		a=xCal.gDop(a);
		if(a.dop!="") dop = " "+a.dop;
		if(a.o) a.o.value=xCal.value=this.innerHTML+dop; // xCal(2, a);
		if(a.hide==1) {
			document.getElementById(a.id).style.display='none';
		} else {
			var o=document.querySelectorAll("#"+a.id+" .today");
			for(var j=0; j<o.length; j++) {o[j].className=""}
			a=xCal.gDat(a);
			var D = new Date(); a.year = D.getFullYear(); a.month = D.getMonth(); a.dat = D.getDate();
		}
		a.sdat = a.dat; a.smonth = a.month; a.syear = a.year;
		if(typeof a.fn==="function") a.fn(this.innerHTML, a);
		else if(typeof a.fn==="string" && a.fn!=="") eval(a.fn+"('"+this.innerHTML+"');");
		if(a.hide!=1) xCal.f(a);//xCal(a.id, a);
	}
}
k = document.querySelector("#"+a.id+" tfoot td.cal-s0");
if(k) { // a.set0
	k.onclick = function() {
		var t='00'+a.delim+'00'+a.delim+'00';
		if(a.order==1) t='00'+t; else t+='00';
		if(a.o) a.o.value=xCal.value=t;
		a.sdat = a.dat; a.smonth = a.month; a.syear = a.year;
		if(a.hide==1) document.getElementById(a.id).style.display='none';
	}
}
if(a.autoOff){Nod(a.id).onmouseleave = function() {xCal()}}

var k = document.querySelectorAll("#"+a.id+" tbody td");
for(var i=0; i<k.length; i++) {
	k[i].onclick = function() {
		var t = this.innerHTML;
		if(t=='' || t=="&nbsp;") return;
		if(a.hide!=1) {
			var o=document.querySelectorAll("#"+a.id+" .today");
			for(var j=0; j<o.length; j++) {o[j].className=""}
			this.className="today";
		}
		a=xCal.gDop(a);
		a.dat=t;
		if(typeof a.f==="function") a.f(a.id);
	}
}
var r=document.querySelector("#"+a.id+" tbody td.cal-l");
if(r!=null){r.onclick = function() {xCal.mmm(a); 	} }
r=document.querySelector("#"+a.id+" tbody td.cal-r");
if(r!=null){r.onclick = function() {xCal.mpp(a);	}}
}

xCal.f(a);

return false;
}

xCal.mmm = function(a) {
	a.month-=1;
	if(a.month<0) {a.month=11; a.year--}
	xCal.f(a);
}
xCal.mpp = function(a) {
	a.month+=1;
	if(a.month>11) {a.month=0; a.year++}
	xCal.f(a);
}

xCal.gDop = function(a) {
	if(typeof a.o==="undefined") a.o={value: ""}
	if(typeof a.o.value==="undefined" || a.o.value==="") return a;
	var a0 = a.o.value;
	if (typeof a.o.value === "number") a0 = $(a.o).data("val");
	var b = a0.split(" ");
	if(iss(b[1])) a.dop = b[1]; else a.dop = "";
	return a;
}
xCal.gVal = function(a) {
	if(typeof a.o==="undefined") a.o={value: ""}
	if(typeof a.o.value==="undefined" || a.o.value==="") return a;
	var a0 = a.o.value;
	if (typeof a.o.value === "number") a0 = $(a.o).data("val");
	var b = a0.split(" ");
	if(iss(b[1])) a.dop = b[1]; else a.dop = "";
	b = b[0].split(a.delim);
	for(var i=0;i<3;i++) if(!iss(b[i])) b[i] = -1;
	if(a.order==2) {
		b[3] = b[1]; b[1] = b[0]; b[0] = b[3];
		b[1] = parseInt(b[1])-1;
	} else {
		if(a.order==1) {b[3] = b[2]; b[2] = b[0]; b[0] = b[3]}
		b[1] = parseInt(b[1])-1;
	}
	var y = parseInt(b[2]);
	if (y<80) y+=2000; else if (y<=100) y+=1900;
	b[2] = y;
	a.syear = a.year = parseInt(b[2]);
	a.smonth = a.month = b[1];
	a.sdat = a.dat = parseInt(b[0]);
	return a;
}

xCal.gDat = function(a) {
	var D = new Date();
a.tyear = D.getFullYear();
a.tmonth = D.getMonth();
a.tdat = D.getDate();
a.tday = D.getDay();
if(a.month>-1) {
	if(a.year<0) a.year = D.getFullYear();
	if(a.dat>0) D.setFullYear(a.year, a.month, a.dat);
	else D.setFullYear(a.year, a.month);
}
a.year = D.getFullYear();
a.month = D.getMonth();
a.dat = D.getDate();
a.day = D.getDay();
a.sdat = a.dat; a.smonth = a.month; a.syear = a.year;
return a;
}

xCal.set = function(o) {for(var key in o) def[key]=o[key]}

xCal.all = function(cl, delim, order) {
	if(typeof cl==="undefined" || cl=="") return;
	var oo;
	if(document.getElementsByClassName) oo = document.getElementsByClassName(cl);
	else oo = document.querySelectorAll("."+cl);
	if(oo.length<1) return;
	for(var i=0; i<oo.length; i++) {
		var o=oo[i];
		Eve(o, "input", function() {xCal()});
		Eve(o, "keyup", function() {xCal()});
		Eve(o, "click", function() {xCal(this, delim, order)});
		if(typeof delim==="object") {
			if(("autoOn" in delim) && delim.autoOn) Eve(o, "mouseenter", function() {xCal(this, delim, order)});
		} else if(def.autoOn) Eve(o, "mouseenter", function() {xCal(this, delim, order)});
	}
}

})();


/******** /js/common.js **************/

$SLIDESHOWINTERVAL = 4000;
$MINVIDEOSPEED = 3072;
$MINVIDEOLOW   = 3071;
$CLIPS = [];
$_started = false;
var monthes = [ "", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря" ],
days = ["вс", "пн", "вт", "ср", "чт", "пт", "сб", "вс"];

$_AJAX_PATHES = {
    feedback: "/contacts/mail/",
    login: "/login/login/",
    compareManage: "/compare/update/",
    olegForm: "/item/empty/",
    catalogue: {
        getFilterInfo: window.location.href,
        resetSelectorFilter: window.location.href
    },
    basket: {
        set_order_link: "/basket/",
        basket_link: "/basket/",
        add: "/basket/update/",
        remove: "/basket/update/",
        update: "/basket/update/",
        check:  "/basket/check/",
        get: "/!ajax/basket.php",
        serviceCancel: "/!ajax/basket.php",
        setLessVariant: "/basket/set-pickup-method/",
        onEmptyRedirect: "/basket/"
    },
    cabinet: {
        orders: "/cabinet/reserves/",
        extendOrder: "/!ajax/cabinet.orders.php",
        claimUpload: "/!ajax/cabinet.claim.php",
        claimLoadedRemove: "/!ajax/cabinet.claim.php",
        claimSend: "/!ajax/cabinet.claim.php",
        claimsList: "/!ajax/cabinet.claim.php",
        getClaim:  "/!ajax/cabinet.claim.php",
        documentsList: "/cabinet/documents/",
        notifications: "/!ajax/cabinet.notif.php",
        requisites:  "/cabinet/requisites/",
        profile:  "/cabinet/change-profile/",
		checkFailed: "/cabinet/reserves/?action=check-failed",
		addFromCatalogue: "/catalogue/?appendToOrder=%oid%",
        addBySearch: "/search/cabinet/",
        AssignOrder2Manager: "/cabinet/reserves/"
    },
    autocomplete: {
        cities: "/post-delivery/search-city/",
        streets: "/!ajax/a.city.php",
        search: "/search/autocomplete/"
    },
    order: {
        step1CheckPhone: "/order/check-phone/",
        step1CheckPass: "/order/login/",
        step1: "/order/change-order/",
        step2: "/order/change-order/",
        step3: "/order/change-order/",
        delivery: "/order/delivery/",
		itemDelivery: "/item/delivery/",
    },
	 item: {
        getCharacteristics: "/item/properties/",
        getDeliveryPrice: "/cabinet/reserves/",
		addresses: "/item/addresses/",
    },
};

/* %PATHES% */

$(function() {

	$("nav.catalogue, nav.catalogue-main-page").css({ visibility: "" });

/*
    try {
        !function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);
    } catch(e){}
*/

    if (navigator.vendor.match(/Apple\sComp/) && navigator.appVersion.match(/iPhone/)) {
        $("body").addClass("-iphone");
    }
    selOlegInit();

    $(".-outlet-b>span").html($(".-outlet-b h1").html());
    
    setTimeout(function() {
        $("body>header ._stamp").addClass("visible");
    }, 1500);

    $(".current-phone").each(function() {
        var $this = $(this);
        setTimeout(function() {
            $this.attr("href", $("header .main-phone a").attr("href"));
        }, 250);
    });


    $(".-work-stamp").each(function() {
        var $this = $(this);
        $this.removeClass("-work-stamp");
        if ($this[0].tagName.toLowerCase()=="img") {
            var img = new Image();
                img.onload = function() {
                    var appnd = $("<div class='-x-work-stamp'></div>");
                        appnd.css({width: $this.width(), height: $this.height()});
                        
                    appnd.insertBefore($this);
                }
            img.src = $(this).attr("src");
        }
    });
    
    var limit = 1609362000000, sess = sessionStorage.getItem("nyshclosed3");
    if (Date.now()<limit && sess!=1 && $(".ny-shedule").length>0) {
        $("body").addClass("show-shedule-ny");
        $(".ny-shedule .-sh-expander").on("click", function(e) {
            e.preventDefault();
            $("html,body").stop().scrollTop(0);
            $("body").addClass("shedule-expanded");
            $("html,body").each(function() {
                this.style="overflow: hidden !important";
            });
            $(".ny-shedule span.-phn").html("").append($("body>header address.main-phone a").eq(0).clone());
            setTimeout(function() {
                if (window.innerHeight-80>$(".ny-shedule .information")[0].scrollHeight) {
                    $(".ny-shedule .information").css({ top: (window.innerHeight-80 - $(".ny-shedule .information")[0].scrollHeight)/2+"px" });
                } else {
                    $(".ny-shedule .information").css({ top: "" });
                }
            }, 50);
            return false;
        });
        
        $(".ny-shedule").find(".-close, button").on("click", function(e) {
            e.preventDefault();
            $("body").toggleClass("shedule-expanded");
            $("html,body").each(function() {
                this.style="";
            });
            return false;
        });
        
        $(".ny-shedule .-reset-shedule").on("click", function(e) {
            e.preventDefault();
            $(".ny-shedule").css({height: 0});
            setTimeout(function() {
                $("body").removeClass("show-shedule-ny");
                sessionStorage.setItem("nyshclosed", 1);
            }, 250);
            return false;
        });
        
    }

    if (location.href.match(/\/delivery\//)) {
        $("body").addClass("baza").removeClass("static");
        var cs = $("link[rel=stylesheet]");
        for (var i=0; i<cs.length; i++) {
            if (cs.eq(i).attr("href").match(/\,static\.css/)) {
                cs.eq(i).attr("href", cs.eq(i).attr("href").replace(/\,static\.css/, ''));
            }
        }
    }
    
    $("input.-phone, #buy-by-click-window input").on("paste blur focus change input", function(e) {
        var t = $(this).val().trim().replace(/\D/g, '');
            t = t.replace(/^(\+{0,1}7|8)/, '');
            if (t.length>10) t = t.substr(0,10);
        $(this).val(t);
        return true;
    }).each(function() {
        $(this).attr("maxlength", 12);
    });




	var cfi = false;
    var checkFail = function() {
        $.post($_AJAX_PATHES.cabinet.checkFailed, { action: "check-failed" }, function(data) {
            if (typeof(data.state)=="undefined" || data.state=='dontcheck') {
                if (cfi) clearInterval(cfi);
                $(".nav-bottom-panel .login").removeClass("failed");
                return false;
            }
            if (data.state=="ok") {
                $(".nav-bottom-panel .login").removeClass("failed");
            } else {
                $(".nav-bottom-panel .login .failed-msg em").text(data.count);
                $(".nav-bottom-panel .login").addClass("failed");
            }
            if (!cfi) {
                cfi = setInterval(checkFail, 6e5);
            }
            if (typeof(data.new)=="undefined") data.new=0;
            if (data.new) {
                $(".nav-bottom-panel .login.auth a .new-msg").show().find("em").html(data.new);
            } else {
                $(".nav-bottom-panel .login.auth a .new-msg").hide();
            }
        });
    }
    if($('body').hasClass('manager')) checkFail();

	 $("input,textarea").on("focus", function(e) {
        if ($("body").hasClass("--mobile"))
            $('.nav-bottom-panel').css({ visibility: "hidden" });
        else $('.nav-bottom-panel').css({ visibility: "visible" });
    }).on("blur", function(e) {
        $('.nav-bottom-panel').css({ visibility: "visible" });
    });

		$("[data-placeinfo]").each(function() {
        if ($(this).css("position")=="static") $(this).css({position:"relative"});
        $(this).append("<div class='-placeinfo'>"+$(this).data("placeinfo")+"</div>");
        $(this).attr("data-placeinfo", null).css({ cursor: "pointer" });

        $(this).on("click", function(e) {
            $(".place-info-expanded").removeClass("place-info-expanded");
            $(this).addClass("place-info-expanded");
        });
        $(window).on("click", function(e) {
            if ($(e.target).parents(".place-info-expanded").length==0 && $(e.target).find(">.-placeinfo").length==0) $(".place-info-expanded").removeClass("place-info-expanded");
        });
    });
    
    $("a[data-geo]").on("click", function(e) {
        if ($("body").hasClass("--mobile")
            && (
                (navigator.platform.indexOf("iPhone") == -1) &&
                 (navigator.platform.indexOf("iPad") == -1) && 
                 (navigator.platform.indexOf("iPod") == -1)
            ))
            {
                e.preventDefault();
                var _geo = $(this).data("geo");
                setTimeout(function() {
                    location.href = _geo;
                }, 25);
                return false;
            } else 
                return true;
    });

    $(".nav-bottom-panel .login .-seen").on("click", function(e) {
        e.preventDefault();
        $(this).parents("span").toggleClass("expanded");
        if (window.innerWidth<410) {
            if ($(this).parents("span").hasClass("expanded")) $("html").addClass("-noscroll");
            else $("html").removeClass("-noscroll");
        }
        return false;
    }).parent().find("ul").prepend("<a href='#' class='-seen-close'></a>");;
    
    $(".-seen-close").on("click", function(e) {
        e.preventDefault();
        $(this).parents(".login").find(">span").removeClass("expanded").blur();
        return false;
    });
    
    $("a.play-video").on("click", function(e) {
        e.preventDefault();
        setTimeout(function(e) {
            window.open("https://youtu.be/rE4IQvvVkPs", "youtubeWindow");
        }, 5);
        if (typeof(ym)!="undefined") {
            ym(45359406, 'reachGoal', 'startvideo', {});
        }
        return false;
    });
/*    
    var tag = document.createElement('script');
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    
    window.onYouTubeIframeAPIReady = function() {
        prPlayer = new YT.Player("vplayer", {
            width: 560,
            height: 315,
            videoId: "rE4IQvvVkPs"
        });
    }
*/

    var showSlideShow = function() {
        var N = 1;
        if (window.innerWidth<600) N=2;
        var bm = "bm=1&mobile="+(window.innerWidth<405?1:0)+"&";
        if ($('body').hasClass("main")) bm+="main=1&";

//        $.get("/!ajax/gv.php?"+bm+"low=-"+N, {}, function(data) {

        var data = { banners: [] }, folder = "", fcount = 23, fst = 2;
        if (window.innerWidth<950) folder += "mobile";
        if ($('body').hasClass('main') && folder=="mobile") folder += "main";
        else if (!$('body').hasClass('main')) folder += "inside";
        if (folder=="mobilemain") fcount = 19, fst=3; 
        if (folder=="mobileinside") fcount = 18, fst=2;
        if (folder=="inside") fcount = 10, fst=5;
        if (folder!="") folder +="/";
        for (var i=fst; i<=fcount; i++) {
            data.banners.push( { image: "/images/slideshow/new/"+folder+i+".jpg", url: "" } );
        }
        data.banners.sort(function(a,b) {
            return Math.random()>=.5?1:-1;
        });
        if (folder=="inside/") {
            fst = 2;
            var tb = [];
            for (var i=2; i<5; i++) tb.push( { image: "/images/slideshow/new/"+folder+i+".jpg", url: "" } );
            tb.sort(function(a,b) {
                return Math.random()>=.5?1:-1;
            });
            for (var i=0; i<tb.length; i++) data.banners.unshift(tb[i]);
        }
        for (var i=fst-1; i>0; i--) {
            data.banners.unshift( { image: "/images/slideshow/new/"+folder+i+".jpg?ver=10", url: "" } );
        }

        if (folder=="mobileinside/") {
            for (var i=20; i<=27; i++) data.banners.push( { image: "/images/slideshow/new/"+folder+i+".jpg", url: "" } );
        }
        
        $("body>header .start .holder").addClass("-images");
        $("body>header .start .holder>*:first-child").addClass("--rm");
        setTimeout(function() {
                $("body>header .start .holder .--rm").remove();
        }, $SLIDESHOWINTERVAL);
            
            if (typeof(data.banners)!="undefined") {
                var bn = data.banners, a, ul = $("<ul class='bnnav'></ul>");
                for (var i=0; i<bn.length; i++) {
                    var ixd = bn[i].image.replace(/\D/g, '')*1;
                    var img = $("<div data-bid='"+i+"' data-imgid='"+ixd+"' style='background-image:url(\""+bn[i].image+"\");' class='-bg"+(i==0?' current':'')+"'></div>");
                        if (bn[i].url) {
                            a = $("<a href='"+bn[i].url+"'><em>"+bn[i].text+"</em></a>");
                        } else {
                            a = $("<span><em>"+bn[i].text+"</em></span>");
                        }
                        a.appendTo(img);
                        img.appendTo("body>header .start .holder");
                }
                for (var i=0; i<sTexts.length; i++) {
                    ul.append("<li "+(i==0?'class="current" ':'')+"data-bid='"+i+"'></li>");
                }
                ul.appendTo("body>header .start");
                ul.on("click", "li", function() {
                    $(".-actual").removeClass(".-actual");
                    var el = $(".start .holder .-bg[data-bid=\""+$(this).attr("data-bid")+"\"]");
                    setTimeout(function() {
                        $("section.start .-bg.current:not(.-xtmp)").removeClass('current');
                        $(".-xtmp").removeClass("-xtmp -actual");
                    }, 1000);
                    ul.find(".current").removeClass("current");
                    el.addClass('current -xtmp -actual');
                    $(this).addClass('current');
                    showNextSlogan($(this).attr("data-bid"));
                });
            } else {
                for (var i=0; i<data.length; i++) {
                    var img = $("<div style='background-image:url(\""+data[i]+"\");' class='-bg"+(i==0?' current':'')+"'></div>");
                        img.appendTo("body>header .start .holder");
                }
            }
            var stopAuto = false;
            var xsetInterval = function(a,b) {};
            setInterval(function() {
                if (stopAuto) return true;
                var c = $("body>header .start .holder .-bg.current"), n = c.next(), ul = $("body:not(.main)>header section.start .bnnav");
                if (n.length==0) n=$("body>header .start .holder .-bg").eq(0);
                n.addClass('current -actual');
                var z = n.next();
                if (z.hasClass('-bg')) {
                    //z.attr("style", z.data("style"));
                } else {
                    z = $(".-bg").eq(1);
                }
                if (ul) {
                    var id = n.data("bid");
                    ul.find("li.current").removeClass("current");
                    ul.find("li[data-bid=\""+id+"\"]").addClass("current");
                }
                c.removeClass("-actual");
                setTimeout(function() {
                    c.removeClass('current');
                }, 1000);
                showNextSlogan();
            }, $SLIDESHOWINTERVAL);
            
            $("section.start").on("mouseenter", function() {
                stopAuto = true;
            }).on("mouseleave", function() {
                setTimeout(function() {
                    stopAuto = false;
                }, 1000);
            });
//        });
     srcImg = [];
     var im2= $(".-bg");
     for (var i=0; i<im2.length; i++) {
        var __t = $("<div></div>");
            __t.append(im2.eq(i).clone());
        srcImg.push( __t.html() );
     }
     srcImg.sort( function(a, b) { 
        if ($(a).attr("data-imgid")*1<$(b).attr("data-imgid")*1) return -1;
        if ($(b).attr("data-imgid")*1<$(a).attr("data-imgid")*1) return 1;
        return 0;
     });
    
     remapImages();
    }
    
    var srcImg = [];
    
    var remapImages = function() {
        $(".-bg").remove();
        var im = srcImg;
            if (im.length==0) return true;
        var tarr = new Array(im.length),
            qu = [],
            md = $("body").hasClass("--mobile")?1:2,
            wk, tma, min;
            tarr.fill(0);
        for (var i=0; i<sTexts.length; i++) {
            wk = sTexts[i][md];
            tma = [], min = [1e5, -1];
            
            for (var j=0; j<wk.length; j++) {
                if (typeof(tarr[wk[j]])=="undefined") tarr[wk[j]]=0;
                if (Math.random()*2-1<0) {
                    tma.push([tarr[wk[j]], wk[j]]);
                } else {
                    tma.unshift([tarr[wk[j]], wk[j]]);
                }
            }
            for (j=0; j<tma.length; j++) if (min[0]>tma[j][0]) {
                if (i==0 || qu[i-1]!=tma[j][1]) min = [tma[j][0], tma[j][1]];
            }
            tarr[min[1]]++;
            qu.push(min[1]);
        }
        for (i=0; i<sTexts.length; i++) {
            $("body>header section.start .holder").append( $(im[qu[i]]).attr("data-bid", i)  );
        }

    }
    
    var isSpb = $("body").hasClass("spb"),
        isMsk = $("body").hasClass("msk");
    var sTexts = [
        ["Двухэтажный гипермаркет<br>сантехники " + (isMsk ? "— покупайте" : ": заказывайте"), [2], [6] ],
        ["458 брендов сантехники<br>под одной крышей", [16], [4] ],
        ["Гипермаркет душевых кабин:<br>1439 шт, все размеры", [14], [20] ],
        ["Ванны любых материалов<br>и размеров", [15], [8,9] ],
        ["Мебель для ванной: <br>более тысячи комплектов", [13,17], [3,18] ],
        ["Уйма унитазов — <br>" + (isMsk ? "приезжайте примерять" : "заказывайте"), [18,5], [19,2] ],
        ["Море смесителей:<br>под тысячу — выбирайте", [11,12,9,19], [17,10,12] ],
        ["Целый этаж мебели<br>для ванной " + (isMsk ? "— покупайте" : ": заказывайте"), [3], [15] ],
        ["Честный обмен сантехники<br>30 дней", [7], [14] ],
        ["Скидки и акции<br>на сантехнику " + (isMsk ? "— покупайте" : ": заказывайте"), [10], [7,11] ],
        ["Установка сантехники<br>\"под ключ\"", [6], [5,16] ],
        ["Самовывоз<br>уже сегодня", [4], [21] ],
        ["Быстрая доставка —<br>привезем уже завтра", [5], [22] ],
        ["Удобный заезд с МКАД<br>внутри Москвы", [8], [13] ],
        ["Отгружаем<br>по всей стране", [9], [23] ]
     ];
     if (!$("body").hasClass("main")) {
        sTexts = [
            ["Двухэтажный<br>гипермаркет<br>сантехники " + (isMsk ? "—<br>покупайте" : "<br>заказывайте"), [2], [3] ],
            ["458 брендов<br>сантехники<br>под одной крышей", [6], [9] ],
            ["Гипермаркет<br>душевых кабин:<br>1439 шт,<br>все размеры", [3,17], [7] ],
            ["Ванны<br>любых материалов<br>и размеров",[2,9], [4] ],
            ["Мебель<br>для ванной:<br>более тысячи<br>комплектов", [6], [2] ],
            ["Уйма<br>унитазов —<br>" + (isMsk ? "приезжайте<br>примерять" : "заказывайте"), [16,4], [5] ],
            ["Море<br>смесителей:<br>под тысячу —<br>выбирайте",[8,14], [9] ],
            ["Целый этаж<br>мебели<br>для ванной " + (isMsk ? "—<br>покупайте" : "<br>заказывайте"),[15], [3] ],
            ["Честный<br>обмен<br>сантехники<br>30 дней", [12], [8] ],
            ["Скидки<br>и акции<br>на сантехнику " + (isMsk ? "—<br>покупайте" : "<br>заказывайте"), [11], [6] ],
            ["установка<br>сантехники<br>\"под ключ\"", [10], [10] ],
            ["Самовывоз<br>уже<br>сегодня", [5], [2] ],
            [ !isSpb ? "Быстрая<br>доставка —<br>привезем<br>уже завтра" : "Доставка в СПб<br>каждые выходные", [7], [3] ],
            ["Удобный<br>съезд с МКАД<br>внутри Москвы", [13], [7] ],
            ["Отгружаем<br>по всей<br>стране", [18], [5] ],
         ];
         if (isSpb) { sTexts.splice(11, 1); }

         sTexts.unshift([ $(".slogan p").html(), [1], [1] ]);
     }
     if ($("body").hasClass("main")) {
         sTexts.unshift([ $(".slogan p span."+(window.innerWidth<410?"mobile":"desktop")).html(), [1], [1] ]);
         if (window.innerWidth<405) {
           $("header #logo").hide();
         }
     } 

    var videoOnce = false;
    var showVideoShow = function() {
        $("body>header .start .holder>*:first-child").addClass("--rm");
        if (!$("body").hasClass("main") || window.innerWidth<600) {
            videoOnce = true;
        }
        setTimeout(function() {
            $("body>header .start .holder .--rm").remove();
        }, 3000);
        var shuffleVideo = function() {
            var v = $("body>header .start .holder video");
            for (var i=0; i<v.length; i++) {
                if (Math.random()>=.5) {
                    v.eq(i).insertBefore("body>header .start .holder .over");
                } else {
                    v.eq(i).prependTo("body>header .start .holder");
                }
            }
        }
        $("body>header .start .holder").append("<div class='over'></div>");
        var _cl = $CLIPS.length;
        if (videoOnce) _cl = 1;
        for (var i=0; i<_cl; i++) {
                (function(i) {
                    setTimeout(function() {
                            var vid = $("<video playsinline muted='muted'><source src='"+$CLIPS[i]+"'></source></video>");
                                        vid.insertBefore("body>header .start .holder .over");
                                        vid[0].addEventListener("ended", function() {
                                            if (videoOnce) {
                                                $(this).remove();
                                                $("header section.start").addClass("-mobile-fixed");
                                                showSlideShow();
                                                return false;
                                            }
                                            var $this = $(this);
                                            $this.removeClass("visible");
                                            var n = $(this).next();
                                            if (n.length==0 || n[0].tagName.toLowerCase()!="video") {
                                                //shuffleVideo();
                                                n=$("body>header .start .holder video").eq(0);
                                            }
                                            n.addClass("visible")[0].play();
                                            showNextSlogan();
                                        });
                               }, i*1000);
                })(i);
        }
        setTimeout(function() {
            $("body>header .start .holder video").eq(0).addClass('visible');
            $("body>header .start .holder video")[0].play();
        }, 100);
    }
    

    window.stx = 1;
     showNextSlogan = function(N) {
        if (typeof(N)!="undefined") stx = N;
        try {
            var text = sTexts[stx++][0];
        } catch(e) {
                text = "";
        }
        setTimeout(function() {
            $("header #logo:not(:visible)").fadeIn(250);
            $("body>header .slogan").fadeOut(300, function() {
                $("body>header .slogan p").html(text);
                $("body>header .slogan").fadeIn(300);
                try {
                    if (stx==sTexts.length) stx=0;
                } catch(e) {
                    stx = 0;
                }
            });
        }, 250);
    }

    var getConnectionInfo = function() {
        var st;//, sx = sessionStorage.getItem("_s");
        return new Promise(function(resolve) {
            if (!$("body").hasClass("main")) {
                return resolve(0);
            }
            var tn = new Image(), st = performance.now();
                tn.onload = function() {
                    var d = performance.now()-st, l = 491524,
                    sx = Math.floor(9000*l/(performance.now()-st))*1.25;
//                    sessionStorage.setItem("_s", sx);
                    resolve(sx);
                }
            tn.src = "/images/noise.png?n="+Math.random();
            $_started = setTimeout(function() {
                    $_started = true;
                    showSlideShow();
            }, 5000);
        });
    }

    var reorderVideo = function(arr) {
        var preset = ['w1', 's36', 'w29', 's42', 'w2', 's113'], pr = [], result = [];
        for (var i=0; i<arr.length; i++) {
            var x = preset.indexOf(arr[i].replace(/^.*\/(.*?)\.\w+$/, '$1'));
            if (x>-1) {
                pr[x]=arr[i];
                arr.splice(i, 1);
                i--;
            }
        }
        arr.sort(function(a, b) {
            return Math.round(Math.random()*2.8 - 1.4);
        });
        for (i in pr) result.push(pr[i]);
        while (arr.length>0) result.push(arr.shift());
        return result;
    }


    getConnectionInfo().then(function(speed) {
    
        $("body:not(.main)>header section.start .holder").on("click", function(e) {
            if (!$("body").hasClass("main")) {
                $("header video")[0].currentTime = 1e6;
            }
            return $(".play-video").trigger("click");
        });
    
        var ix = sessionStorage.getItem("videoshown"), showVideoMode = false;
        if (!ix) {
            showVideoMode = 1;
            sessionStorage.setItem("videoshown", 1)
        } else if (!$('body').hasClass("main")) {
            sessionStorage.setItem("videoshown", ++ix)        
        }
        if ($_started===true) return true;
        if ($_started) clearTimeout($_started);
        if (ix<3) {
            showVideoMode = true;
        } else {
            $("body:not(.main) header section.start").addClass("-mobile-fixed");
        }

        if (window.innerWidth<600 && !showVideoMode) { return showSlideShow(); }
        if (!showVideoMode && speed<$MINVIDEOLOW*1024) { return showSlideShow(); }
                
        if (navigator.platform.match(/iPhone/) ||
            navigator.platform.match(/iPad/) ||
            navigator.platform.match(/iPod/)
        ) { return showSlideShow(); }

        var video = [];
        for (var i=2; i<=13; i++) video.push("/video/"+i+".mp4");
        $CLIPS = reorderVideo(video);
        $CLIPS.unshift("/video/1.mp4");

        showVideoShow();

    });


    var rscls = function() {
        var w = window.innerWidth, pl = "поиск по гипермаркету сантехники";
        $("body").toggleClass("--mobile", w<=950);
		  if (w<=1050 && w>=405) {
            pl = "поиск по гипермаркету сантехники";
        } else if (w<=405) {
            pl = $("form#search-top input[type=text]").data("placeholdermobile");
        }
        $("form#search-top input[type=text]").attr("placeholder", pl);
        $("body>header .region-selector strong").each(function() {
            if (w<1750) {
                $(this).text($(this).data("normal"));
            } else {
                $(this).text($(this).data("wide"));
            }
        }).on("click", function(e) {
            $(this).parent().toggleClass("-hover");
            $("body>header section.top-part").toggleClass("-selected-element", $(this).parent().hasClass("-hover"));
        });
    };
    rscls();
    window.addEventListener("resize", rscls);


    $("body:not(.main)>header nav.catalogue>strong").on("click", function(ev) {
        if ($("body").hasClass("--mobile")) {
            $("body>header nav.catalogue").toggleClass("-hover");
            if ($("body>header nav.catalogue").hasClass("-hover")) {
                $("body>header section.top-part").css({ visibility: "hidden" });
                $(".ny-shedule").attr("style", "display: none !important");
                if (window.innerWidth<410) $(".nav-bottom-panel").hide();
            } else {
                $("body>header section.top-part").css({ visibility: "visible" });
                $(".ny-shedule").attr("style", null);
                if (window.innerWidth<410) $(".nav-bottom-panel").show();
            }
        };
    });
    $("body>header nav.catalogue div.items .items-close").on("click", function(e) {
        e.preventDefault();
        $("body>header nav.catalogue").removeClass("-hover");
        $(".ny-shedule").attr("style", null);
        $("body>header section.top-part").css({ visibility: "visible" });
        if (window.innerWidth<410) $(".nav-bottom-panel").show();
        return false;
    });
    
    $("body:not(.main)>header nav.catalogue>strong").on("mouseenter", function(ev) {
        if (!$("body").hasClass("--mobile")) {
            $("body>header nav.catalogue").addClass("-hover");
        };
    }).parents("nav.catalogue").on("mouseleave", function(ev) {
        if (!$("body").hasClass("--mobile")) {
            $("body>header nav.catalogue").removeClass("-hover");
        };
    });

    if ($('html').hasClass('first') && !$("body").hasClass("cabinet")) {
    /*
        setTimeout(function() {
            $('html').removeClass('first').addClass("uc-shown");
        }, 2000);
    */
    }
    $("#site-is-under-construction .close-block").on("click", function(ev) {
        ev.preventDefault();
        $('html').removeClass('uc-shown');
        return false;
    });

    $("#top-panel").appendTo(document.body);
    assignAutoComplete($("section.start form#search-top input[type=text]"), $_AJAX_PATHES.autocomplete.search);
    $("section.start form#search-top input[type=text]")
        .on("focus", function() {
            $(this).parent().addClass("focused");
        })
        .on("blur", function(e) {
            if (e.relatedTarget.parents('-autocomplete').length) e.relatedTarget.parents('.-autocomplete').css({ visibility: "hidden" });
            setTimeout(function() {
                $(this).parent().removeClass("focused");
            }, 50);
        }).on("keyup change paste input", function() {
            if ($(this).val().match(/\,/)) {
                $("section.start form#search-top").addClass('basket-add');
            } else {
                $("section.start form#search-top").removeClass('basket-add');
            }
        });
    
    $("body>header section.start form#search-top input[type=submit]").on("click", function(e) {
        if ($("section.start form#search-top").hasClass("basket-add")) {
            e.preventDefault();
            Basket.cascadeAdd($(this).parent().find("input[type=text]").val());
            return false;
        } else return true;
    });
    
    $("header:not(.-no-basket) .top-basket-el").on("click", function(e) {
        location.href = $('.nav-bottom-panel .basket a').attr("href");
    });


    var basketExpand = false, basketTimeout = false, basketNoClick = false;
    $(".nav-bottom-panel").on("contextmenu", ".basket:not(.empty)>a", function(e) {
        e.preventDefault();
        return false;
    });
    $(".nav-bottom-panel").on("mousedown touchstart", ".basket:not(.empty)>a", function(e) {
        basketTimeout = setTimeout(function() {
            basketExpand = true;
            basketNoClick = false;
            $(e.target).trigger("click");
            basketExpand = false;
            basketNoClick = true;
        }, 500);
    });
    $(".nav-bottom-panel").on("mouseup touchend", ".basket:not(.empty)>a", function(e) {
        if (basketTimeout) clearTimeout(basketTimeout);
    });

    $(".nav-bottom-panel").on("click", ".basket:not(.empty)>a", function(e) {
        if (!$("body").hasClass("manager")) {
            return true;
        }
        if (basketNoClick) { 
            basketNoClick = false;
            return false;
        }
        if (basketExpand) { 
            $(this).parent().toggleClass('expanded');
            e.preventDefault();
            return false;
        }
        return true;
    });

    $("ul.goods li").delegate(".image, .board", "click", function(ev) {
        if (ev.ctrlKey) {
            return true;
        }
        $(this).parents("li").find("a.title")[0].click();
        return true;
    });
    
    $("ul.goods li[data-aboutdelivery]").each(function() {
        $(this).prepend("<a href='#' class='-about-delivery'></a>");
    });
    
    var delivery_template = $(".-delivery.-template").html();
    $(".-delivery.-template").remove();
    $("ul.goods").on("click", "a.-about-delivery", function(e) {
        e.preventDefault();
        $(".-delivery-description").remove();
        var text = $(this).parents("li").eq(0).data("aboutdelivery").split("|"),
            content = delivery_template;
        for (var i=0; i<text.length; i++) {
            var rx = new RegExp('\\{\\%'+i+'\\%\\}', 'g');
            console.log(rx);
            content = content.replace(rx, text[i]);
        }
        var info = $("<div class='-delivery-description'>"+content+"</div>");
        info.find(".close").on("click", function(e) {
            e.preventDefault();
            info.remove();
            return false;
        });
        info.insertAfter(this);
        return false;
    })
    .on("mouseenter", "a.-about-delivery", function() {
        if (!$("body").hasClass("--mobile")) {
            $(this).trigger("click");
        }
    });
    $("ul.goods li").on("mouseleave", function() {
        if (!$("body").hasClass("--mobile") && $(this).find(".-delivery-description").length) {
            $(this).find(".-delivery-description").remove();
        }
    });

	var $yamap, _maps = $('#map, #map-mobile');
	_maps.each(function() {
	   $yamap = $(this);
    	if($yamap.length > 0){
        	var map;
        	function init(){
            	map = new ymaps.Map("map", {
                	center: $yamap.data("center") ? $yamap.data("center") : [55.650643,37.830976],
                	zoom: $yamap.data('zoom') ? $yamap.data('zoom') : window.innerWidth<410 ? 14 : 15,
    				controls: ['fullscreenControl'/*, 'rulerControl', 'typeSelector'*/,  'zoomControl']
            	});
            	if (window.innerWidth<410) {
                    map.behaviors.disable("scrollZoom");
                    map.behaviors.disable("drag");
                }
            	placemark = new ymaps.Placemark(map.getCenter(), {
            	    balloonContentBody: $yamap.data("balloon") ? $yamap.data("balloon"): '«Аквасант» — самый большой<br>магазин сантехники в Москве'
            	},
            	{
            	    balloonPanelMaxMapArea: 0
            	});
            	map.geoObjects.add(placemark);
            	placemark.balloon.open();
            	window.__map = map;
        	}
        	try { 
            	ymaps.ready(init);
            } catch(e) {}
     	}

    try {
            !function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);
        } catch(e){}

	});

    window.addEventListener("keydown", function(ev) {
        if (ev.which==27) {
            if ($(document.body).hasClass("overlayed")) $(".-win-close").trigger("click");
        }
    });

    var tmet = -1;
    $(".top-menu-expander").on("mouseenter", function(ev) {
        clearTimeout(tmet);
        $(this).addClass("-hover");
    }).on("mouseleave", function(ev) {
        clearTimeout(tmet);
        var $this = $(this);
        tmet = setTimeout(function() {
            $this.removeClass("-hover");
        }, 450);
    });


    $(".bottom-menu").each(function() {
        $(this).css({maxHeight: $(this).find("li").eq(0).height()*Math.ceil($(this).find("li").length/2) });
    });

    $("nav.catalogue>.items>ul>li").each(function() {
        if ($(this).find(".submenu").length>0){
            $(this).addClass('expandable');
            var sm = $(this).find(".submenu"), y1 = $(this).offset().top, y2 = sm.offset().top + sm.outerHeight();
            if (y2<y1) {
                sm.css({ transform: "translateY("+(y1-y2+$(this).outerHeight())+"px)" });
            }
            
        }
    });
    
    var onscr = function() {
        var t = $(window).scrollTop(), h = window.innerHeight;
        $("#-up-button").toggleClass("visible", t>h*2.5);
    }
    onscr();
    window.addEventListener('scroll', onscr);
    
    $("#-up-button").on("click", function(e){ 
        e.preventDefault();
        $("html,body").stop().animate({ scrollTop: 0 }, 300);
        return false;
    });

    window.addEventListener("click", function(ev) {
        var t = $(ev.target);
        if (!t.hasClass('-hover') && t.parents('.-hover').length==0) $("body>header .-hover").removeClass("-hover"), $(".-selected-element").removeClass("-selected-element");
        if (t.hasClass('expanded') || t.parents('.expanded').length>0) return true;
        $(".expanded:not(.changed):not(.selected)").removeClass('expanded');
        $("main").removeClass('order-list-expanded');
        if (!isBasketContext) {
            $(".-context").remove();
        } else isBasketContext = false;
        if (!t.hasClass("-delivery-description") && t.parents(".-delivery-description").length==0) {
            $(".-delivery-description").remove();
        }
    });

    $(".expandable>a").on("click", function(ev){
        if (!$("body").hasClass("--mobile")) return true;
        ev.preventDefault();
        $("nav.catalogue>.items .expanded").not($(this).parent()).removeClass('expanded');
        $(this).parent().toggleClass('expanded');
        return false;
    });

    $(document.body).on("click", ".-x-selector>.expander", function(ev) {
        ev.preventDefault();
        $(".-x-selector").not($(this).parent()).removeClass('expanded');
        $(this).parent().toggleClass('expanded');
		if ($(this).parent().hasClass("expanded")) {
            var u = $(this).parent().find('ul'), w = u.offset().left + u.outerWidth();
            if (w>window.innerWidth) {
                u.css({ transform: "translateX("+(window.innerWidth - w)+"px)" });
            }
        }
        return false;
    });
    $(document.body).on("click", ".-x-selector li", function(ev) {
        $(this).parents(".-x-selector").removeClass('expanded').data("value", $(this).data("value")).find(".expander").text($(this).text());
        return true;
    });
    $(".-x-selector").each(function() {
        var s = $(this).find(".selected");
        if (s.length==0) s = $(this).find("li").eq(0);
        s.trigger("click");
    });

    $(".-x-checkbox").on("click", function(ev) {
        ev.preventDefault();
        if ($(this).hasClass('disabled')) return false;
        if ($(this).parents(".single-selector").length>0) {
            var tmp = $(this).hasClass("checked");
            $(this).parents(".single-selector").find(".-x-checkbox.checked").removeClass('checked');
            if (tmp && $(this).parents(".c-optional").length>0) {
                $(this).removeClass('checked');
            } else {
                $(this).addClass("checked");
            }
        } else {
            $(this).toggleClass("checked");
        }
        if (typeof(recalculate)=="function") {
			 recalculate();
		  }
		  if (typeof(characteristicsRefresh)=="function") {
				characteristicsRefresh();
		  }
		  if (typeof(complectSubitemsQuantityRefresh)=="function") {
				complectSubitemsQuantityRefresh();
		  }
		  if (typeof(complectRefresh)=="function") {
				complectRefresh();
		  }
        if ($(this).parents("li").length>0) {
            $(this).parents("ul").find(".-x-check").removeClass("-x-check");
            if ($(this).hasClass("checked")) $(this).parents("li").addClass("-x-check");
        }
        return false;
    });

    $(".checkbox").on("click", function(ev) {
        ev.preventDefault();
        $(this).toggleClass('checked');
        if ($(this).parent().find(".acc").length>0) {
            $(this).parent().find(".acc").toggleClass("disabled", !$(this).hasClass("checked"));
            if ($(this).parent().find(".acc").hasClass('disabled')){
                $(this).parent().find(".acc input").attr('disabled', true);
            } else {
                $(this).parent().find(".acc input").attr('disabled', null).focus();
            }
        }

        $("a.save").removeClass('done');
        return false;
    });

    $(".-x-checkbox").each(function() {
        if ($(this).hasClass('checked') && $(this).parents('li').length>0) $(this).parents('li').addClass('-x-check');
    });


    $("form#search-top input").on("focus", function() {
        $("form#search-top").addClass("focus");
    }).on("blur", function() {
        $("form#search-top").removeClass("focus");
    });
    $("form#search-top").on("click", function() {
        $("form#search-top").addClass("focus").find("input[type=text]").focus();
    })


    $("a.scroll-top").on("click", function(ev) {
        ev.preventDefault();
        $("html,body").stop().animate({scrollTop: 0}, 200);
        return false;
    });

    window.items, window.ids, window.cnf = {}, window.isbtn = false;
    window.confirmNextShop = function(shop, resolve, reject) {
        var wh = window.innerWidth;
        var w = modalDialog({
            class: "basket-confirm-shop",
            width: wh>500?450:wh-80,
            onclose: function() {
                if (items.length>0 && isbtn) {
                    setTimeout(function() { confirmNextShop(items.shift(), resolve, reject); });
                } else if (isbtn) {
                    Basket.add(ids, 1, 1, cnf)
                        .then(function(data) {
                            resolve(data);
                        })
                        .catch(function(data) {
                            reject(data);
                        });
                } else {
                    reject(true);
                }
            }
        });
        w.append("<h6>"+shop.header+"</h2>");
        w.append("<div class='itm'><div class='img'><img src='"+shop.img+"'></div><div class='title'>"+shop.title+"</div></div>");
        w.append("<div class='btn' data-id='"+shop.id+"'></div>");
        var specifies = [];
        for (var i=0; i<shop.buttons.length; i++) {
            if (shop.buttons[i].type=="text") {
                w.find(".btn").append("<span data-key='"+shop.buttons[i].key+"'>"+shop.buttons[i].title+"</span>");
            } else {
                w.find(".btn").append("<a href='#' "+(shop.buttons[i].type!='button'?'class="'+shop.buttons[i].type+'" ':'')+"data-key='"+shop.buttons[i].key+"' data-sact='"+shop.buttons[i].sourceModalAction+"'>"+shop.buttons[i].title+"</a>");
            }
            if (Array.isArray(shop.buttons[i].specify) && shop.buttons[i].specify.length) {
                var sp = $("<div class='specify -key-"+shop.buttons[i].key+"'></div>");
                for (var j=0; j<shop.buttons[i].specify.length; j++) {
                    if (shop.buttons[i].specify[j].type=="text") {
                        sp.append("<span data-key='"+shop.buttons[i].specify[j].key+"'>"+shop.buttons[i].specify[j].title+"</span>");
                    } else {
                        sp.append("<a href='#' "+(shop.buttons[i].specify[j].type!='button'?'class="'+shop.buttons[i].specify[j].type+'" ':'')+"data-key='"+shop.buttons[i].specify[j].key+"' data-sact='"+shop.buttons[i].specify[j].sourceModalAction+"'>"+shop.buttons[i].specify[j].title+"</a>");
                    }
                }
                specifies.push(sp);
            }
        }
        for (var i=0; i<specifies.length; i++) {
            w.find(".btn").append(specifies[i]);
        }

        var img = new Image();
            img.onload = function() {
                w.css({height: ""});
            };
        img.src = shop.img;

        w.find(".btn a, div.specify a").on("click", function(ev) {
            ev.preventDefault();
            isbtn = true;
            if ($(this).hasClass("-cancel")) {
                isbtn = false;
            }
            if ($(this).data('action')) {
                eval($(this).data('action'));
            }

            var specify = w.find(".specify.-key-"+$(this).data("key"));
            if ($(this).parents(".specify").length) {
                cnf["specify_"+w.find(".btn").data("id")] = $(this).data("key");
            } else if (specify.length) {
                $(this).parent().find(">a").hide();
                specify.css({ display: "flex" });
                cnf[$(this).parent().data("id")] = $(this).data("key");
                return false;
            } else {
                cnf[$(this).parent().data("id")] = $(this).data("key");
            }
            console.log(">>!", cnf);
            
            if ($(this).data("sact") && $(".-overlay-win.basket-add-items").length>0) {
                switch($(this).data("sact")) {
                    case "close":
                        $(".-overlay-win.basket-add-items .-win-close").trigger("click");
                        break;
                    case "remove":
                        $(".-overlay-win.basket-add-items .manage a.delete").trigger("click");
                        break;
                    case "ok":
                        break;
                    default:
                        if ($(this).data("sact")*1 === parseInt($(this).data("sact"))) {
                            $(".-overlay-win.basket-add-items input[type=text]").val($(this).data("sact"));
                        }
                        break;
                }
            }
            w.find(".-win-close").trigger("click");
            return false;
        });
    }
    window.confirmShops = function(it, id) {
        cnf = {};
        return new Promise(function(resolve, reject) {
            items = it, ids = id;
            confirmNextShop(items.shift(), resolve, reject);
        });
    }

    var basketAddPushLength = false, cancelAddToBasket = false, addToBasketEv = false, isBasketContext = false;
    $(document.body).delegate(".add-to-basket", "mousedown touchstart", function(e) {
        cancelAddToBasket = false;
        basketAddPushLength = setTimeout(selectCurrentBasket, 500);
        addToBasketEv = e;
    });
    $(document.body).delegate(".add-to-basket", "mouseup touchend", function(e) {
        if (basketAddPushLength) clearTimeout(basketAddPushLength);
    });
    $(document.body).delegate(".add-to-basket", "contextmenu", function(e) {
        e.preventDefault;
        return false;
    });
    
    var selectCurrentBasket = function() {
        if (!$("body").hasClass("manager") 
            || $(".nav-bottom-panel .basket.empty").length
        ) return true;
        $(".-context").remove();
        cancelAddToBasket = !(basketAddPushLength = false);
        var context = $("<ul class='available-baskets'></ul>");
        if ($(".available-baskets").length) context = $(".available-baskets").clone();
        context.addClass("-context").append("<li class='current'></li>").append("<li><a data-id='-1'>в новую</a></li>");
        context.find(".current").append($(".nav-bottom-panel .basket:not(.empty)>a").clone());
        context.appendTo(document.body);
        setTimeout(function() {
            var el = $(addToBasketEv.target),
                x = el.offset().left,
                y = el.offset().top,
                w = context.outerWidth(),
                h = context.outerHeight();
            if (x-$(window).scrollLeft()+w > window.innerWidth) x = window.innerWidth - w;
            context.css({left: x, top: y});
        });
        
        isBasketContext = true;
        
        context.find("a").on("click", function(e) {
            e.preventDefault();
            var id = $(this).data("id");
            context.remove();
            $.post($_AJAX_PATHES.basket.update, { action: "select-current", id: id }, function(r) {
                cancelAddToBasket = false;
                $(addToBasketEv.target).trigger("click");
            });
            return false;
        });
    }
    
    $(document.body).delegate(".add-to-basket", "click", function(ev) {
			ev.preventDefault();
			if (cancelAddToBasket) return false;
            if (basketAddPushLength) clearTimeout(basketAddPushLength);
			var id = $(this).data("id"), count = 1, callback ;
			if ($("body").hasClass("complect") && $(this).parents(".analogs").length==0) {
				id = [id];
				var ch = $(".-x-checkbox.checked");
				for (var i=0; i<ch.length; i++) {
					if (ch.eq(i).parents("li").length==0) {
						id.push(ch.eq(i).parents(".complectation").prev().data("id"));
					} else {
						id.push(ch.eq(i).parents("li").data("id"));
					}
				}
			}

        if ($(this).data("callback")) callback = $(this).data('callback');
        if ($(this).data("count")) count = $(this).data("count");

        Basket.add(id, count, 1)
            .then(function(data) {
                if (data.onlyInShop.length>0)
                     return confirmShops(data.onlyInShop, id);
                else return data;
            })
            .then(function(data) {
                if (data.mode) {
                    switch(data.mode) {
                        case "items":
                        case "accessory":
                                if (!callback) {
                                    showModalItems(data.modalItems, data.mode, callback);
                                } else callback();
                            break;
                        case "install":
                                showInstallInfo(data.modal, callback);
                            break;
                        case "less":
                                showModalLess(data.modal, callback);
                            break;
						case "redates":
                                showModalDates(data.modal, callback);
                            break;
                    }
                } else callback();
            }).catch(function(data) {
                if (data===true) return data;
                alert(data.message);
            });
        return false;
    });

    $(".nav-bottom-panel .compare").delegate("li a.del", "click", function(ev) {
        ev.preventDefault();
        Basket.addCompare($(this).parents("li").data("id"), false, "group");
        return false;
    });

    var correctGalleryPosition = function(g) {
        var ci = g.find("img.current"), l = ci.position().left, sl = g.find(".viewport").scrollLeft()+l-($(window).width()-g.find("img.current").width())/2;
        g.find(".viewport").stop().animate({scrollLeft:sl}, 150);
    }


    $("section.gallery").each(function() {
        var $g = $(this), n = $g.find("img").length, lim = [0,0];
        if ($g.find("img").length<2) return false;
        $g.find("img").each(function() {
            $(this).clone().appendTo($(this).parent());
            lim[0]++;
            var i = new Image();
            i.onload=function() {
                lim[1]++;
                if (lim[0]==lim[1]) correctGalleryPosition($g);
            };
            i.src=$(this).attr('src');
        });
        $g.find("img").eq(0).addClass('current');
        for (var i=0;i<n/2;i++) {
            $g.find("img").eq(-1).prependTo($g.find(".viewport"));
        }
        correctGalleryPosition($g);
        $g.find(".board a").on("click", function(ev) {
            ev.preventDefault();
            var sl = $g.find(".viewport").scrollLeft();
            if ($(this).hasClass("left")) {
                sl +=  $g.find("img").eq(-1).width()+50;
                $g.find("img").eq(-1).prependTo($g.find(".viewport"));
                var el = $g.find("img.current").prev();
            } else {
                sl -=  $g.find("img").eq(0).width()+50;
                $g.find("img").eq(0).appendTo($g.find(".viewport"));
                var el = $g.find("img.current").next();
            }
            $g.find(".viewport").scrollLeft(sl);
            $g.find("img.current").removeClass("current");
            el.addClass('current');
            correctGalleryPosition($g);
            return false;
        });
        var _auto = 1;
        setInterval(function() {
            if (!_auto || $("html").hasClass("mobile")) return false;
            $g.find("a.right").trigger("click");
        }, 3000);
        $g.on("mouseenter", function() {
            _auto = 0;
        }).on("mouseleave", function() {
            _auto = 1;
        });


    var sx,sy,mx,my,dd, sl, $this = $(this).find(".viewport");
        $this[0].addEventListener("touchstart", function(ev) {
            if (ev.touches.length!=1) return true;
            sx = ev.touches[0].screenX, sy = ev.touches[0].screenY;
            mx = ev.touches[0].screenX, my = ev.touches[0].screenY;
            $this.stop();
            sl = $this.scrollLeft();
            dd = false;
        });
        $this[0].addEventListener("touchmove", function(ev) {
            if (ev.touches.length!=1) return true;
            mx = ev.touches[0].screenX, my = ev.touches[0].screenY;
            if (!dd && Math.abs(t)<Math.abs(d)) return true;
            var t = mx-sx, d = my-sy;
            if (Math.abs(t)>20) dd=true;
            if (!dd) return true;
            ev.preventDefault();
            $this.scrollLeft(sl-t);
        });
        $this[0].addEventListener("touchend", function(ev) {
            if (ev.touches.length!=1) return true;
            var t = mx-sx, d = my-sy;
//            if (!dd && Math.abs(t)<Math.abs(d)) return true;
            if (t<-20) $this.parent().find(".board .right").trigger("click");
            if (t>20) $this.parent().find(".board .left").trigger("click");
            if (Math.abs(t)<=20) correctGalleryPosition($this.parent());
        });
    });

    setPass();
    
    $("body").addClass("-initialized");
    
    
    $("#buy-by-click-window").on("click", function(e) {
        if ($(e.target).attr("id")=="buy-by-click-window") $("#buy-by-click-window .win .close").trigger("click");
    });
    $("#buy-by-click-window .header a").on("click", function(e) {
        e.preventDefault();
        $("#buy-by-click-window").fadeOut(300);
        if ($("#buy-by-click-window form").hasClass("done")) {
            setTimeout(function() {
                location.href="/";
            }, 200);
        }
        return false; 
    });
    
    $("body").on("click", ".order-by-click", function(e) {
        e.preventDefault();
        if ($(".-overlay").length>0) {
            $(".-overlay").remove();
        }   
        $("#buy-by-click-window").fadeIn(300).find("input[type=text]").val("").focus();
        $("#buy-by-click-window button").attr("disabled", true);
        $("#buy-by-click-window .win div.message").html("").hide();
        $("#buy-by-click-window form .submit").show();
        if ($(this).attr("data-itemid")) {
            $("#buy-by-click-window form").attr("data-itemid", $(this).attr("data-itemid"));
        }
        return false;
    });
    
    $("#buy-by-click-window .win span.field input[type=text]").on("keydown keyup", function(e) {
        if (!numberKeyIsValid(e)) {
            e.preventDefault();
            return false;
        }
        $(this).parents("form").find("button").attr("disabled", $(this).val().trim().match(/^\d{10}$/)  ?  null : true);
        return true;
    }).on("paste change input blur focus", function(e) {
        var t = $(this).val().trim().replace(/\D/g, '');
        $(this).val(t);
        $(this).parents("form").find("button").attr("disabled", $(this).val().trim().match(/^\d{10}$/)  ?  null : true);
        return true;
    });
    
    $("#buy-by-click-window .win form").on("submit", function(e) {
        e.preventDefault();
        $("#buy-by-click-window .win").addClass("disabled");
        $("#buy-by-click-window button").addClass("preloader");
        var inp = $(this).find("input"), data = {};
        for (var i=0; i<inp.length; i++) data[inp.eq(i).attr("name")] = inp.eq(i).val();
        
        if ($(this).attr("data-itemid")) {
            data.itemId = $(this).attr("data-itemid");
        }

        $.post( $(this).attr("action"), data, function(r) {
            $("#buy-by-click-window .win").removeClass("disabled");
            $("#buy-by-click-window button").removeClass("preloader"); 

            if (r.state=="ok") {
            
                var transaction_id = Date.now();
                if (r.transactionId) transaction_id = r.transactionId;

                var msg = r.message + "<div class='done-button'><button>OK</button></div>";
                if (typeof(ym)!="undefined") {
                    ym(45359406, 'reachGoal', 'TheOneClick', {});
                }
                
                try {

                dataLayer.push({
                    "event": "BuyOneClick",
                    "ecommerce": {
                        "purchase": {
                            "actionField": {
                                "id" : transaction_id
                            },
                            "products": [
                                {
                                    "id": data.itemId, // ID товара, заказанного в 1 клик
                                    "name": $("main h1").text(), // Наименование товара, заказанного в 1 клик
                                    "price": $(".-mng-chars ul li.-price b").text().replace(/\D/g, '')*1, // Цена товара (тип данных - num), заказанного в 1 клик
                                    "brand": "santehbaza", // Бренд товара, заказанного в 1 клик
                                    "category": $("section.breadscrumbs ul.path li a").eq(-1).text(), // Категория товара, заказанного в 1 клик
                                    "variant": "" // Вариант товара, заказанного в 1 клик
                                }
                            ]
                        }
                    }
                });
                
                } catch(e) { console.log("DataLayer..."); }
                
                $("#buy-by-click-window form").addClass("done");
                $("#buy-by-click-window form .submit").hide();
                $("#buy-by-click-window .win div.message").html(msg).show();
                
                $(".done-button button").on("click", function(e) {
                    e.preventDefault();
                    $(this).parents(".win").find(".close").trigger("click");
                    return false;
                });
            } else {
                alert(r.message);
            }
        });
        return false;
    });
    
});

var setPass = function() {
    $("input[type=password]").not(".-init").each(function() {
        $(this).wrap("<div class='-pss'></div>");
        $(this).addClass("-init");
        $(this).parent().append("<a href='#' class='-tgl'></a>");
        $(this).parent().find(".-tgl").on("click", function(ev) {
            ev.preventDefault();
            var inp = $(this).parent().find("input");
            if (inp.attr("type")=="text") {
                inp.attr("type", "password");
                $(this).removeClass("txt");
            } else {
                inp.attr("type", "text");
                $(this).addClass("txt");
            }
            return false;
        });
    });
}

var formatPrice = function(x) {
    var dec = Math.round((x - Math.floor(x))*100);
    if (dec<10) dec="0"+dec;
	var val = (x+"").replace(/^(.*)\..*$/, '$1').replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1 ');
    return val;
}

var modalDialog = function(props) {
    //    if ($(document.body).hasClass("overlayed")) return false;
    if (!document.body.ovl)
        document.body.ovl = 0;
    $(document.body).addClass("overlayed");
    document.body.ovl++;
    var cls = props.class ? props.class : ""
      , width = props.width || 400
      , height = props.height || 200
      , _onclose = function() {};
    if (typeof (props.onclose) == "function")
        _onclose = props.onclose;

    var back = $("<div class='-overlay'></div>");
    back.appendTo(document.body);
    var win = $("<div class='-overlay-win'></div>");
    if (cls != "")
        win.addClass(cls);
    win.appendTo(back);
    win.append("<a href='#' class='-win-close'></a>");
    win.find(".-win-close").on("click", function(ev) {
        ev.preventDefault();
        if (document.body.ovl)
            document.body.ovl--;
        _onclose();
        if (!document.body.ovl)
            $(document.body).removeClass("overlayed");
        win.parents(".-overlay").remove();
        if (typeof (window._less_queue) != 'undefined' && window._less_queue.length > 0) {
            if (!window._less_queue_step_flag)
                window._less_queue = [];
        }
        return false;
    });
    win.resize = function(h) {
        if (!h)
            h = 200;
        win.animate({
            height: h,
            marginTop: (h / -2) + "px"
        }, 200);
    }
    win.close = function() {
        win.find(".-win-close").trigger("click");
    }
    setTimeout(function() {
        if (height == -1) {
            height = win.height();
        }
        win.css({
            width: width,
            height: height,
            marginLeft: (width + 60) / -2,
            marginTop: (height + 60) / -2
        });
    }, 10);
    return win;
}

var formatNum = function(x) {
    var dec = Math.round((x - Math.floor(x))*100);
    if (dec<10) dec="0"+dec;
	var val = (x+"").replace(/^(.*)\..*$/, '$1').replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1 ');
    return val;
}


var setSwipe = function(obj,setMultiTouch) {
    if (obj.length==0) return false;
    var dx, dy, sls, sly, slx, bw = $(this).width(), ch = $(obj).find(">*"), LNS = 0, is_Multi;
    if (ch.length==1 && ch.find(">*").length>0) ch = ch.find(">*");
    $(obj)[0].addEventListener("touchstart", function(ev) {
        if (ev.touches.length>1) {
            is_Multi = true;
            if (typeof(setMultiTouch)=="function") return setMultiTouch("start", ev);
            return true;
        }
        is_Multi = false;

        $(this).finish();
        dx  =0;
        sls = $(this).scrollLeft(), slx = ev.touches[0].pageX, sly = ev.touches[0].pageY;
        return true;
    });
    $(obj)[0].addEventListener("touchmove", function(ev) {
        if (ev.touches.length>1) {
            is_Multi = true;
            if (typeof(setMultiTouch)=="function") return setMultiTouch("move", ev);
            return true;
        }

        dx = slx - ev.touches[0].pageX;
        dy = sly - ev.touches[0].pageY;
        if (Math.abs(dy)>Math.abs(dx)) {
            return true;
        }
        if (Math.abs(dy)<Math.abs(dx) && Math.abs(dx)>20) $(this).scrollLeft(sls+dx);
        else  $(this).scrollLeft(sls);
        if (typeof(obj.onmove)!="undefined") obj.onmove(this.scrollLeft);
        return false;
    });
    $(obj)[0].addEventListener("touchend", function(ev) {
        if (is_Multi) {
            if (typeof(setMultiTouch)=="function") return setMultiTouch("end", ev);
            is_Multi = false;
            return true;
        }
        
        

        var N = LNS, Z = -1;
        if (Math.abs(dx)>20) {
            if (dx>20) N+=1; else if (dx<-20) N-=1;
            if ($(obj).attr("id")!='scroll-nav' && $(obj).parent().find(".thumbs").length>0 && N>=0) {
                N = $(obj).parent().find(".thumbs li").index($(obj).parent().find(".thumbs li.selected"));
                if (dx>20) N+=1; else if (dx<-20) N-=1;
                $(obj).parent().find(".thumbs li").eq(N).trigger("click");
            } else {
                var fgvp = $(".full-gallery .viewport").length>0 ? $(".full-gallery .viewport").width() : $(obj).parent().find(".viewport").width();
                N = Math.round(/*$(obj).scrollLeft()*/ sls / fgvp);
                if (dx>20) N+=1; else if (dx<-20) N-=1;
                if ($(".full-gallery .viewport").length>0) {
                    var lf = $(".full-gallery .viewport").width()*N;
                } else {
                    var lf = $(obj).parent().find(".viewport").width()*N;
                }
                if ($(obj).parents(".-compact-delivery").length>0) {
                    if (lf<=0) {
                        lf+= window.innerWidth, $(obj).stop().scrollLeft($(obj).stop().scrollLeft()+window.innerWidth);
                        $(obj).find(">*").eq(-1).insertBefore($(obj).find(">*").eq(0));
                    } else if (lf>=($(obj).find(">*").length-1)*window.innerWidth) {
                        lf-= window.innerWidth, $(obj).stop().scrollLeft($(obj).stop().scrollLeft()-window.innerWidth);
                        $(obj).find(">*").eq(0).insertAfter($(obj).find(">*").eq(-1));
                    }
                    $(obj).parent().find("a.scroll").addClass("disabled");
                    setTimeout(function() {
                        $(obj).parent().find("a.scroll").removeClass("disabled");
                    }, 5);

                } else {
                    if (N==ch.length-1) lf+=50;
                    if (N<1) lf=0;
                }
                $(obj).stop().animate({scrollLeft: lf}, 200);
                if ($(obj).parent().find(".board").length>0) {
                    $(obj).parent().find(".board").addClass('started');
                    if (N>=ch.length-1) $(obj).parent().find(".board .right:not(.more)").hide(); else $(obj).parent().find(".board .right:not(.more)").show();
                    if (N<1) $(obj).parent().find(".board .left").hide(); else $(obj).parent().find(".board .left").show();
                }
            }
            LNS = N;
        }
        if (typeof(obj.onstop)!="undefined") obj.onstop(this.scrollLeft);
    });

}

assignAutoComplete = function(field, href, callback) {

    var getSearchRequest = function() {
        if (_tmo) clearTimeout(_tmo), _tmo = false;
        var t = $(this).val().trim();
        if (t.length<3 || $(this).filter(":focus").length==0) return true;
        var ac = field.next(".-autocomplete");
        if (ac.length==0) {
            ac = $("<div class='-autocomplete'><ul></ul></div>");
            ac.insertAfter(field);
        }
        $.get(href, { q: t }, function(data) {
            if (data.state!="ok" || data.items.length==0) {
                ac.remove();
                return true;
            }
            ac.find("ul").html("");
            for (var i=0; i<data.items.length; i++) {
                if (typeof(data.items[i].title)!="undefined") {
                    data.items[i].key = data.items[i];
                    if (!data.items[i].context) data.items[i].context = data.items[i].title;
                }
                if (typeof(data.items[i].key)!="undefined")  {
                    if ($("body").hasClass("cabinet") && $("body").hasClass("manager")) {
                        var rem = data.items[i].key.remains, remains = "";
                        remains += "<span class='place"+(rem.place==0?" empty":"")+"'>"+rem.place+" шт</span>";
                        remains += "<span class='store"+(rem.store==0?" empty":"")+"'>"+rem.store+" шт</span>";
                        if (rem.supplierDays) {
                            remains += "<span class='supplier'>"+rem.supplierDays+" "+getSuffix(rem.supplierDays, ["день", "дня", "дней"])+"</span>";
                        } else if (rem.supplier>0) {
                            var date = rem.arrival.replace(/^(\d+).(\d+).(\d+).*$/, '$3.$2');
                            remains += "<span class='supplier'>"+rem.supplier+" шт<i> к "+date+"</i></span>";
                        } else {
                            remains += "<span class='supplier empty'>0</span>";
                        }
                        ac.find("ul").append("<li><a class='-new'><span class='title'>"+data.items[i].context+"</span><span class='remains'>"+remains+"</span></a></li>");
                        ac.find("a.-new").data("key", data.items[i].key).removeClass("-new");
                    } else {
                        ac.find("ul").append("<li><a class='-new'>"+data.items[i].context+"</a></li>");
                        ac.find("a.-new").data("key", data.items[i].key).removeClass("-new");
                    }
                }
                else {
                    ac.find("ul").append("<li><a href='"+data.items[i].href+"'>"+data.items[i].context+"</a></li>");
                }
            }
            ac.find("a").on("click", function(ev) {
                ev.preventDefault();
                if ($(this).data("key")) {
                    $(field).val($(this).text());
					if (callback) return 0*callback.apply(this);
                } else {
                    $(field).val($(this).text()).addClass("fast-link");
                    $href = $(this).attr("href");
                    setTimeout(function() {
                        location.href = $href;
                    }, 20);
                }
                return false;
            });
        });
    }

    var _tmo = false, _rtm = false;
    $(field).on("keydown keyup focus paste change", function() {
        if (_rtm) clearTimeout(_rtm);
        var $this = this;
        _rtm = setTimeout(function() {
            getSearchRequest.apply($this);
        }, 750);
    }).on("blur", function() {
        _tmo = setTimeout(function() {
            if ($(field).hasClass("fast-link")) return true;
            var x = field.next(".-autocomplete");
            if (x.length>0) x.remove();
        }, $("body").hasClass("--mobile") ? 1500 : 750);
    });
}

Basket = {
    baskets: false,
    add: function(id, count, checkContext, confirmations) {
        if (typeof (confirmations) == "undefined")
            confirmations = 0;
        if (typeof (count) == "undefined")
            count = 1;
        if (typeof (checkContext) == "undefined")
            checkContext = false;
        return new Promise(function(resolve, reject) {
            try {
                var data = {
                    action: "add",
                    id: id,
                    count: count,
                    confirmations: confirmations
                };
                if (0 < $('.complect-part').length) {
                    data.complectGoods = [];
                    data.satelliteGoods = [];
                    $('.complect-part .-x-checkbox.checked').each(function() {
                        var _ = $(this);
                        var wr = _.closest('.complect-part');
                        if (wr.attr('data-id')) {
                            var productId = parseInt(wr.attr('data-id'));
                            if (wr.hasClass('satellite-part')) {
                                data.satelliteGoods.push(productId);
                            } else {
                                data.complectGoods.push(productId);
                            }
                        }
                    });
                }
                if (checkContext)
                    data["check-context"] = 1;

                $.get($_AJAX_PATHES.basket.add, data, function(data) {
                    Basket.redraw(data);
                    if (data.state == "ok") {
                        if (data.product && typeof(GaEcommerceHelper)!='undefined') {
                            var product = data.product;
                            GaEcommerceHelper.addProductToCart(product.id, product.name, product.category, product.brand, product.price, product.quantity);
                        }
                        return resolve(data);
                    } else
                        reject(data);
                });
            } catch (e) {
                reject(e);
            }
        }
        );
    },
    cascadeAdd: function(data) {
        var arts = {};
        if (typeof(data)=="string") data = data.split(",");
        for (var i in data) {
            if ((""+data[i]).trim()=="") continue;
            
            if (typeof(arts[data[i]])=="undefined") arts[data[i]]=1;
            else arts[data[i]]++;
        }
        data = [];
        for (var i in arts) data.push({ id: i, count: arts[i] });
//        for (var i=0;i<data.length;i++) if ((""+data[i].trim()).match(/^\d+$/)) data[i]*=1;
        
        var addNext = function() {
            $("a.-tmp-add").remove();
            if (data.length==0) {
                if (!$(".order-window").length) {
                    location.href = $_AJAX_PATHES.basket.basket_link;
                } else if (window.convertDraftToOrder) {
                    window.convertDraftToOrder();
                }
                return false;
            } 
            var nxt = data.shift();
            var lnk = $("<a href='#' class='add-to-basket -tmp-add' data-id='"+nxt.id+"' data-count='"+nxt.count+"' style='display:none;'></a>");
                lnk.data("callback", function() {
                    addNext();
                });
                lnk.appendTo("body");
                lnk[0].click();
        }
        addNext();
    },

    remove: function(id, silent) {
        if (typeof (silent) == "undefined")
            silent = false;
        if (!silent && !confirm("Удалить товар из корзины?"))
            return false;
        return new Promise(function(resolve, reject) {
            try {
                $.get($_AJAX_PATHES.basket.remove, {
                    action: "remove",
                    id: id
                }, function(data) {
                    Basket.redraw(data);
                    if (data.state == "ok") {
                        if (data.product) {
                            var product = data.product;
                            GaEcommerceHelper.removeProductFromCart(product.id, product.name, product.category, product.brand, product.price, product.quantity);
                        }
                        return resolve(data);
                    } else
                        reject(data);
                });
            } catch (e) {
                reject(e);
            }
        }
        );
    },
    changeCount: function(item_id, count, quantities) {
        return new Promise(function(resolve, reject) {
            try {
                var req = {
                    action: "change-count",
                    id: item_id,
                    count: count
                };
                if (quantities) {
                    req.Quantity = 0;
                    req.Store = quantities[0];
                    req.Place = quantities[1];
                    req.Supplier = quantities[2];
                }
                $.get($_AJAX_PATHES.basket.update, req, function(data) {
                    Basket.redraw(data);
                    if (data.state == "ok") {
                        if (data.product) {
                            var product = data.product;
                            if (0 < product.quantity) {
                                GaEcommerceHelper.addProductToCart(product.id, product.name, product.category, product.brand, product.price, product.quantity);
                            } else {
                                GaEcommerceHelper.removeProductFromCart(product.id, product.name, product.category, product.brand, product.price, -product.quantity);
                            }
                        }

                        return resolve(data);
                    } else
                        reject(data);
                });
            } catch (e) {
                reject(e);
            }
        }
        );
    },
    update: function(items) {
    },
    serviceCancel: function(id) {
        return new Promise(function(resolve, reject) {
            try {
                $.get($_AJAX_PATHES.basket.serviceCancel, {
                    action: "service-cancel",
                    id: id
                }, function(data) {
                    Basket.redraw(data);
                    if (data.state == "ok")
                        return resolve(data);
                    else
                        reject(data);
                });
            } catch (e) {
                reject(e);
            }
        }
        );
    },
    get: function() {
    },
    addCompare: function(id, add, isgroup) {
        // add - boolean true->add, false->remove
        if (typeof (add) == "undefined")
            add = true;
        return new Promise(function(resolve, reject) {
            if (typeof (isgroup) == "undefined")
                isgroup = false;
            $.get($_AJAX_PATHES.compareManage, {
                action: add ? "add" : "remove" + (isgroup ? "-group" : ""),
                id: id
            }, function(data) {
                if (data.id == id && data.state == "ok") {
                    if (data.groups.length > 0) {
                        var ul = $("<ul></ul>")
                          , N = 0;
                        $(".nav-bottom-panel .compare").removeClass("empty").html("<span>Сравнить (<b></b>)</span><div class='popup'></div>");
                        for (var i = 0; i < data.groups.length; i++) {
                            var li = $("<li data-id='" + data.groups[i].id + "'><a href='" + data.groups[i].link + "'>" + data.groups[i].title + " (" + data.groups[i].count + ")</a><a href='#' class='del'></a></li>");
                            ul.append(li);
                            N += data.groups[i].count * 1;
                        }
                        ul.appendTo($(".nav-bottom-panel .compare .popup"));
                        $(".nav-bottom-panel .compare>span b").text(N);
                    } else {
                        $(".nav-bottom-panel .compare").addClass("empty").html("");
                    }
                    return resolve(data.added);
                }
                return reject();
            });
        }
        );
    },
    redraw: function(data) {
        if (data.pixel && $("#pixel-script").length==0) {
            $(document.body).append(data.pixel);
        }
        if (typeof(data.items) == "undefined" && typeof(data.basketAmount)=="undefined")
            return false;
        var total = 0;
        if (typeof(data.items)!="undefined") {
            for (var i in data.items)
                total += +(+data.items[i].price) * (+data.items[i].count);
        } else {
            total = data.basketAmount || data.total_amount;
        }
        
        $(".nav-bottom-panel .basket").toggleClass("empty", total * 1 == 0);
        $("body>header").toggleClass("-no-basket", total * 1 == 0);
        if (total * 1 == 0) {
            $(".nav-bottom-panel .basket").html("<a>пусто</a>");
            $(".top-basket-el").html("");
        } else {
            $(".nav-bottom-panel .basket").html('<a '+(data.basketId ? 'data-id="'+data.basketId+'" ':'')+'href="' + $_AJAX_PATHES.basket.basket_link + '"><strong>' + formatNum(total) + '</strong> <span class="rub">р</span></a>');
            if (data.baskets) {
                var sub = $("<ul class='available-baskets'></ul>"),
                    baskets = data.baskets;
                if (typeof(baskets.length)!="undefined") Object.assign(baskets, data.baskets);
                for (var i in baskets) {
                    sub.append("<li><a data-id='"+i+"' href='"+$_AJAX_PATHES.basket.basket_link+"?basket_id="+i+"'>"+formatNum(data.baskets[i])+" <span class='rub'>р</span></a></li>");
                }
                sub.appendTo(".nav-bottom-panel .basket");
            }
            $(".top-basket-el").html(formatNum(total) + " <span class='rub'>р</span>");
        }
    }
}

var orderActionVariants = function(details) {
    return new Promise(function(resolve, reject) {
        var wh = window.innerWidth
          , whg = window.innerHeight
          , resolved = false;
        var w = modalDialog({
            class: "cabinet-action-variants",
            width: wh <= 400 ? 400 : 450,
            height: -1,
            onclose: function() {
                if (!resolved)
                    resolve("stay");
            }
        });
        w.append("<h6>" + details.header + "</h6>");

        w.append("<div class='-content'>" + details.content + "</div>");

        var $bt = $("<div class='-win-buttons -small'></div>");
        w.append($bt);
        for (var i = 0; i < details.buttons.length; i++) {
            $bt.append("<button data-value='" + details.buttons[i].id + "' class='-short'>" + details.buttons[i].value + "</button>");
        }
        // <button data-value='agreement' class='-confirm -active'>"+details.agreement+"</button><button data-value='cancel' class='-cncel'>"+details.cancel+"</button>
        w.find("button").on("click", function(e) {
            resolved = true;
            w.find(".-win-close").trigger("click");
            resolve({
                t: $(this).data("value"),
                a: details.actionId
            });
        });
    }
    );
}

var orderActionDeliveryChanged = function(details) {
    return new Promise(function(resolve, reject) {
        var wh = window.innerWidth
          , whg = window.innerHeight
          , resolved = false;
        var w = modalDialog({
            class: "cabinet-action-delivery-changed",
            width: wh <= 400 ? 340 : 550,
            height: -1,
            onclose: function() {
                if (!resolved)
                    resolve("stay");
            }
        });
        w.append("<h6>" + details.header + "</h6>");
        var lst = $("<div class='-list'></div>");
        lst.appendTo(w);
        for (var i = 0; i < details.groups.length; i++) {
            lst.append("<h5>" + details.groups[i].header + "</h5>");
            var grp = $("<ul class='-group'></ul>");
            lst.append(grp);
            for (var j in details.groups[i].items) {
                var itm = details.groups[i].items[j];
                grp.append("<li><em>" + j + "</em>" + itm + "</li>");
            }
        }
        w.append("<div class='-win-buttons'><button data-value='agreement' class='-confirm -active'>" + details.agreement + "</button><button data-value='cancel' class='-cncel'>" + details.cancel + "</button></div>");
        w.find("button").on("click", function(e) {
            resolved = true;
            w.find(".-win-close").trigger("click");
            resolve($(this).data("value"));
        });
    }
    );
}

var setInputButtons = function(obj) {
    if (obj.hasClass("initialized"))
        return true;
    obj.addClass("initialized");
    obj.parent().append("<a href='#' class='change dec'></a><a href='#' class='change inc'></a>");
    if (typeof (obj.attr("min")) == "undefined")
        obj.attr('min', 1);
    if (typeof (obj.attr("max")) == "undefined")
        obj.attr('min', 99);
    obj[0].recalculate = function(sup) {
        var $this = $(this);
        if ($this.val() * 1 < $this.attr("min"))
            $this.val($this.attr("min"));
        if ($this.val() * 1 > $this.attr("max"))
            $this.val($this.attr("max"));
        $this.parent().find(".dec").toggleClass("disabled", $this.val() * 1 <= $this.attr("min"));
        $this.parent().find(".inc").toggleClass("disabled", $this.val() * 1 >= $this.attr("max"));
        var price = $this.parents(".price").data("price") * 1
          , discounted = $this.parents(".price").data("discounted") * 1
          , amount = price * $this.val()
          , amountD = discounted * $this.val();
        if (!discounted) discounted = 0;
        $this.parents(".price").find("strong").eq(0).find("span:not(.rub)").text(formatNum(amount));
        if (discounted) $this.parents(".price").find("strong").eq(1).find("span:not(.rub)").text(formatNum(amountD));
        if (typeof (totalRecalc) == "function")
            totalRecalc();
        if (typeof ($this.data("item")) != "undefined" && $this.hasClass("--init")) {

            // check remains
            var remains = $this.data("remains")
              , inbsk = $this.data("inbsk")
              , count = $this.val() * 1
              , qu = $this.data("queue")
              , arrival = $this.data("arrival")
              , direction = $this.data("lastval") < count ? 1 : -1
              , fixval = true;
            if ($this.data("lastval") * 1 == count * 1)
                return false;
            if (remains) {
                if (direction < 0) {
                    var k = qu.pop();
                    inbsk[k]--;
                } else {
                    if (inbsk[0] < remains[0]) {
                        qu.push(0);
                        inbsk[0]++;
                    } else if (inbsk[1] < remains[1] && !sup) {
                        var x = $(this).parents("li").find(".title a")
                          , src = $this.parents("li").find(".image img").attr("src");
                        if (!src) {
                            src = $this.data("data")[0].image;
                        }
                        if (x.length == 0) {
                            x = $("<span>" + $this.data("data")[0].title + "</span>");
                        }
                        var but = [{
                            id: "b1",
                            value: "С витрины"
                        }];
                        if (remains[2] - inbsk[2] > 0) {
                            var ddt = arrival.split("-");
                            but.push({
                                id: "b2",
                                value: "Под заказ (" + ddt[2] + "." + ddt[1] + ")"
                            });
                        } else {
                            but[0].value = "Продать с витрины";
                            but.push({
                                id: "b3",
                                value: "Нет, не продавать"
                            });
                        }
                        fixval = false;
                        orderActionVariants({
                            header: "Как будем продавать?",
                            actionId: 0,
                            content: "<img src='" + src + "'><p>" + x.text() + "</p>",
                            buttons: but
                        }).then(function(d) {
                            switch (d.t) {
                            case "b1":
                                $this.data("lastval", count);
                                qu.push(1);
                                inbsk[1]++;
                                $this[0].recalculate();
                                Basket.changeCount($this.data("item"), $this.val(), inbsk);
                                break;
                            case "b2":
                                $this[0].recalculate(true);
                                break;
                            default:
                                $this.val(count - 1);
                                $this[0].recalculate();
                                break;
                            }
                            $this.data("inbsk", inbsk).data("queue", qu);
                        });

                        return false;
                    } else if (remains[2] - inbsk[2] > 0) {
                        if (inbsk[2] > 0) {
                            qu.push(2);
                            inbsk[2]++;
                        } else {
                            var d0 = arrival.split("-")
                              , d = d0[2] * 1 + " " + monthes[d0[1] * 1]
                              , itl = {}
                              , ttl = $this.parents("li").find(".title a")
                              , art = $this.parents("li").find(".article").text().replace(/Артикул\s*/i, '');
                            if (ttl.length == 0) {
                                ttl = $("<span>" + $this.data("data")[0].title + "</span>");
                            }
                            if (!art) {
                                art = $this.data("data")[0].item_id;
                            }
                            itl[art] = ttl.text();
                            orderActionDeliveryChanged({
                                header: "Заказ целиком возможно отгрузить только " + d,
                                setDate: remains.arrival,
                                groups: [{
                                    header: "Отгрузка " + d,
                                    items: itl
                                }],
                                agreement: "Срок устраивает, сохранить",
                                cancel: "Нет, вернуться к редактированию"
                            }).then(function(d) {
                                switch (d) {
                                case "agreement":
                                    $this.data("lastval", count);
                                    qu.push(2);
                                    inbsk[2]++;
                                    $this[0].recalculate();
                                    Basket.changeCount($this.data("item"), $this.val(), inbsk);
                                    break;
                                case "cancel":
                                case "stay":
                                    $this.val(count - 1);
                                    $this[0].recalculate();
                                    break;
                                }
                                $this.data("inbsk", inbsk).data("queue", qu);
                            });

                            return false;
                        }
                    }
                }
            }

            if (fixval)
                $this.data("lastval", count);
            Basket.changeCount($this.data("item"), $this.val(), inbsk);
        }
    }
    obj[0].recalculate();
    obj.on("keyup keydown", function(ev) {
        if (ev.which == 13 && ev.type == "keydown") {
            return true;
        }
        if (!numberKeyIsValid(ev)) {
            ev.preventDefault();
            return false
        }
        this.recalculate();
    }).on("change", function(ev) {
        if ($(this).val().match(/\D/))
            $(this).val($(this).val().replace(/\D/g, ''));
    }).on("paste", function(ev) {
        var $this = $(this);
        setTimeout(function() {
            if ($this.val().match(/\D/))
                $this.val($this.val().replace(/\D/g, ''));
        }, 5);
    });
    obj.parent().find("a.change").on("click", function(ev) {
        ev.preventDefault();
        var s = 1
          , i = $(this).parent().find("input");
        if ($(this).hasClass('dec'))
            s *= -1;
        i.val(i.val() * 1 + s);
        i[0].recalculate();
        return false;
    });
    obj.addClass("--init");
}

var numberKeyIsValid = function(ev) {
    if (ev.ctrlKey)
        return true;
    if (ev.which < 32 || ev.which == 46 || ev.which > 47 && ev.which < 58 && !ev.shiftKey || ev.which >= 37 && ev.which <= 40 || ev.which >= 33 && ev.which <= 36 || ev.which >= 96 && ev.which <= 105)
        return true;
    return false;
}

showModalItems = function(data, mode, callback ) {
    var wh = window.innerWidth;
    if (!data) return 0*(callback?callback():0);
    if (typeof (data.accessory) != "undefined" && wh < 800)
        return 0*(callback?callback():0);
    var w = modalDialog({
        class: "basket-add-items",
        width: wh > 800 ? 750 : wh - 80
    });
    w.append("<h2>Товар добавлен в корзину</h2>");

    for (var i = 0; i < data.length; i++) {
        var item = data[i];
        w.append("<div class='added-item'><div class='image'><img src='" + item.image + "'></div><div class='title'>" + item.title + "</div><div class='manage price' data-price='" + item.price + "'><div class='count'><input data-item='" + item.item_id + "' type='text' maxlength='2' value='" + item.count + "' min='" + item.min + "' max='" + item.max + "'></div><div class='amount'><strong><span>" + formatNum(item.price) + "</span> <span class='rub'>р</span></strong><a href='#' class='delete' data-id='" + item.item_id + "'>удалить</a></div></div></div>");
        var _inp = w.find(".count input");
        try {
            var remains = item.remains
              , inbsk = item.inbsk;
            inbsk.forEach(function(v, i) {
                inbsk[i] = v * 1;
            });
            remains.forEach(function(v, i) {
                remains[i] = v * 1;
            });
            _inp.val(inbsk[0] + inbsk[1] + inbsk[2]);
            _inp.data("lastval", _inp.val());
            _inp.attr("max", remains[0] + remains[1] + remains[2] + inbsk[0] + inbsk[1] + inbsk[2]);
            _inp.data("remains", remains);
            _inp.data("inbsk", inbsk);
            _inp.data("arrival", item.arrival);
            _inp.data("data", data);
            var qu = [];
            for (var j = 0; j < 3; j++) {
                for (var i2 = 0; i2 < inbsk[j]; i2++)
                    qu.push(j);
            }
            _inp.data("queue", qu);
            _inp.attr("readonly", true);
        } catch (e) {}
    }

    setInputButtons($("div.-overlay-win.basket-add-items .added-item .manage .count input"));
    w.find(".added-item .delete").on("click", function(ev) {
        Basket.remove(data.item_id).then(function() {
            w.find(".-win-close").eq(0).trigger("click");
        }).catch(function() {});
    });
    data = data[0];
    if (mode == "items") {
        if (data.items.length > 0) {
            w.append("<div class='go-order'><a href='" + $_AJAX_PATHES.basket.set_order_link + "'>Оформить заказ</a></div>");
            w.append("<h2>Ничего не забыли?</h2>");
            var it = $("<ul class='goods'></ul>");
            for (var i = 0; i < data.items.length; i++) {
                var item = data.items[i];
                var li = $("<li data-id='" + item.id + "'><a class='title'><div class='image'><img src='" + item.image + "'></div><span>" + item.title + "</span></a><div class='price'><strong>" + formatNum(item.price) + " <span class='rub'>р</span></strong><a href='#' class='add'>в корзину</a><a href='#' class='del'>отменить</a></div></li>");
                li.appendTo(it);
            }
            it.appendTo(w);

        } else {
            setTimeout(function() {
                $(".basket-add-items").each(function() {
                    var mt = $(this).outerHeight() / -2;
                    $(this).css({
                        marginTop: mt + "px",
                        top: "50%"
                    });
                });
            }, 50);
        }

        $("div.-overlay-win.basket-add-items").addClass("no-addd");
        setTimeout(function() {
            $(".basket-add-items").each(function() {
                var h1 = $(this).find(".added-item .title").outerHeight() + 40;
                //                        $(this).find(".added-item .image").css({height:h1});
                //                        $(this).find(".added-item .image img").css({maxHeight:h1+"px"});
            });
        }, 30);

        w.append("<div class='bottom-buttons'><a href='#' class='close'>Продолжить покупки</a><a href='" + $_AJAX_PATHES.basket.set_order_link + "' class='set-order'>Оформить заказ</a></div>");
        if (!$("body").hasClass("manager")) {
            w.append("<div class='-ordbyclick'><a href='#' class='order-by-click'>Купить в один клик</a></div>");        
        }

        w.find(".goods .add").on("click", function(ev) {
            var $this = $(this);
            $this.css({
                display: "none"
            });
            Basket.add($this.parents("li").data("id")).then(function() {
                $this.css({
                    display: ""
                });
                $this.parents("li").addClass('added');
                return 0*(callback?callback():0)
            }).catch(function() {
                $this.show();
            });
        });
        w.find(".goods .del").on("click", function(ev) {
            var $this = $(this);
            $this.css({
                display: "none"
            });
            Basket.remove($this.parents("li").data("id"), true).then(function() {
                $this.css({
                    display: ""
                });
                $this.parents("li").removeClass('added');
            }).catch(function() {
                $this.show();
            });
        });
        w.find(".bottom-buttons .close").on("click", function(ev) {
            ev.preventDefault();
            $(".-overlay .-win-close").trigger("click");
            callback?callback():function(){};
            return false;
        });
        w.find(".bottom-buttons .set-order").on("click", function(ev) {
            if (callback) {
                ev.preventDefault();
                $(".-overlay .-win-close").trigger("click");
                callback();
                return false;
            }
            return true;
        });

        setTimeout(function() {
            var h = w[0].scrollHeight - 20;
            w.css({
                height: h,
                marginTop: 0,
                top: 30
            });
        }, 40);
    } else {
        w.addClass("accessory");
        w.append("<div class='add-accessory'><div class='placeholder'><span>" + data.accessory.placeholder + "</span></div></div>");
        w.append("<div class='bottom-buttons'><a href='#' class='close'>Продолжить покупки</a><a href='" + $_AJAX_PATHES.basket.set_order_link + "' class='set-order'>Оформить заказ</a></div>");

        if (!$("body").hasClass("manager")) {
            w.append("<div class='-ordbyclick'><a href='#' class='order-by-click'>Купить в один клик</a></div>");        
        }
        
        w.find(".add-accessory").append("<div class='acc-block'><div class='image'><img src='" + data.accessory.image + "'></div></div>");
        w.find(".acc-block").append("<div class='acc-content'><div class='top'><div class='title'><a href='" + data.accessory['item-link'] + "'>" + data.accessory.title + "</a><br><span>" + data.accessory["discount-text"] + "</span></div><div class='price'><strong>" + data.accessory["discount-price"] + " <span class='rub'>р</span></strong><strong>" + data.accessory["price"] + " <span class='rub'>р</span></strong></div></div></div></div>");
        w.find(".acc-content").append("<div class='buy-block'><a href='#' class='cancel'>Спасибо, не надо</a><a href='#' class='add'>Добавить в корзину</a></div>");

        w.find(".buy-block .cancel").on("click", function(ev) {
            ev.preventDefault();
            var _h0 = w.find(".add-accessory").outerHeight();
            w.find(".add-accessory").remove();
            setTimeout(function() {
                var h = w[0].scrollHeight - 90 - _h0;
                w.css({
                    height: h,
                    marginTop: (-h / 2) + "px"
                });
            });

            return false;
        });
        w.find(".buy-block .add").on("click", function(ev) {
            ev.preventDefault();
            if ($(this).hasClass('disabled'))
                return false;
            $(this).addClass("disabled");
            $(this).next().hide();
            var $this = $(this);
            Basket.add(data.accessory.id, 1).then(function(data) {
                $this.removeClass('disabled');
                $this.next().show();
                $("div.-overlay-win .-win-close").trigger("click");
                if (callback) callback();
            }).catch(function(data) {
                $this.removeClass('disabled');
                $this.next().show();
                if (callback) callback();
            })
            return false;
        });

        w.find(".bottom-buttons .close").on("click", function(ev) {
            w.find(".-win-close").eq(0).trigger("click");
        });

        setTimeout(function() {
            var h = w[0].scrollHeight - 50;
            w.css({
                height: h,
                marginTop: (-h / 2) + "px"
            });
        });
    }

}

showInstallInfo = function(data, callback) {
    var wh = window.innerWidth;
    var w = modalDialog({
        class: "basket-add-install",
        width: wh > 800 ? 520 : wh - 50
    });
    w.append("<h2>" + data.title + "</h2>");
    w.append("<div class='image'><img src='" + data.image + "'></div>");
    w.append("<div class='content'>" + data.content + "</div>");
    w.find(".content").append("<div class='x-buttons'><a href='#' class='agree'>" + data['agree-text'] + "</a><a href='#' class='cancel'>" + data["cancel-text"] + "</a></div>");

    w.find(".x-buttons .cancel").on("click", function(ev) {
        ev.preventDefault();
        $("div.-overlay-win .-win-close").trigger("click");
        return false;
    });
    w.find(".x-buttons .agree").on("click", function(ev) {
        ev.preventDefault();
        if ($(this).hasClass("disabled"))
            return false;
        $(this).addClass('disabled');
        $(this).next().hide();
        var $this = $(this);
        Basket.add(data.id, data.count).then(function(data) {
            $this.removeClass('disabled');
            $this.next().show().trigger("click");
            if (callback) callback();
        }).catch(function(data) {
            $this.removeClass('disabled');
            $this.next().show();
            if (callback) callback();
        });
        return false;
    });

    setTimeout(function() {
        var h = w[0].scrollHeight - 50;
        w.css({
            height: h,
            marginTop: (-h / 2) + "px",
            marginLeft: "-190px"
        });
    });
}

showModalDates = function(data) {
    var wh = window.innerWidth;
    var w = modalDialog({
        class: "basket-add-less -redates",
        width: wh > 800 ? 430 : wh - 40
    });
    $("div.-overlay").addClass("-scrollable").css({
        height: $("body").outerHeight() + "px"
    });
    $("body,html").scrollTop(0);
    w.append("<div class='header'>" + data.title + "</div><div class='-contents'>" + data.items_html + "</div>");
    w.append("<div class='variants'><ul></ul></div>");
    w.find(".header a.expand-items").on("click", function(e) {
        e.preventDefault();
        $(this).hide();
        $(".basket-add-less.-redates .-contents").addClass('-expanded');
        return false;
    });

    for (var i in data.variants) {
        var vr = data.variants[i];
        var li = $("<li data-id='" + i + "'><em></em><h5>" + vr.title + "</h5><p>" + vr.details + "</p></li>");
        li.appendTo(w.find(".variants ul"));
    }

    w.find(".variants ul li").on("click", function(ev) {
        $(this).parent().find("li").removeClass('selected');
        $(this).addClass('selected');
    }).eq(0).addClass('selected');

    w.append("<div class='continue-block'><a href='#'>Продолжить</a></div>");

    w.find(".continue-block a").on("click", function(ev) {
        ev.preventDefault();
        if ($(this).hasClass('disabled'))
            return false;
        $(this).addClass('disabled');
        var $this = $(this)
          , $$id = w.find(".variants .selected").data("id")
          , $$item_id = 0;
        if (typeof (data.id) != "undefined")
            $$item_id = data.id;
        $.post($_AJAX_PATHES.basket.setLessVariant, {
            action: "less-variant",
            id: $$id,
            item_id: $$item_id
        }, function(data) {
            if (data.state == "ok") {
                if (typeof (window._less_queue) != 'undefined' && window._less_queue.length > 0) {
                    window._less_queue_step_flag = true;
                    $("div.-overlay-win .-win-close").trigger("click");
                    window._less_queue_step_flag = false;
                    setTimeout(window._less_queue_step, 150);
                } else {
                    $this.removeClass("disabled");
                    $("div.-overlay-win .-win-close").trigger("click");
                    if (callback) callback();
                }
            } else {
                $this.removeClass("disabled");
            }
        });
        return false;
    });

}

showModalLess = function(data) {
    var wh = window.innerWidth;
    var w = modalDialog({
        class: "basket-add-less",
        width: wh > 800 ? 430 : wh - 40
    });
    w.append("<div class='header'><div class='image'><img src='" + data.image + "'></div><div class='title'><p>" + data.title + "</p><div class='block'><h4>" + data["content-title"] + "</h4><p>" + data.content + "</p></div></div>");
    w.append("<div class='variants'><ul></ul></div>");

    for (var i in data.variants) {
        var vr = data.variants[i];
        var li = $("<li data-id='" + i + "'><em></em><h5>" + vr.title + "</h5><p>" + vr.details + "</p></li>");
        li.appendTo(w.find(".variants ul"));
    }

    w.find(".variants ul li").on("click", function(ev) {
        $(this).parent().find("li").removeClass('selected');
        $(this).addClass('selected');
    }).eq(0).addClass('selected');

    w.append("<div class='continue-block'><a href='#'>Продолжить</a></div>");

    w.find(".continue-block a").on("click", function(ev) {
        ev.preventDefault();
        if ($(this).hasClass('disabled'))
            return false;
        $(this).addClass('disabled');
        var $this = $(this)
          , $$id = w.find(".variants .selected").data("id")
          , $$item_id = 0;
        if (typeof (data.id) != "undefined")
            $$item_id = data.id;
        $.post($_AJAX_PATHES.basket.setLessVariant, {
            action: "less-variant",
            id: $$id,
            item_id: $$item_id
        }, function(data) {
            if (data.state == "ok") {
                if (typeof (window._less_queue) != 'undefined' && window._less_queue.length > 0) {
                    window._less_queue_step_flag = true;
                    $("div.-overlay-win .-win-close").trigger("click");
                    window._less_queue_step_flag = false;
                    setTimeout(window._less_queue_step, 150);
                } else {
                    $this.removeClass("disabled");
                    $("div.-overlay-win .-win-close").trigger("click");
                    if (callback) callback();
                }
            } else {
                $this.removeClass("disabled");
            }
        });
        return false;
    });

    setTimeout(function() {
        var h = w[0].scrollHeight - (wh > 800 ? 50 : 10);
        w.css({
            height: h,
            marginTop: (-h / 2) + "px",
            marginLeft: "-190px"
        });
    });
}

var initScroll = function() {
    var IX = 0;
    if ($("#scroll-nav").length == 0) {
        var scpane = $("<div id='scroll-nav' class='hidden'><span class='left hidden'></span><span class='right'></span></div>")
          , sc = $("*[data-menu]");
        scpane.appendTo(document.body);
        $(document.body).attr("id", "x-root");
        for (var i = 0; i < sc.length; i++) {
            if (!sc.eq(i).data("menu"))
                continue;
            var p = $("<a href='#' class='item'>" + sc.eq(i).data("menu") + "</a>");
            var id = sc.eq(i).prev().attr("id");
            if (typeof (id) == "undefined")
                id = sc.eq(i).data("for");
            if (typeof (id) == "undefined")
                id = "x-root";
            p.attr("data-id", id);
            p.appendTo(scpane);
            if (IX == 0)
                p.addClass("current");
            IX++;
        }
    } else {
        scpane = $("#scroll-nav");
    }
    setSwipe(scpane);
    scpane.find(">span").on("click", function(ev) {
        ev.preventDefault();
        if (!$(document.body).hasClass('cabinet')) {
            var st = 100
              , scr = $(this).parent().scrollLeft();
            if ($(this).hasClass('left'))
                st *= -1;
            $(this).parent().stop().animate({
                scrollLeft: scr + st
            }, 50);
            $(this).parent().find(".left").toggleClass("hidden", (scr + st <= 0));
            $(this).parent().find(".right").toggleClass("hidden", (scr + st >= $(this).parent()[0].scrollWidth - 400));
        } else {
            var st = 100
              , scr = $(this).parent().find("ul").scrollLeft();
            if ($(this).hasClass('left'))
                st *= -1;
            $(this).parent().find("ul").stop().animate({
                scrollLeft: scr + st
            }, 50);
            $(this).parent().find(".left").toggleClass("hidden", (scr + st <= 0));
            $(this).parent().find(".right").toggleClass("hidden", (scr + st >= $(this).parent().find("ul")[0].scrollWidth - 400));
        }
        return false;
    });
    if (!$(document.body).hasClass('cabinet')) {
        scpane.find("a").on("click", function(ev) {
            ev.preventDefault();
            var id = $(this).data("id");
            var fst = $("#" + id).offset().top + $('body').scrollTop();
            if (!_menu_no_scroll)
                $("body").stop().animate({
                    scrollTop: fst - 120
                });
            $(this).parent().find(".current").removeClass("current");
            $(this).addClass("current");
            if ($(this).offset().left < 50) {
                $(this).parent().stop().animate({
                    scrollLeft: $(this).parent().scrollLeft() + $(this).offset().left - 50
                }, 100);
            }
            if ($(this).offset().left + $(this).outerWidth() > 350) {
                $(this).parent().stop().animate({
                    scrollLeft: $(this).parent().scrollLeft() + ($(this).offset().left + $(this).outerWidth() - 350)
                }, 100);
            }
            var st = 0
              , scr = $(this).parent().scrollLeft();
            $(this).parent().find(".left").toggleClass("hidden", (scr + st <= 0));
            $(this).parent().find(".right").toggleClass("hidden", (scr + st >= $(this).parent()[0].scrollWidth - 400));

            return false;
        });
        if (scpane.find("a").length == 0)
            scpane.remove();
    }
}

var format_price = function(price) {
    var s = new String(price);
    var sInt = s;
    var sFloat = '';
    var dot = s.indexOf('.');
    if (0 <= dot) {
        var sInt = s.substring(0, dot);
        var sFloat = s.substr(dot);
        if (2 == sFloat.length)
            sFloat += '0';
    }
    var arr = sInt.split('');
    var res = [];
    for (var i = 0, length = arr.length; i < length; i++) {
        res.push(arr[i]);
        if ((length > (i + 1)) && (0 == ((length - i - 1) % 3)))
            res.push(' ');
    }
    return res.join('') + sFloat;
}

var setShowcaseSale = function(productId) {
//    console.log('setShowcaseSale', productId);
}

var decrementBasketQuantity = function(productId) {
//    console.log('decrementBasketQuantity', productId);
    $('.basket-items li[data-id="' + productId + '"] .change.dec').click();
}

var setMapPointer = function(li) {
	if (typeof(orderMap)=="undefined" || !orderMap) {
        return setTimeout(function() { setMapPointer(li) }, 50);
    }
    var coords = li.data("coords");
    if (typeof (coords) == "string")
        coords = coords.split(",");
    if (typeof (ymaps.geocode) == "undefined")
        return setTimeout(function() {
            setMapPointer(li);
        });
    if (coords.length != 2) {
        var myGeocoder = ymaps.geocode(li.text());
        if (__ != '')
            __.geoObjects.remove();
        myGeocoder.then(function(res) {
            __ = res;
            orderMap.geoObjects.add(res.geoObjects);
            var c = res.geoObjects.getBounds()[0];
            orderMap.setCenter(c);
            orderMap.setZoom(14);
            li.data("coords", c);
        }, function(err) {// обработка ошибки
        });
    } else {
        var mo = new ymaps.GeoObject({
            geometry: {
                type: "Point",
                coordinates: coords
            },
            properties: {
                hintContent: li.text()
            }
        },{});
        orderMap.geoObjects.add(mo);
        orderMap.setCenter(coords);
        orderMap.setZoom(14);
    }
}

var getSuffix = function(number, variants) {
    var n = number%100;
    if ((n<10 || n>20) && n%10==1) return variants[0];
    else if ((n<10 || n>20) && (n%10>1 && n%10<5)) return variants[1];
    else return variants[2];
}

var selOlegInit = function() {
    if (!$('body').hasClass('manager')) return true;

    var form = $("<div class='oleg-form'><button class='expander'>O</button><form action='"+$_AJAX_PATHES.olegForm+"'><a href='#' class='-close'></a><h3>Олегу</h3><input type='hidden' name='text' value=''><div class='field'><input type='text' value='' placeholder='что не так?' name='comment'></div><div class='-buttons'><button class='send'>Отправить &gt;</button></div><div class='-done'>Отправлено Олегу<br>на исправление.<br><br>Спасибо.</div></form></div>");
        form.appendTo("body");

    form.find(".expander").on("click", function(e) {
        e.preventDefault();
        form.find("form").removeClass("done").find("input[type=text]").val("");
        form.toggleClass("expanded");
        document.getSelection().removeAllRanges();
        form.find("input[type=text]").focus();
        return false;
    });
    form.find(".-close").on("click", function(e) {
        e.preventDefault();
        form.removeClass("expanded");
        return false;
    });
    form.on("submit", function(e) {
        e.preventDefault();
        if (form.find("input[type=text]").val().trim()=="") return form.find("input[type=text]").focus();
        var data = { whom: "edit", text: form.find("input[type=hidden]").val(), comment: form.find("input[type=text]").val().trim() };
        form.find("form button").attr("disabled", true);
        $.post( $_AJAX_PATHES.olegForm, data, function(r) {
            form.find("form button").attr("disabled", null);
            form.find("form").addClass("done");
            setTimeout(function() {
                form.find(".-close").trigger("click");
            }, 4000);
        });
        return false;
    });

    document.addEventListener("selectionchange", function(e) {
        var selText = document.getSelection().toString().trim();
        form.toggleClass("visible", selText!="");
        if (selText!="") form.find("input[type=hidden]").val(selText);
    });
}


/******** /js/catalogue.js **************/

$(function() {

    window._isCatPage = true;

	 if ($("input#scroll-control").val()*1>0) {
        setTimeout(function() {
            $("body").scrollTop($("input#scroll-control").val()*1);
        }, 20);
    }
    
    var onsto = false;
    $("body").on("scroll", function(e) {
        if (onsto) clearTimeout(onsto);
        onsto = setTimeout(function() {
            $("input#scroll-control").val($(document.body).scrollTop());
        }, 100);
    });

		$("ul.goods li .action").each(function() {
        $(this).html("<i></i><span>"+$(this).html()+"</span>");
    });
    
    $("aside.filters").prepend("<div class='mobile-close-field'><a href='#' class='-close-filters'></a></div>");
    $("a.-close-filters").on("click", function(e) {
        e.preventDefault();
        $("aside.filters").scrollTop(0);
        $("a.toggle-filters").trigger("click");
        return false;
    });
    
    $("body").append("<div class='mobile-footer-filter-field'><a href='#' class='-apply-filters'>Показать <em></em></a><a href='"+$(".reset-all-filters-block a").attr("href")+"' class='-reset-all-filters'>Сбросить все</a></div>");
    if (!$(".reset-all-filters-block a").length) $(".mobile-footer-filter-field .-reset-all-filters").hide();
    var mobileApplyAutoclick = false;
    $(".mobile-footer-filter-field .-apply-filters").on("click", function(e) {
		if ($(this).hasClass("-preloader")) return false;
        $(this).addClass("-preloader");
        if ($(this).hasClass("waiting")) {
            mobileApplyAutoclick = true;
            e.preventDefault();
            return false;
        }
        if ($(this).attr("href")=="#") {
            e.preventDefault();
            $(this).removeClass("-preloader");
            $("a.toggle-filters").trigger("click");
            return false;
        }
        return true;
    });

    $(".filter.selected").each(function() {
        $(this).addClass("-always-open");
    });

    var refreshSelectedFilters = function(filter) {
        filter.find(".sel-items").remove();
        var s = $(filter).find(".options li.selected"), prs = false;
        if (s.length==0 && !filter.hasClass("-always-open")) {
            filter.removeClass("selected");
        } else {
            var sl = $("<ul class='sel-items'></ul>");
            for (var i=0; i<s.length; i++) {
                var xc = "-item-"+filter.data("name")+"-"+s.eq(i).data("value");
                s.eq(i).addClass(xc);
                sl.append("<li><span>"+s.eq(i).text()+"</span><a href='#' class='del' data-id='"+xc+"'>"+"</a></li>");
            }
            filter.addClass('selected');
            filter.append(sl);

            sl.find('.del').on("click", function(ev) {
                ev.preventDefault();
                var _val = $(this).data("id").split("-").pop();
                $.post($_AJAX_PATHES.catalogue.resetSelectorFilter, { action: "reset-filter", name: $(this).parents(".filter").data("name"), value: _val }, function(data) {
                    if (data.state=="ok") location.href = data.href;
                });
                return false;
            });
        }
        $("a.toggle-filters").toggleClass("with-selected", $(".filter.selected").length>0);
    }
    
    var winresize = function() {
        var w = window.innerWidth, g = $("ul.goods li:not(.flex-fix):not(.item-action)");
        if (w<=950) {
            g.each(function() {
                $(this).find(".action").insertBefore($(this).find(".price"));
            });
            $(".filter.selected").addClass("expanded");
            $(".order-list").insertBefore($(".toggle-filters"));
            $(".selections").insertBefore($(".order-list"));
            $(".selections-info").insertAfter(".catalogue-pages-bottom .pages");
            $(".-outlet-b").prependTo("main");
        } else {
            g.each(function() {
                $(this).find(".action").insertAfter($(this).find(".price"));
            });
            $(".filter.expanded").removeClass("expanded");
            $(".order-list").appendTo($(".cat-pag .pages>.order"));
            $(".selections").prependTo($(".catalogue-part"));
            $(".selections-info").appendTo("aside.filters");
            $("aside.filters").css({ top: "" });
            $(".-outlet-b").insertBefore($(".catalogue-part .pages").eq(0));
        }
        
        var h1h = $("h1").outerHeight() - 10;
            if (window.innerWidth>=1600) {
                $("aside.filters").css({ transform: "translateY(-"+h1h+"px)" });
            } else {
                $("aside.filters").css({ transform: "" });
            }
    }

    window.addEventListener("resize", winresize);
    winresize();

    $("ul.goods").each(function() {
        for (var i=0; i<5; i++) {
            $(this).append("<li class='flex-filler'></li>");
        }
        $(this).find("li:not(.item-action):not(.flex-filler)").each(function() {
            var x = $("<div class='wr'></div>");
                x.appendTo(this);
            $(this).find(">*:not(.images-wrapper):not(.images)").appendTo(x);
        });
    });

    $("ul.goods li:not(.item-action):not(.flex-filler)").each(function() {
        var h = $(this).find(".add-to-basket"), z = $(this).find(".title");
        $(this).data("id", h.data("id"));
        $(this).append("<div class='compare-add'></div>");
        if ($(this).hasClass("comparing")) {
            $(this).find(".compare-add").addClass("remove");
        }
    });
    $("ul.goods li .compare-add").on("click", function(ev) {
        ev.preventDefault();
        var $this = $(this);
        Basket.addCompare($(this).parents("li").find(".add-to-basket").data("id"), !$(this).parents("li").hasClass("comparing"))
              .then(function(state) {
                if (state) {
                    $this.parents("li").addClass("comparing");
                } else {
                    $this.parents("li").removeClass("comparing");
                }
              });
        return false;
    });

    $(".order-list .order-expander").on("click", function(ev) {
        ev.preventDefault();
        $(this).parents(".order-list").toggleClass('expanded');
        $("main").toggleClass("order-list-expanded", $(this).parents(".order-list").hasClass("expanded"));
        return false;
    });
    $(".order-list li a").on("click", function(ev) {
        $(this).parents(".order-list").removeClass('expanded');
        $(".order-list").find('.order-expander').text($(this).text());
        $("main").toggleClass("order-list-expanded", $(this).parents(".order-list").hasClass("expanded"));
        return true;
    });

    var appTO2 = false;
    var getApplyFilters = function(filterName, filterValue, delay) {
        if (typeof(delay)=="undefined") delay = false;
        return new Promise(function(resolve, reject) {
            var $all = {}, f = $(".filter");
            
            
            var filterInfoURL = $_AJAX_PATHES.catalogue.getFilterInfo;
            if (typeof(filterInfoURL!="string")) {
                if (typeof(filterInfoURL.href)!="undefined") 
                    filterInfoURL = filterInfoURL.href;
            }
            if (typeof(filterInfoURL)=="string") {
                filterInfoURL = filterInfoURL.replace(/^(.*?)\?.*$/, '$1');
            } else {
                filterInfoURL = $_AJAX_PATHES.catalogue.getFilterInfo;
            }


            for (var i=0; i<f.length; i++) {
                if (f.eq(i).data("name")==filterName) continue;
                if (f.eq(i).hasClass("slider")) {
                    var vl = f.eq(i).find("input"),
                        vx = [ vl.eq(0).val().replace(/\D/g, '')*1, vl.eq(1).val().replace(/\D/g, '')*1 ],
                        df = [ vl.eq(0).attr("data-default").replace(/\D/g, '')*1, vl.eq(1).attr("data-default").replace(/\D/g, '')*1 ];
                    if (vx[0] > df[0] || vx[1] < df[1]) {
                        $all[f.eq(i).data("name")] = [ vx[0], vx[1] ];
                    }
                } else {
                    var vals = [], vl = f.eq(i).find(".selected");
                    for (var j=0; j<vl.length; j++) vals.push(vl.eq(j).data('value'));
                    $all[f.eq(i).data("name")] = vals;
                }
            }
            var filterValue0 = filterValue;
            try { 
                if (filterValue0.match(/^\d+\,\d+$/)) filterValue0 = filterValue0.split(',');
            } catch(e) {}
            $all[filterName] = filterValue0;
            
            if (delay) {
                if (appTO2) clearTimeout(appTO2); 
                appTO2 = setTimeout(function() {
                    $(".apply, .mobile-footer-filter-field .-apply-filters").addClass("waiting").find("em").text("");
                    $.get(filterInfoURL, { action: "get-filter",  "all-filters": $all, q: $('#search-input').val() }, function(data) {
                            $(".mobile-footer-filter-field .-apply-filters em").text(getProductsTitleCount(data.count)).parent().attr("href", data.href).removeClass("waiting");
                            if (mobileApplyAutoclick) {
                                setTimeout(function() {
                                    location.href = data.href;
                                }, 10);
                            }
                            if (data.state=='ok') resolve(data); else reject(data);
                        }
                    );
                }, 1500);
            } else {
                $(".apply, .mobile-footer-filter-field .-apply-filters").addClass("waiting").find("em").text("");
                $.get(filterInfoURL, { action: "get-filter",  "all-filters": $all, q: $('#search-input').val() }, function(data) {
                        $(".mobile-footer-filter-field .-apply-filters em").text(getProductsTitleCount(data.count)).parent().attr("href", data.href).removeClass("waiting");
                        if (mobileApplyAutoclick) {
                            setTimeout(function() {
                                location.href = data.href;
                            }, 10);
                        }

                        if (data.state=='ok') resolve(data); else reject(data);
                    }
                );
            }
        });
    }
    
    $("aside.filters .filter.selector:not(.-always-open) ul.options").each(function() {
        var opt = $(this).find("li:not(.selected)");
        if (opt.length>10) {
            for (var i=7; i<opt.length; i++) {
                opt.eq(i).addClass("hidden");
            }
            $("<div class='show-more-vals'><a href='#'>Показать еще значения</a></div>").insertAfter(this);
        }
    });
    $(".show-more-vals a").on('click', function(e) {
        e.preventDefault();
        $(this).parents(".filter").find("li.hidden").removeClass("hidden");
        $(this).parent().remove();
        return false;
    });

    $("aside.filters .options .option").on("click", function(ev) {
        if (ev.target.tagName.toLowerCase()=="a") return true;
        ev.preventDefault();
        $(this).toggleClass("selected").toggleClass("changed");
        $(this).parents(".filters").find(".apply-button").remove();
        $(".filter .apply").each(function() {
            $(this).removeClass("visible");//.parent().removeClass('changed');
        });

        if ($(this).parents(".filter").find(".changed").length>0) {
            var apply = $("<a href='#' class='apply-button waiting'>Показать<em></em></a>"), autoclick = false;
                apply.appendTo(this);
                apply.on("click", function(ev) {
					if ($(this).hasClass("-preloader")) return false;
                    $(this).addClass("-preloader");
                    if ($(this).hasClass("waiting")) {
                        autoclick = true;
                        ev.preventDefault();
                        return false;
                    }
                    return true;
                });
                var $flt = $(this).parents(".filter"), vals = [], sel = $flt.find(".selected");
                for (var i=0; i<sel.length; i++) vals.push(sel.eq(i).data("value"));
                getApplyFilters($(this).parents(".filter").data("name"), vals)
                .then(function(data) {
                    $flt.find(".apply-button").attr("href", data.href).removeClass("waiting").find("em").text(" "+getProductsTitleCount(data.count));
                    if (autoclick) location.href = data.href;
                });
        }
        return false;
    });
    
    $("aside.filters .selector .options li").on("click", "a", function(e) {
        try {
            e.originalEvent.stopPropagation();
        } catch(e) {}
    });

	var canShowWithoutReload = $('aside.filters li.selected').length == 0;

    $("aside.filters .selector .options li").on("click", function(ev) {
        if (ev.target.tagName.toLowerCase()=="a" || ev.target.tagName.toLowerCase()=="em") return true;
        ev.preventDefault();
        $(this).toggleClass("selected").toggleClass('changed');
        $(this).parents(".filters").find(".apply-button").remove();
        $(".filter .apply").each(function() {
            $(this).removeClass("visible");//.parent().removeClass('changed');
        });

//        if ($(this).parents(".filter").find(".changed").length>0) {
            var apply = $("<a href='#' class='apply-button waiting'>Показать<em></em></a>"), autoclick = false;
                apply.appendTo(this);
                apply.on("click", function(ev) {
						if ($(this).hasClass("-preloader")) return false;
                    $(this).addClass("-preloader");
                    if ($(this).hasClass("waiting")) {
                        autoclick = true;
                        ev.preventDefault();
                        return false;
                    }
                    return true;
                });

                var $flt = $(this).parents(".filter"), vals = [], sel = $flt.find(".selected");
                for (var i=0; i<sel.length; i++) vals.push(sel.eq(i).data("value"));

				//если выбран один фильтр, показываем количество без запроса
				var lis = $('aside.filters li.selected');

				if(canShowWithoutReload && lis.length == 1) {
					var $li = $(lis[0]);
					var href = $('a', $(ev.target)).attr('href');
					if($li.data('count')) {
						apply.attr("href", href).removeClass('waiting').find("em").text(" "+getProductsTitleCount($li.data('count')));
						$(".mobile-footer-filter-field .-apply-filters em").text($li.data('count')).parent().attr("href", href).removeClass("waiting");
						if (autoclick) location.href = href;
						return false;
					}
				}

                getApplyFilters($(this).parents(".filter").data("name"), vals)
                .then(function(data) {
                    if (!$flt.find(".apply-button em").length) $flt.find(".apply-button").append("<em></em>");
                    var txt = getProductsTitleCount(data.count);
                    $flt.find(".apply-button").attr("href", data.href).removeClass('waiting').find("em").text(" "+txt);
                    if (autoclick) location.href = data.href;
                });
//        }

        return false;
    });

    $("aside.filters .filter h4").on("click", function(ev) {
    /*
        if ($(this).parents(".filter").hasClass("-always-open")) {
            $(this).parents(".filter").addClass("expanded");
            return correctValuesPositions();
        }
     */
        if (!$(this).parents(".filter").hasClass("expanded") && $(this).parents(".filter").hasClass("selected")) $(this).parents(".filter").removeClass("selected").addClass("expanded");
        if ($(this).parents(".filter").hasClass("expanded") && $(this).parents(".filter").hasClass("selected")) $(this).parents(".filter").removeClass("selected");
        $(this).parents(".filter").toggleClass('expanded');
        $("aside.filters").toggleClass("expanded", $("aside.filters .filter.expanded").length>0);
        correctValuesPositions();
    });
    
    $("aside.filters .filter.expanded.slider .del").each(function(e) {
        $(this).prependTo($(this).parents(".filter"));
    });

    $("aside.filters .filter.selector").each(function(){
        refreshSelectedFilters($(this));
    });

    $("aside.filters .show-all-filters-button a").on("click", function(ev) {
        ev.preventDefault();
        $(this).fadeOut(200, function() {
            $("aside.filters .filter.default-hidden").removeClass("default-hidden");
        });
        return false;
    });
    
    winresize();

    var correctValuesPositions = function() {
        $(".ui-slider-handle div.value:visible em").each(function() {
            $(this).css({ "transform": "translateX(0)" });
            var a1 = Math.floor($(this).offset().left), a2 = Math.floor($(this).parents('.slider').offset().left),
                b1 = Math.floor($(this).offset().left) + Math.floor($(this).outerWidth()), b2 = Math.floor($(this).parents('.slider').offset().left) + Math.floor($(this).parents('.slider').outerWidth()),
                da = a1-a2<10 ? -1*(a1-a2-10) : 0;
                if (da==0 && b1+10>b2) {
                    da = b2 - b1 - 10;
                }

                $(this).css({ "transform": "translateX("+da+"px)" });
        });
    }


    $("aside.filters .filter.slider").each(function() {
        var vl = $(this).find("input").attr("value").split(","),
            i = $(this).find("input"),
            limits = [i.attr("min")*1, i.attr("max")*1],
            autoclick = false;
        if (typeof(vl[1])=="undefined") {
            vl = limits;
        }
        $(this).find(".range").html("<span class='val-placeholder'><em></em><input value='"+formatNum(vl[0])+"' type='text' class='slider-min-val'></span>—<span class='val-placeholder'><em></em><input value='"+formatNum(vl[1])+"' type='text' class='slider-max-val'></span>");
        $(this).find("input").eq(0).attr("data-default", limits[0]);
        $(this).find("input").eq(1).attr("data-default", limits[1]);
        var appTO = false, def_val = vl;


        $(this).find(".range input").on("keyup keydown paste blur input", function(e) {
            if (e.type.match(/^key/)) {
                if (e.which==13 && e.type=="keydown" && $(this).parents(".filter").find(".apply").length) $(this).parents(".filter").find(".apply").trigger("click");
                if (!numberKeyIsValid(e)) return false;
            }
            var v0 = $(this).val().replace(/\D+/g, ''), correct = true;

            if (e.type=='blur') {            
                if (parseInt(v0)>limits[1]) v0 = limits[1];
                if (parseInt(v0)<limits[0]) v0 = limits[0];
            } else {
                if (parseInt(v0)>limits[1] || parseInt(v0)<limits[0]) correct = false;
            }
            $(this).val(formatNum(v0));
            
            var $flt = $(this).parents(".filter"), $vals = [$(this).parents(".range").find("input").eq(0).val().replace(/\D/g, ''), $(this).parents(".range").find("input").eq(1).val().replace(/\D/g, '')];
            console.log(v0, $vals, limits);
            if (!$vals[0] || $vals[0]<limits[0]) $vals[0]=limits[0];
            if (!$vals[1] || $vals[1]>limits[1]) $vals[1]=limits[1];
            
            $(".apply-button, .apply").not($flt.find(".apply")).remove();

            if ($vals[0]==vl[0] && $vals[1]==vl[1]) $(this).parents(".filter").removeClass('changed'); else $(this).parents(".filter").addClass("changed");
            
            if (!$flt.find(".apply").length) {
                        
                    var apply = $("<a href='#' class='apply visible waiting'>Показать<em></em></a>");
                        apply.insertAfter($flt.find("h4"));
                        apply.on("click", function(ev) {
                				if ($(this).hasClass("-preloader")) return false;
                				console.log("PRLD");
                                $(this).addClass("-preloader");
                                if ($(this).hasClass("waiting")) {
                                    autoclick = true;
                                    ev.preventDefault();
                                    return false;
                                }
                                return true;
                            });
             }

            if (!correct) return true;
            
          
            getApplyFilters($flt.data("name"), $vals.join(","), true)
            .then(function(data) {
                $flt.find(".apply").removeClass("waiting").addClass("visible").attr('href', data.href).find("em").text(" "+getProductsTitleCount(data.count));
                if (autoclick) location.href = data.href;
            }).catch(function(e) { console.log("ERROR", e); } );

        });

        return true;
    });
    
    var getProductsTitleCount = function(N) {
        var pt = "товар", n0 = N%100;
        if (n0%10>=5 || (n0>10 && n0<20) || n0%10==0) pt+="ов";
        else if (n0%10>=2) pt+="а";
        return N+" "+pt;
    }

    $("a.toggle-filters").on("click", function(ev) {
        ev.preventDefault();
        $(".order-list.expanded").removeClass("expanded");
        $("main").removeClass("order-list-expanded");
        $(document.body).toggleClass("shown-filters");
        if ($(document.body).hasClass("shown-filters")) {
            var sct = $("body").scrollTop() ? $("body").scrollTop() : $(window).scrollTop();
            $("aside.filters").css({ top: this.offsetTop + $(this).outerHeight() +1 });
            $(".toggle-filters span").text($(".toggle-filters span").data('alt'));
        } else {
            $("aside.filters").css({ top: "" });
            $(".toggle-filters span").text($(".toggle-filters span").data('txt'));
        }
        return false;
    });

    $(".goods li").each(function() {
        if ($(this).find(".images>.image").length<=1) return true;
        var b = $("<div class='board'><a href='#' class='scrl left'></a><a href='#' class='scrl right'></a></div>");
            b.insertAfter($(this).find(".images"));
    });
    $(".goods li .images").each(function() {
        var n = this, tn = [];
        for (var n=n.firstChild;n;n=n.nextSibling){
            if (n.nodeType == Node.TEXT_NODE) tn.push(n);
        }
        while (tn.length>0) tn.pop().remove();
    });
    $(".goods li .board a").on("click", function(ev) {
        ev.preventDefault();
        var $this = $(this);
        if ($this.parent().hasClass("disabled")) return false;
        $this.parent().addClass('disabled');
        var v = $this.parents("li").find(".images"), l = v.scrollLeft(), s = $this.hasClass("left") ? -1 : 1, w = v.width();
        l+=w*s;
        if (l<=0) {
            l = (v.find(".image").length-1)*w;
        } else if (l>(v.find(".image").length-1)*w) {
            l = 0;
        }
        v.stop().animate({scrollLeft: l}, 150);
        setTimeout(function() {
            $this.parent().removeClass('disabled');
        }, 150);
        return false;
    });

    try {
        if ($("div.selections ul")[0].offsetHeight>=$("div.selections ul")[0].scrollHeight-4) {
            $("div.selections ul").removeClass("mobile-collapsed");
            $(".show-selections").hide();
        }
    } catch (e) {}
    
    $("body").on("click", "div.selections ul li a", function(e) {
        e.preventDefault();
        if ($(this).parents(".selected").length) {
            $(this).parents(".selected").removeClass("selected").addClass("unselected -start");
        } else { 
            $(this).parent().removeClass("unselected").addClass("selected -notmove");
        }
        var h = $(this).attr("href");
        setTimeout(function() {
            location.href = h;
        }, 200);
        return true;
    });
    
    $(".show-selections em").on("click", function(e) {
        $(this).parent().fadeOut(200);
        $("div.selections ul.mobile-collapsed").animate({ height: $("div.selections ul.mobile-collapsed")[0].scrollHeight}, 200, function() {
            $("div.selections ul.mobile-collapsed").removeClass("mobile-collapsed");
        });
    });
});



/******** /js/main.js **************/

$(function() {
    var itemsPerLine = 0;
    var ct = $(".catalogue-main-page");
    $("nav.catalogue").remove();
    ct.appendTo("body>header").removeClass(".catalogue-main-page").addClass('catalogue');

    $(".submenu .parts").each(function() {
        if ($(this).text()=="") $(this).remove();
    });

    var calcSectionWidth = function() {

        if (window.innerWidth>=950) {
            var N = 0, N0 = 0;
            $("section.main-group").each(function() {
                var items = $(this).find(".goods>li"), y = items.eq(0).offset().top;
                N=0;
                for (var i=0; i<items.length; i++) {
                    if (items.eq(i).offset().top>y) break;
                    N++;
                }
                if (N>N0) N0=N;
            });
            $("section.main-group").each(function() {
                var items = $(this).find(".goods>li:not(.flex-filler)");
                for (var i=N0; i<items.length; i++) items.eq(i).addClass("hidden");
                $(this).find(".show-more").toggleClass("hidden", items.filter(".hidden").length==0);
            });
        } else {
            N0 = 3;
        }
        itemsPerLine = N0;
        $("section.main-group").each(function() {
            var items = $(this).find(".goods>li:not(.flex-filler)");
            for (var i=N0; i<items.length; i++) items.eq(i).addClass("hidden");
            $(this).find(".show-more").toggleClass("hidden", items.filter(".hidden").length==0);
        });

    }
    calcSectionWidth();

    $("body>header a.logo").on("click", function(ev) {
        ev.preventDefault();
        return false;
    });

    var onrs = function() {
        var h = window.innerHeight, h2 = h<850?850:(h>1000?1000:h);
        var logoK = h2/1000;
        $("body>header #logo").css({transform: "scale("+logoK+")"});
    }
    onrs();
    window.addEventListener("resize", onrs);
    
    var firstMenuExpanded = true;

    $("nav.catalogue>ul>li>a").on("click", function(ev) {
        $("nav.catalogue .expanded").not($(this).parent()).removeClass("expanded");
        $("nav.catalogue .-hover").not($(this).parent()).removeClass("-hover");
        if ($(this).parent().find(".submenu").length==0) return true;
        else if (!$("body").hasClass("--mobile")) {
            if ($(this).parent().hasClass("-hover")) return true;
            else $(this).parent().addClass("-hover");
        }
        $(this).parent().toggleClass('expanded');
		  if ($("body").hasClass("--mobile")) {
            if ($(this).parent().hasClass("expanded") && $(this).parent()[0].getBoundingClientRect().bottom>window.innerHeight - 220) {
                $("html,body").stop().animate({scrollTop: $(this).parent().offset().top }, 250);
            } 
        }
        ev.preventDefault();
        return false;
    })
    /*.parent().on("mouseenter", function() {
        if ($(window).width()==400) return true;
        $(this).addClass('expanded');
        var sm = $(this).find(".submenu");
        console.log(sm);
        if (sm.length>0) {
            $(this).removeClass("-right");
            $(this).toggleClass("-right", sm.offset().left + sm.outerWidth() > window.innerWidth);
        }
    })*/
    /*.on("mouseleave", function() {
        if ($(window).width()==400) return true;
        $(this).removeClass('expanded');
    });
    */
    $("nav.catalogue>ul>li").each(function() {
        if ($(this).find("ul").length==0) $(this).addClass("directLink");
    });

    $(".show-more a").on("click", function(ev) {
        ev.preventDefault();
        var r = $(this).parents("section").eq(0), items = r.find(".goods li.hidden");
        for (var i=0; i<itemsPerLine && i<items.length; i++) {
            items.eq(i).removeClass("hidden");
        }
        $(this).parent().toggleClass("hidden", r.find(".goods .hidden").length==0);
        return false;
    });

	$('body').on("focus", 'header section.start form#search-top input[type=text]', function() {
        if (!$('body').hasClass('--mobile')) return true;
        $('html,body').stop().animate({scrollTop: $('body>header section.start form#search-top input[type=text]').offset().top - 20}, 120);
    });

});


/******** /js/ga.helper.js **************/

$(document).ready(function() {
	GaEcommerceHelper.init();
});

var GaEcommerceHelper = {

	init: function() {
		if (0 < $('#ga-ecommerce-data').length) {
			this.dataContainer = $('#ga-ecommerce-data');
			this.trackPage();
		}
	},

	trackPage: function() {
		var pageType = this.getPageType();
		switch (pageType) {
			case 'main':
				//this.trackMainPage();
				break;
			case 'category':
			case 'tags':
			case 'brand':
			case 'filter':
			case 'search':
			case 'compatibles':
			case 'promo':
				//this.trackCategoryPage();
				break;
			case 'product':
				//this.trackProductPage();
				break;
			case 'basket':
				//this.trackCartPage();
				break;
			case 'order2':
				this.trackOrder2Page();
				break;
			case 'order3':
				this.trackOrder3Page();
				break;
			case 'order4':
				this.trackOrder4Page();
				break;
			case 'purchase':
				this.trackOrderPurchasePage();
				break;
			case 'portal':
			case 'static':
			case 'contacts':
				//this.trackGenericPage();
				break;
		}

		//this.trackImpressions();
		this.trackNonImpressions();
		this.trackPromoActions();

		$('.product-link').each(function() {
			var _ = $(this);
			_.click(function(e) {
				console.log(e);
				var link = _.attr('href');
				var id = _.attr('data-id');
				var name = _.attr('data-name');
				var category = _.attr('data-category');
				var brand = _.attr('data-brand');
				var price = parseInt(_.attr('data-price'));
				var actionField = _.attr('data-action');
				var position = _.attr('data-position');
				GaEcommerceHelper.clickProductLink(link, id, name, category, brand, price, actionField, position);
				if (!e.ctrlKey && !e.shiftKey) {
					window.location.href = link;
				}
			});
		});
	},

	trackGenericPage: function() {
		var obj = this.createDataObject();
		this.sendDataObject(obj);
	},

	trackMainPage: function() {
		var obj = this.createDataObject();
		this.sendDataObject(obj);
	},

	trackCategoryPage: function() {
		var obj = this.createDataObject();
		this.sendDataObject(obj);
	},

	trackProductPage: function() {
		var obj = this.createDataObject();
		obj.dimension18 = this.getAttr('availability');
		obj.ecommerce.detail = {
			products: [{
				id: this.getAttr('product-id'),
				name: this.getAttr('product-name'),
				category: this.getAttr('product-category'),
				price: this.getAttr('product-price'),
				dimension18: this.getAttr('availability')
			}]
		};
		this.sendDataObject(obj);
	},

	trackCartPage: function() {
		var obj = this.createDataObject();
		obj.ecommerce.checkout = {
			step: 1,
			products: []
		};
		this.dataContainer.find('div.basket-product').each(function() {
			var row = $(this);
			obj.ecommerce.checkout.products.push({
				id: row.attr('data-id'),
				name: row.attr('data-name'),
				category: row.attr('data-category'),
				price: row.attr('data-price'),
				quantity: row.attr('data-quantity')
			});
		});
		this.sendDataObject(obj);
	},

	trackNonImpressions: function() {
		var impressions = this.getImpressions();
		while (0 < impressions.length) {
			var obj = {
				event: 'CategoryView',
				nonInteraction: true,
				ecommerce: {
					impressions: impressions.splice(0, 10)
				}
			};
			this.sendDataObject(obj);
		}
	},

	trackNonImpressionsFromBlock: function(blockIdentity) {
		var impressions = this.getImpressions(blockIdentity);
		if (0 < impressions.length) {
			var obj = {
				event: 'Non_impressions',
				eventCategory: 'Non-Interactions',
				eventAction: 'show',
				eventLabel: 'products',
				ecommerce: {
					impressions: impressions
				}
			};
			this.sendDataObject(obj);
		}
	},

	addProductToCart: function(id, name, category, brand, price, quantity) {
		var obj = this.createDataObject();
		obj.event = 'addToCart';
		obj.nonInteraction = false;
		obj.ecommerce.currencyCode = 'RUR';
		obj.ecommerce.add = {
			products: [{
				id: id,
				name: name,
				category: category,
				brand: brand,
				price: price,
				quantity: quantity || 1
			}]
		}
		this.sendDataObject(obj);
	},

	removeProductFromCart: function(id, name, category, price, brand, quantity) {
		if ((null == quantity) || (0 == quantity)) {
			return;
		}
		var obj = this.createDataObject();
		obj.event = 'removeFromCart';
		obj.nonInteraction = true;
		obj.ecommerce.currencyCode = 'RUR';
		obj.ecommerce.remove = {
			products: [{
				id: id,
				name: name,
				category: category,
				price: price,
				quantity: quantity || 1
			}]
		}
		this.sendDataObject(obj);
	},

	clickProductLink: function(link, id, name, category, brand, price, actionField, position, successFunc) {
		var obj = {
			event: 'ProductClick',
			nonInteraction: true,
			ecommerce: {
				click: {
					actionField: { list: actionField || 'generic' },
					products: [{
						id: id,
						name: name,
						category: category,
						brand: brand,
						price: price,
						list: (actionField || 'generic'),
						position: position
					}]
				}
			}
		};
		this.sendDataObject(obj);
		if (successFunc) {
			successFunc();
		}
	},

	trackPromoActions: function() {
		var actions = this.getPromoActions();
		if (0 < actions.length) {
			var obj = this.createDataObject();
			obj.event = 'promoView';
			obj.ecommerce.promoView = {
				promotions: actions
			};
			if (obj.ecommerce.impressions) {
				delete obj.ecommerce.impressions;
			}
			this.sendDataObject(obj);
		}
	},

	clickPromo: function(link, id, name, creative, position) {
		var obj = this.createDataObject();
		obj.event = 'promotionClick';
		obj.ecommerce.promoClick = {
			promotions: [{
				id: id,
				name: name,
				creative: creative,
				position: position
			}]
		};
		obj.eventCallback = function() {
			document.location = link;
		};
		if (obj.ecommerce.impressions) {
			delete obj.ecommerce.impressions;
		}
		this.sendDataObject(obj);
		if ((navigator.appVersion.indexOf("Mac")!=-1)) {
			document.location = link;
		}
	},

	trackQuickOrderPage: function(order) {
		var obj = this.createDataObject();
		obj.event = 'order';
		obj.type_purchase = 'one_click';
		obj.ecommerce.purchase = {
			actionField: {
				id: order.id,
				revenue: order.amount,
				tax: 0.00,
				shipping: 0.00,
				coupon: ''
			},
			products: []
		};
		for (var i = 0; i < order.products.length; i++) {
			var product = order.products[i];
			obj.ecommerce.purchase.products.push({
				id: product.id,
				name: product.name,
				category: product.categoryName,
				price: product.price,
				quantity: product.quantity
			});
		}
		this.sendDataObject(obj);
	},

	trackOrder2Page: function() {
		var obj = this.createDataObject();
		obj.event = 'CheckoutStep2';
		obj.nonInteraction = false;
		obj.ecommerce = {
			checkout: {
				actionField: {
					step: '2'
				},
				products: []
			}
		};
		this.dataContainer.find('div.basket-product').each(function() {
			var row = $(this);
			obj.ecommerce.checkout.products.push({
				id: row.attr('data-id'),
				name: row.attr('data-name'),
				category: row.attr('data-category'),
				brand: row.attr('data-brand'),
				price: row.attr('data-price'),
				quantity: row.attr('data-quantity')
			});
		});
		this.sendDataObject(obj);
	},

	trackOrder3Page: function() {
		var obj = this.createDataObject();
		obj.event = 'CheckoutStep3';
		obj.nonInteraction = false;
		obj.ecommerce = {
			checkout: {
				actionField: {
					step: '3'
				},
				products: []
			}
		};
		this.dataContainer.find('div.basket-product').each(function() {
			var row = $(this);
			obj.ecommerce.checkout.products.push({
				id: row.attr('data-id'),
				name: row.attr('data-name'),
				category: row.attr('data-category'),
				brand: row.attr('data-brand'),
				price: row.attr('data-price'),
				quantity: row.attr('data-quantity')
			});
		});
		this.sendDataObject(obj);
	},

	trackOrder4Page: function() {
		var obj = this.createDataObject();
		obj.event = 'CheckoutStep4';
		obj.nonInteraction = false;
		obj.ecommerce = {
			checkout: {
				actionField: {
					step: '4'
				},
				products: []
			}
		};
		this.dataContainer.find('div.basket-product').each(function() {
			var row = $(this);
			obj.ecommerce.checkout.products.push({
				id: row.attr('data-id'),
				name: row.attr('data-name'),
				category: row.attr('data-category'),
				brand: row.attr('data-brand'),
				price: row.attr('data-price'),
				quantity: row.attr('data-quantity')
			});
		});
		this.sendDataObject(obj);
	},

	trackOrderPurchasePage: function() {
		var obj = this.createDataObject();
		obj.event = 'purchase';
		obj.nonInteraction = false;
		obj.ecommerce = {
			purchase: {
				actionField: {
					id: this.getAttr('data-order-id'),
					affiliation: 'santbaza.ru',
					revenue: this.getAttr('data-order-amount'),
					tax: 0,
					shipping: this.getAttr('data-order-delivery-amount'),
					coupon: ''
				},
				products: []
			}
		};
		this.dataContainer.find('div.basket-product').each(function() {
			var row = $(this);
			obj.ecommerce.purchase.products.push({
				id: row.attr('data-id'),
				name: row.attr('data-name'),
				category: row.attr('data-category'),
				brand: row.attr('data-brand'),
				price: row.attr('data-price'),
				quantity: row.attr('data-quantity')
			});
		});
		this.sendDataObject(obj);
	},

	createDataObject: function() {
		var obj = {
			ecommerce: {}
		};
		return obj;
	},

	getAttr: function(attrName) {
		return this.dataContainer.attr('data-' + attrName);
	},

	getPageType: function() {
		return this.getAttr('page-type');
	},

	getClientId: function() {
		return this.getAttr('client-id');
	},

	getUserId: function() {
		return this.getAttr('user-id');
	},

	getAuth: function() {
		return this.getAttr('auth');
	},

	getCity: function() {
		return this.getAttr('city');
	},

	getImpressions: function(blockIdentity) {
		var container = this.dataContainer;
		if (blockIdentity) {
			container = $(blockIdentity);
		}

		var list = [];
		container.find('div.impression').each(function() {
			var product = $(this);
			var obj = {
				id: product.attr('data-id'),
				name: product.attr('data-name'),
				category: product.attr('data-category'),
				price: product.attr('data-price'),
				brand: product.attr('data-brand'),
				position: product.attr('data-position'),
				list: product.attr('data-list')
			};
			list.push(obj);
		});
		return list;
	},

	getPromoActions: function() {
		var list = [];
		this.dataContainer.find('div.promo-action').each(function() {
			var action = $(this);
			var obj = {
				id: action.attr('data-id'),
				name: action.attr('data-name'),
				creative: action.attr('data-creative'),
				position: action.attr('data-position')
			};
			list.push(obj);
		});
		return list;
	},

	sendDataObject: function(dataObject) {
		console.log('ga push', dataObject);
		dataLayer.push(dataObject);
	}

};