/* Minification failed. Returning unminified contents.
(153,15-16): run-time error JS1010: Expected identifier: .
(153,15-16): run-time error JS1195: Expected expression: .
 */
$(document).ready(function(){function t(n){let t=n-Date.parse(new Date),i=Math.floor(t/1e3%60),r=Math.floor(t/6e4%60),u=Math.floor(t/36e5%24),f=Math.floor(t/864e5);return{total:t,days:f,hours:u,minutes:r,seconds:i}}function i(n,i){let r=setInterval(function(){let u=t(i);n.html(u.days+" : "+u.hours+" : "+u.minutes+" : "+u.seconds);u.total<=0&&(clearInterval(r),n.remove())},1e3)}function r(n){return n+="Z",new Date(n)}const n=$(".timer-shares");n.each(function(){let n=$(this),t=n.attr("data-date");i(n,r(t))})});;
$(document).ready(function(){const n=$(".FAQ__question-item"),t=$(".FAQ__answer-item"),i=$(".FAQ__answer-item:first-child").find(".FAQ__answer-info"),r=$(".FAQ__question-item:first-child");if(window.matchMedia("(min-width: 901px)").matches){i.show();r.find(".FAQ__marker").addClass("orange-marker");r.find(".FAQ__question-text").addClass("active");n.on("click",function(){let n=$(this),i=n.find(".FAQ__question-text").text(),r=t.find(".FAQ__title-text");$.each(r,function(){i===$(this).text()&&($(this).parent().parent().parent().addClass("show-flex").siblings(".show-flex").removeClass("show-flex").hide(),n.find(".FAQ__marker").toggleClass("orange-marker").parent().parent().siblings().find(".FAQ__marker").removeClass("orange-marker"),n.find(".FAQ__question-text").toggleClass("active").parent().parent().siblings().find(".FAQ__question-text").removeClass("active"),$(this).parent().parent().siblings(".FAQ__answer-info").slideToggle().parent().siblings().find(".FAQ__answer-info").slideUp())})})}if(window.matchMedia("(max-width: 900px)").matches){n.wrap('<div class="FAQ__mobile"><\/div>');$(".FAQ__mobile:first-child").addClass("active").append(i).find(".FAQ__answer-info").show().parent().find(".FAQ__question-item").addClass("orange-marker");$(".FAQ__mobile").on("click",function(){let n=$(this),i=n.find(".FAQ__question-text").text(),r=t.find(".FAQ__title-text");$.each(r,function(){if(i===$(this).text()){let t=$(this).parent().parent().siblings(".FAQ__answer-info");n.append(t)}});n.toggleClass("active").find(".FAQ__question-item").toggleClass("orange-marker").parent().siblings(".active").removeClass("active").find(".FAQ__question-item").removeClass("orange-marker");n.find(".FAQ__answer-info").slideToggle().parent().siblings().find(".FAQ__answer-info").slideUp()})}$(".FAQ__answer-item:first-child").addClass("show-flex")});;
$(document).ready(function(){function n(n){for(var t={},r=[],i;Object.keys(t).length<4;)i=Math.ceil(Math.random()*(n.length-1)),t[i]=n[i];for(key in t)r.push(t[key]);return function(n){var n=$(n).filter("#tpl-testimonials").html();$(".students-story-container").append(Handlebars.compile(n)(r))}}$.get("/"+localization.cultureUrl+"/templates/testimonials",n([{name:"Айнур Каниева",courses:[{courseName:"C# Стартовый",link:"/video/csharp-starter"},{courseName:"Unity Starter",link:"/video/unity-3d"}],comment:"Все началось с Youtube канала. Я прослушала все вебинары всех спикеров. Они очень грамотно, доступно и просто излагают весь материал. Сейчас учу C# и Unity.",photo:"/Content/img/comments/1.png"},{name:"Арен Саргсян",courses:[{courseName:"HTML&CSS",link:"/video/html-and-css-renewed"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"JavaScript Шаблоны",link:"/video/javascript-patterns"},{courseName:"AngularJS Essential",link:"/video/angular-js"}],comment:"Вы большые молодцы, очень круто, что вообще есть такой сайт, такой сервис, такой магазин. Когда что-то надо читать или смотреть по программированию - все можно найти у ваc.",photo:"/Content/img/comments/2.png"},{name:"Кравченко Павел Александрович",courses:[{courseName:"портал ITVDN",link:""}],comment:"Очень качественный портал, помогать в обучении начал ещё на первом курсе. Так же хочу отметить преподавателей, которых интересно слушать!",photo:"/Content/img/comments/3.png"},{name:"Лидия Сергеева",courses:[{courseName:"Курсы по «Frontend Starter»",link:"/specialities/frontend-developer"}],comment:"Пользовалась тренажёром и подпиской. Очень понравилась подача информации и возможность тренировать навыки.",photo:"/Content/img/comments/4.png"},{name:"Марк  Улыбкин",courses:[{courseName:"JavaScript Essential",link:"/video/javascript-essential"}],comment:"Заметил очень сильную разницу по подаче материала на примере Angular первой версии у Вас и у сайта javascript.ru. В вашем варианте всё систематизировано и доходчиво разжёвана каждая строчка, что для начинающих самое то.",photo:"/Content/img/comments/6.png"},{name:"Николай Затонацкий",courses:[{courseName:"Курсы по Frontend разработке",link:"/specialities/frontend-developer"}],comment:"Хороший видео ресурс. Особая благодарность Дмитрию Охрименко. Не встречал человека, который настолько глубоко копает, при этом очень точно и корректно излагает материал.",photo:"/Content/img/comments/7.png"},{name:"Марина Белкина",courses:[{courseName:"портал ITVDN",link:""}],comment:"Отлично, что на почту приходит рассылка. Лично я заинтересовалась этим сайтом, потому у нас после прохождения вашего курса успешно работает девочка верстальщица. Рисует и верстает сайты, лендинги. Я восхищаюсь ее умениями и тоже хочу попробовать научиться.",photo:"/Content/img/comments/9.png"},{name:"Денис Прудиус",courses:[{courseName:"портал ITVDN",link:""}],comment:"Считаю, что ITVDN - это одни из самых лучших видеокурсов, которые сейчас представлены в Рунете. Доступный материал, презентации, онлайн консультирование, тестирование, есть возможность получить сертификат. Я всем доволен.",photo:"/Content/img/comments/10.png"},{name:"Нвер Багдасарян",courses:[{courseName:"AngularJS Essential",link:"/video/angular-js"},{courseName:"C# Стартовый",link:"/video/csharp-starter"},{courseName:"Twitter Bootstrap 3",link:"/video/bootstrap"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"How to JavaScript",link:"/video/how-to-java-script"}],comment:"Ваши курсы очень помогают студентам! Все мои друзья тоже смотрят эти курсы и очень довольны и благодарны. Спасибо вам!",photo:"/Content/img/comments/11.png"},{name:"Лазаров Адриан Сабиевич",courses:[{courseName:"HTML&CSS",link:"/video/html-and-css-renewed"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"How to JavaScript",link:"/video/how-to-java-script"}],comment:"Достойный сайт о современных технологиях, на ITVDN можно найти все самые современные курсы по web-технологиям. Лучший тренажер, что я находил, самые правильные и грамотные тесты по языкам программирования. Спасибо ITVDN!",photo:"/Content/img/comments/13.png"},{name:"Лев Шергин",courses:[{courseName:"C# Стартовый",link:"/video/csharp-starter"}],comment:"Отличный проект, уроки очень подробные и интересные. Каюсь, сначала cкачал ваш курс по C#, с деньгами в нынешнее время очень не просто (особенно с ипотекой и маленьким ребенком). Курс очень понравился, действительно начинаешь понимать всю суть ООП. Хотя в некоторых моментах объяснения той или иной конструкции я так и не cмог понять, где её можно использовать и смысл её использования. А в общем, всё супер!",photo:"/Content/img/comments/14.png"},{name:"Павел Стригельский",courses:[{courseName:"C# Стартовый",link:"/video/csharp-starter"},{courseName:"C# Базовый",link:"/video/csharp-essential"}],comment:"Данный сервис нашел абсолютно случайно. Периодически смотрел бесплатные уроки, но начал задумываться о покупке курсов, т.к. курсы по .NET мне понравились. Немного огорчило, что убрали покупку любого курса за 5$ и ввели временную подписку, т.к. не всегда физически хватает времени успеть посмотреть все за определенный срок. Успел воспользоваться бесплатным курсом по C# Starter. Успешно прошел тест и продолжаю смотреть уроки по C# Essential. Автоматизирую на .NET уже порядка 2-х лет, но все равно пересмотрел курсы, начиная с самых азов. Много вещей, которые понятны и знакомы, но тем не менее, открыл для себя темы, на которые раньше не обращал внимания и, если бы мне задали вопрос, ответил бы неверно. Сейчас заполняю пробелы новыми знаниями.",photo:"/Content/img/comments/15.png"},{name:"Зита Левринц",courses:[{courseName:"портал ITVDN",link:""}],comment:"ITVDN - профессиональный ресурс как для начинающих, так и для тех, кто хочет заполнить пробелы в своих знаниях в IТ. Рекомендую всем попробовать бесплатные материалы и уверена, что многие решат взять подписку.",photo:"/Content/img/comments/17.png"},{name:"Наталья Свистун",courses:[{courseName:"C# Стартовый",link:"/video/csharp-starter"},{courseName:"C# Базовый",link:"/video/csharp-essential"},{courseName:"How to C# Essential",link:"/video/how-to-c-sharp-essential"},{courseName:"C# для профессионалов",link:"/video/csharp-for-professional-renewed"},{courseName:"Основы использования Git",link:"/video/basics-using-git"},{courseName:"ASP.NET MVC Fundamentals",link:"/video/mvc"}],comment:"Закончила факультет прикладной математики и информатики, но с большим интересом и удовольствием смотрю ваши уроки и делаю практические задания. Особенно полезно резюме каждого урока. Спасибо за вашу работу.",photo:"/Content/img/comments/19.png"},{name:"Бризинский Артем Андревич",courses:[{courseName:"портал ITVDN",link:""}],comment:"Обожаю ваши курсы, самый лучший контент из всего, что мне довелось изучить. Обучался с ITVDN до того, как нашел работу и продолжаю обучаться сейчас, так как постоянно нахожу для себя что-то новое. Отдельное спасибо Александру Шевчуку! Усвоение материала на его лекциях близко к 100%, т.к. очень интересно и тщательно подается материал, а на каждый кусок кода есть параллель с ситуацией в жизни.",photo:"/Content/img/comments/20.png"},{name:"Алена Антипова",courses:[{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"Java Esential",link:"/video/javaessential"}],comment:"Приятный ресурс, который помогает разобраться в IT направлениях. Доступная подача материала. Здорово, что вы есть!",photo:"/Content/img/comments/21.png"},{name:"Игорь Давиденко",courses:[{courseName:"HTML&CSS",link:"/video/html-and-css-renewed"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"JavaScript Advanced",link:"/video/javascript-advanced"},{courseName:"JQuery",link:"/video/jquery"},{courseName:"AngularJS Essential",link:"/video/angular-js"},{courseName:"C# Стартовый",link:"/video/csharp-starter"}],comment:"Отличные видеоуроки! Имел возможность обучаться у вас (HTML,CSS, JS, JQUERY) в CyberBionic Systematics. Лично мне более понятно и удобней учиться самостоятельно по видеокурсам. Oтдельная благодарность за подаренные видеокурсы по Angular JS и C# Starter.",photo:"/Content/img/comments/22.png"},{name:"Евген Лукашук",courses:[{courseName:"C# Базовый",link:"/video/csharp-essential"},{courseName:"C# для профессионалов",link:"/video/csharp-for-professional-renewed"}],comment:"Отличный сайт, предоставляющий высококачественные видео уроки и учебные пособия другого формата от профессиональных тренеров.",photo:"/Content/img/comments/23.jpg"},{name:"Валерий Ноздренков",courses:[{courseName:"C# Базовый",link:"/video/csharp-essential"}],comment:"Очень высокий уровень преподавателей. Александр Шевчук очень интересно и квалифицированно все преподает.",photo:"/Content/img/comments/24.png"},{name:"Руслан Водяницкий",courses:[{courseName:"SQL Essential",link:"/video/sql-essential"},{courseName:"Алгоритимы и структуры данных",link:"/video/algorithms-and-data-structures-renewed"},{courseName:"Entity Framework 6",link:"/video/entity-framework-6"},{courseName:"C# для профессионалов",link:"/video/csharp-for-professional-renewed"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"JavaScript Advanced",link:"/video/javascript-advanced"},{courseName:"HTML&CSS3",link:"/video/html-and-css-renewed"},{courseName:"ASP.NET Базовый",link:"/video/asp-net-essential"}],comment:"Очень хорошо структурировано обучение, всегда знаешь что будешь изучать дальше. Преподаватели очень профессиональны как разработчики и как учителя, особенно Александр Шевчук. Очень сильно подтянул знания благодаря его курсам.",photo:"/Content/img/comments/25.png"},{name:"Сергей Васенин",courses:[{courseName:"C# Базовый",link:"/video/csharp-essential"},{courseName:"C# для профессионалов",link:"/video/csharp-for-professional-renewed"},{courseName:"ASP.NET Базовый",link:"/video/asp-net-essential"},{courseName:"ASP.NET Углубленный",link:"/video/asp-net-advanced"},{courseName:"SQL Essential",link:"/video/sql-essential"},{courseName:"ASP.NET MVC Fundamentals",link:"/video/mvc"},{courseName:"WCF Essential",link:"/video/wcf-essential"}],comment:"Мне очень нравится ваш ресурс, в свое время помог разложить знания по полочкам. Я занимаюсь программированием как хобби, профессионального опыта не хватает и некому подсказать по архитектуре проектов. Было бы отлично иметь возможность общатсья с ментором.",photo:"/Content/img/comments/26.png"},{name:"Буглак Сергей Александрович",courses:[{courseName:"HTML5 & CSS3",link:"/video/html5-and-css3"},{courseName:"How to Java Starter"},{courseName:"Java Starter",link:"/video/java-starter"},{courseName:"Java Essential",link:"/video/javaessential"}],comment:"ITVDN - достаточно мощный сервис для самообразования. Теория + Примеры + Тренажер + Тест - отличный набор для закрепления знаний. Уроки настолько подробно рассказаны, что даже ленивый сможет понять, о чем идет речь.",photo:"/Content/img/comments/Буглак%20Сергей-min.jpg"},{name:"Сергей Малков",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"},{courseName:"C# для профессионалов - обновленный",link:"/video/csharp-for-professional-renewed"}],comment:"После окончания университета у меня осталось много пробелов в знаниях",photo:"/Content/img/comments/Сергей%20Малков-min.jpg"},{name:"Ткаченко Андрей",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"},{courseName:"C# для профессионалов - обновленный",link:"/video/csharp-for-professional-renewed"},{courseName:"Entity Framework 6",link:"/video/entity-framework-6"},{courseName:"SQL Essential",link:"/video/sql-essential"},{courseName:"HTML5&CSS3",link:"/video/html5-and-css3"},{courseName:"Twitter Bootstrap 3",link:"/video/bootstrap"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"ASP.NET Core",link:"/video/aspnet-core-essential"}],comment:'Замечательная база видеоуроков. Я начинал с "полного" нуля в программировании. Уже после стартового курса C# я мог писать простые приложения. На данный момент я продолжаю обучение, но мне уже предлагают работу разработчиком :) что лишний раз подтверждает качество излагаемого материала. Кроме того, очень большой плюс данного вида обучения: вам не нужно никуда ходить. Есть возможность учить дома в удобном кресле в любое время:) Спасибо ITVDN! Растите, развивайтесь и наполняйте базу новыми уроками:)',photo:"/Content/img/comments/Ткаченко%20Андрей-min.jpg"},{name:"Валерий Стефаник",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"HTML&CSS",link:"/video/html-and-css-renewed"},{courseName:"Angular Essential",link:"/video/angular-js"}],comment:"Спасибо за этот прекрасный ресурс! Являюсь студентом университета, но старая система образования не даёт мне изучать новые технологии, в отличие от ITVDN. Желаю развития и процветания.",photo:"/Content/img/comments/Валерий%20Стефаник-min.jpg"},{name:"Виктор Меркулов",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"SQL Essential",link:"/video/sql-essential"},{courseName:"Java Starter",link:"/video/java-starter"},{courseName:"Java Essential",link:"/video/javaessential"}],comment:"Так как мой график работы не позволяет мне посещать очные курсы программирования, онлайн курсы на платформе ITVDN являются для меня замечательной возможностью изучать программирование в любое удобное для меня время.",photo:"/Content/img/comments/Виктор%20Меркулов-min.jpg"},{name:"Юрий Мацкевич",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"},{courseName:"C# для профессионалов - обновленный",link:"/video/csharp-for-professional-renewed"}],comment:"Очень благодарен урокам Александра Шевчука, благодаря которым появилось понимание ООП и платформы .NET Уроки данного автора занимательные, материал преподносится на очень понятном и доходчивом языке, Александр всегда приводит интересные примеры и делает акценты на важных нюансах, где начинающий разработчик может совершить ошибку.",photo:"/Content/img/comments/Юрий%20Мацкевич-min.jpg"},{name:"Маргарита Красновид",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"},{courseName:"SQL Essential",link:"/video/sql-essential"}],comment:"Очень рада, что нашла ваш ресурс. Без вас и Александра Шевчука, в частности, никогда бы не поняла, что такое ООП, что такое С#.",photo:"/Content/img/comments/Маргарита%20Красновид-min.jpg"},{name:"Богдан Галкин",courses:[{courseName:"Angular Essential",link:"/video/angular-js"}],comment:"Достойный сервис, где серьезно относятся к обучению. Все грамотно поставлено, все материалы изложены на простом и понятном языке. Видеоуроков много, что так и хочется все их быстро освоить. По достоинству оценил тот факт, что большая часть предоставляемого материала бесплатная. Учителя хорошие, объясняют доступным для понимания языком.",photo:"/Content/img/comments/Богдан%20Галкин-min.jpg"},{name:"Алимов Егор",courses:[{courseName:"HTML5 & CSS3",link:"/video/html5-and-css3"}],comment:"ITVDN - наверное, лучший сайт по обучению программированию. Вот представьте, как вы поднимаетесь от первой ступени к высшим за несколько дней и становитесь непревзойдённым профессионалом, для которого написание сайта сводится к приятному занятию, а не к мучительной работе. Я рекомендую курсы обучения ITVDN, ведь это вам не просто сайт обучения, а инструмент, создающий будущее.",photo:"/Content/img/comments/Алимов%20Егор-min.jpg"},{name:"Шиляев Евгений",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"},{courseName:"SQL Essential",link:"/video/sql-essential"}],comment:"На просторах интернета Я долгое время искал портал, где я могу в формате видеоуроков изучать программирование. До этого я пробовал прочие ресурсы и сервисы, но большинство из них не отличалось качеством и простотой подачи материала. Я купил подписку и опробовал ITVDN. Мне понравился стиль подачи материала и наличие большого количества уроков. Из-за отсутствия времени я отложил обучение в долгий ящик, ведь есть еще школа, но думаю, что если уж начинать изучение какой-либо ветки навыков, то ITVDN станет хорошим стартом.",photo:"/Content/img/comments/Шиляев%20Евгений-min.jpg"},{name:"Ковальчук Таисия",courses:[{courseName:"QA Start",link:""}],comment:"Пройдя несколько курсов, вижу у преподавателей ITVDN высокий уровень знаний, навыки в простом и эффективном донесении своего предмета. С большим уважением отношусь как к лидерам проекта, так и к собранным ими командам. С уверенностью рекомендую знакомым)",photo:"/Content/img/comments/Ковальчук%20Таисия-min.jpg"},{name:"Евгений Нефёдов",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"}],comment:"Идеальный ресурс для самосовершенствования. Отлично работает в связке видеоурок ITVDN + соответствующая глава книги с планшета в метро, легко усваивается материал и после видеоурока уже проще вникать в то, что читаешь. Ваш автор со смешным голосом и забавными обращениями к зрителю (Александр Шевчук) улыбает, но подача материала такая, что можно, мне кажется, обучить программированию даже мою бабушку :)",photo:"/Content/img/comments/Евгений%20Нефёдов-min.jpg"},{name:"Щербина Роман",courses:[{courseName:"Java Starter",link:"/video/java-starter"},{courseName:"Java Essential",link:"/video/javaessential"}],comment:"Был очень вдохновлен количеством информации и количеством предоставляемых этим сервисом услуг за столь невысокую цену. Качество и подробность видеокурсов не оставляет вопросов.",photo:"/Content/img/comments/Щербина%20Роман-min.jpg"},{name:"Lena Drabyna",courses:[{courseName:"JavaScript для начинающих",link:"/video/javascript-essential"}],comment:"Очень удобная платформа для обучения как для новичков, так и для опытных программистов с адекватными ценами. Среди множества видеоуроков по разнообразным технологиям и языкам хочу особенно выделить просто отличный тренажёр, невероятно полезная штука. Спасибо!",photo:"/Content/img/comments/Lena%20Drabyna-min.jpg"},{name:"Коновальчук Владислав",courses:[{courseName:"HTML&CSS",link:"/video/html-and-css-renewed"},{courseName:"How to HTML&CSS",link:"/video/how-to-html-css"},{courseName:"JavaScript Essential",link:"/video/javascript-essential"}],comment:"Очень качественный ресурс, много полезной информации и для начинающего, и для более опытных. Материал подают очень интересно и качественно, есть возможность потренироваться всегда после пройденного материала для закрепления.",photo:"/Content/img/comments/Коновальчук%20Владислав-min.jpg"},{name:"Марина Вєрова",courses:[{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"}],comment:"Я працюю в школі вчителем інформатики 4 рік. Ще у травні 2016 на школу прийшла інформація, що можна з Вашою допомогою поглибити знання в ІТ. Я з задоволенням дивилася стартові відео деяких спеціальностей, оскільки підручники не дають того потрібного, що даєте ВИ! Влітку 2017 я придбала місячну підписку й вивчила курси Java. Вже з 1 вересня 2017 ми почали з дітьми вивчати дану мову в середовищі IntelliJIDEA. А в обласній олімпіаді потрапили у першу 10ку. 9-11 класи більш-менш можуть сприймати такий рівень, та з молодшими ми працюємо у Scratch. Розумію, що це середовище по-дитячому візуалізоване, та вже з січня 2018 з 8ми класами ми працюємо в Processing - щось на зразок Java. Дякую щиро ITVDN, що даєте можливість черпати нові знання. Дуже хотілося, щоб Ви викладали контент і для вікової групи 10-14років :-)",photo:"/Content/img/comments/Марина%20Вєрова-min.jpg"},{name:"Сергей Жидель",courses:[{courseName:"C# базовый (ООП)",link:"/video/csharp-essential"},{courseName:"C# для профессионалов - обновленный",link:"/video/csharp-for-professional-renewed"},{courseName:"Шаблоны проектирования",link:"/video/patterns-of-design"},{courseName:"ASP.NET MVC 4",link:"/video/asp-net-mvc4"},{courseName:"Unity 3D Starter",link:"/video/unity-3d"},{courseName:"Unity 3D Essential",link:"/video/unity3d-essential"},{courseName:"Unity 3D Advanced",link:"/video/unity-3d-advanced"}],comment:"Достойный сервис для тех, кто действительно хочет учиться и быть в IT. Преподаватели стараются излагать темы максимально понятно для простого обывателя. Но все же халявы нет и нужно трудиться и самому, чтоб стать специалистом. Очень рекомендую серию курсов А. Шевчука по C#, да и остальные его курсы тоже. Автор простым и понятным языком рассказывает о сложных темах, углубляясь, когда нужно, до глубоких недр .Net. Этих знаний достаточно, чтоб считаться midle-разработчиком, остается только добавить практики.",photo:"/Content/img/comments/Сергей%20Жидель-min.jpg"},{name:"Евгений Федоров",courses:[{courseName:"C# стартовый (для начинающих)",link:"/video/csharp-starter"},{courseName:"C# Starter Express",link:"/video/c-sharp-starter-express"}],comment:"Хорошо разработанные курсы, сделанные профессионалами своего дела. Радует, что каждая тема рассматривается с разных сторон, есть конспекты по каждой теме. Упоминается, что говорят о текущем вопросе другие профессионалы мирового уровня, даются советы, как лучше делать. Большое внимание уделяется правильной терминологии (А. Шевчук, курсы по C#).",photo:"/Content/img/comments/Евгений%20Федоров-min.jpg"},{name:"Евгений Бобров",courses:[{courseName:"Java Starter",link:"/video/java-starter"},{courseName:"Java Essential",link:"/video/javaessential"},{courseName:"Java Professional",link:"/video/java-professional"}],comment:'Шикарная помощь в обучении: например, проходишь курс офлайн, а между занятиями можно закрепить или, вообще, с N-го просмотра всё-таки понять материал курса, всё структурировано и "разжовано" до мелочей. Спасибо создателям, так как это реальная помощь в обучении, особенно когда нет возможности пройти его "очно", но нужно на привычном языке получить актуальные знания!',photo:"/Content/img/comments/Евгений%20Бобров-min.jpg"},{name:"Виктор Волков",courses:[{courseName:"Bootstrap 3",link:"/video/bootstrap"},{courseName:"Bootstrap 4",link:"/video/twitter-bootstrap4"},{courseName:"Создание адаптивного сайта с Bootstrap3",link:"/video/creating-adaptive-site-bootstrap3"},{courseName:"Основы использования GIT",link:"/video/basics-using-git"},{courseName:"JavaScript Advanced",link:"/video/javascript-advanced"},{courseName:"JavaScript Шаблоны",link:"/video/javascript-patterns"},{courseName:"JQuery",link:"/video/jquery"},{courseName:"Angular Essential",link:"/video/angular-js"},{courseName:"Angular Advanced",link:"/video/angular-advanced"},{courseName:"Angular CLI",link:"/video/angular_cli"},{courseName:"ReactJS Essential",link:"/video/react-js-essential"},{courseName:"PHP Essential",link:"/video/php_essential"},{courseName:"WordPress Starter",link:"/video/wordpress_str"},{courseName:"TypeScript Fundamentals",link:"/video/typescript-fundamentals"},{courseName:"Публикация веб-сайта",link:"/video/sitepublication"}],comment:"Занимаюсь более полугода, тьма сертификатов, ресурс хорошо помог вникнуть в тему веб-разработки. Очень хорошо и всесторонне рассмотрен JavaScript и все вокруг него. Классный ресурс для подтягивания знаний и всестороннего изучения процесса разработки. Ребята не отстают от основых трендов.",photo:"/Content/img/comments/Виктор%20Волков-min.jpg"},{name:"Богдан Акулов",courses:[{courseName:"JavaScript Essential",link:"/video/javascript-essential"},{courseName:"HTML & CSS",link:"/video/html-and-css-renewed"}],comment:"Меня очень приятно удивил такой формат подачи материала + конспект это вообще удобно очень. Зачастую не приходится заново всё пересматривать, а достаточно просто почитать и всё вспомнится",photo:"/Content/img/comments/Богдан%20Акулов-min.jpg"},{name:"Александр Ринас",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Отличный образовательный ресурс с большим количеством различных курсов. Просмотрел курсы ASP.NET и ASP.NET MVC, что позволило на достаточно высоком уровне овладеть данными технологиями. Понравился Тренажёр. Лекторы на пальцах всё доходчиво и понятно объясняют. Довольно гибкая система подписок, так сказать, один раз приобрёл и тебе доступно всё. Буду и дальше изучать различные технологии по данным видеокурсам. Определённо рекомендую.",photo:"/Content/img/comments/AlexanderRinas.jpg"},{name:"Максим Городничий",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Очень понравился ваш курс по Vue.js, толковый лектор, разобрался с некоторыми непонятными мне моментами. Рекомендую.",photo:"/Content/img/comments/MaximGorodnichyi.jpg"},{name:"Микола Коцаб'юк",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Очень легкая подача материала, примеры тоже понравились, спасибо большое.",photo:"/Content/img/comments/MykolaKotsabyuk.jpg"},{name:"Андрей Тюленёв",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"ITVDN - лучший сайт для изучения языков программирования. Прохожу курсы на нем уже больше года и очень доволен. Всем рекомендую. Долго искал курсы для программистов, чтобы качественно и не дорого.",photo:"/Content/img/comments/AndreyTyulenyov.jpg"},{name:"Александр Белкин",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"В целом, курс Vue.js полезный, позволяет сэкономить время на вхождение в JavaScript-фреймворк. Автор хорошо систематизировал материал курса. Каждый урок предельно сжат (ничего лишнего), в тоже время весь излагаемый материал подкреплён примерами, более того, автор курса делится рекомендациями и практикой использования фреймворка.",photo:"/Content/img/comments/AlexanderBelkin.jpg"},{name:"Денис Ермолович",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Очень хороший курс для старта. Рассмотрены все необходимые стороны фреймворка, чтобы можно было начать создавать приложения. Дальше нужна только документация и опыт.",photo:"/Content/img/comments/DenisErmolovich.jpg"},{name:"Артемий Кравцов",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Прекрасный сервис для обучения! Постоянные акции, позволяющие еще больше и лучше развиваться в тех или иных областях! Отдельное спасибо за Vue.js!",photo:"/Content/img/comments/ArtemijKravtsov.jpg"},{name:"Руслан Алексеенко",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Пользуюсь ресурсом для самообразования в области IT, есть также много видео в соцсетях и YouTube, там много интересного. Например, прослушал практический курс Vue.js, это теория и живая практика. Всем рекомендую, каждый найдет для себя то, что интересно. Подписывайтесь и изучайте!",photo:"/Content/img/commentsslanAlekseenko.jpg"},{name:"Алексей Сугоняк",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Собирался разобраться с современными фреймворками, я сейчас о Vue.js и React, посмотреть, что они могут, насколько чем удобно пользоваться. И ITVDN на новый год предоставил возможность бесплатно, уже не первый раз, кстати, (следите за анонсами на портале!), изучить курс по Vue.js. На официальном сайте есть вполне себе неплохая справка на русском, небольшие видео на английском, проблем с пониманием не должно возникнуть, но, конечно, приятнее смотреть на родном языке, в курсе, где разработчик, который уже знает, что и как делать, расскажет и покажет все это вам на примерах. Это здорово экономит время. Пока не могу вспомнить ни одного курса от ITVDN, который бы мне не понравился, а у меня феноменальная память). Резюмируем: быстрое вхождение в тему, средняя сложность, понятно и доступно рассказано о привязках, формах, отображении данных, компонентах, анимации, переходах, роутах. Заодно об использовании npm и git. Я думаю, web-разработчикам понравится.",photo:"/Content/img/comments/AlekseySugonyak.jpg"},{name:"Марьенко Виктория",courses:[{courseName:"Vue.js",link:"/video/vuejs-essential"}],comment:"Сайт ITVDN - незаменимый помощник в моей работе, на нём можно найти много тщательно отобранных курсов, которые создают профессионалы.",photo:"/Content/img/comments/MaryanenkoViktoria.jpg"}]))});;
$(document).ready(function(){$(".search-result__info a h2").dotdotdot();$(".search-result__descr").dotdotdot();$(".search-item-image-url").on("error",function(){var n=$(this),t=n.parent(".search-result-img");t.hide()})});;
$(document).ready(function () {
    const scope = '~/js/custom/home/home-tabs.js';

    const tabsBlock = $('.home-training__tabs'),
        tab = tabsBlock.find('.home-training__tab-item'),
        output = $('.home-training__output'),
        tabTitle = output.find('.home-training__output-title'),
        tabInfo = output.find('.home-training__output-info'),
        tabImg = output.find('.home-training__output-img');

    const outputData = [
        {
            id: 'videoLesson',
            title: $.R(scope, "VideoLesson", "Видео уроки"),
            info: $.R(scope, "VideoLessonInfo", "Смотри видео уроки и повторяй за преподавателем все практические задачи, которые он показывает. Для большего удобства загрузи и используй готовый код примеров, презентацию и опорный конспект с базовыми понятиями к каждому уроку."),
            imgUrl: `/Content/img/home/tabs/video-lesson-${localization.cultureUrl}.png`
        },
        {
            id: 'practiceTask',
            title: $.R(scope, "PracticeTask", "Практические задания"),
            info: $.R(scope, "PracticeTaskInfo", "Выполняй практические задания к каждому уроку! Без практики прогресса не будет. Задания описаны в пакете документов к уроку. Выполненную задачу ты можешь отправить на проверку ментору (см. эту опцию в личном кабинете)."),
            imgUrl: `/Content/img/home/tabs/practice-task-${localization.cultureUrl}.png`
        },
        {
            id: 'testing',
            title: $.R(scope, "Testing", "Тестирование"),
            info: $.R(scope, "TestingInfo", "После каждого урока проверяй, полностью ли ты усвоил материал – проходи поурочные тесты на TestProvider и если есть пробелы в знаниях, просматривай соответствующие темы видео урока снова или обратись за помощью к ментору."),
            imgUrl: `/Content/img/home/tabs/testing-${localization.cultureUrl}.png`
        },
        {
            id: 'certificate',
            title: $.R(scope, "Certificate", "Сертификат"),
            info: $.R(scope, "CertificateInfo", "Если курс пройден, все практические задания выполнены и ты чувствуешь, что готов сдать финальный экзамен – сделай это и получи Сертификат, подтверждающий твои знания. Ссылки на сертификат можно добавить в резюме и профиле LinkedIn."),
            imgUrl: `/Content/img/home/tabs/certificate-${localization.cultureUrl}.png`
        }
    ];

    tabTitle.text(outputData[0].title);
    tabInfo.text(outputData[0].info);
    tabImg.attr('src', outputData[0].imgUrl);

    tab.on('click', function () {
        let selectedTab = $(this).attr('id');
        $(this).addClass('active').siblings().removeClass('active');

        outputData.forEach((data) => {
            if (selectedTab === data.id) {
                showTab(data);
            }
        });
    });

    function showTab(outputData) {
        tabTitle.text(outputData.title);
        tabInfo.text(outputData.info);
        tabImg.attr('src', outputData.imgUrl);
    }
});;
$(document).ready(function () {
    const slickSlider = ITVDN.slickSlider;

    function checkNumber($items, maxNumberOfVisible) {
        return $items.length > maxNumberOfVisible;
    }

    function initSliderCourses() {
        const wideScreenWidth = 1024,
            currentScreenWidth = document.documentElement.clientWidth,
            wrapper = $('.home-video__courses-block'),
            items = wrapper.find('.home-video__course-item'),
            maxNumberOfVisible = currentScreenWidth > wideScreenWidth ? 3 : 2;

        if (checkNumber(items, maxNumberOfVisible)) {
            const config = slickSlider.configure({
                slidesToShow: maxNumberOfVisible,
                prevArrow: '<span class="fa fa-arrow-left arrow prev"></span>',
                nextArrow: '<span class="fa fa-arrow-right arrow next"></span>'
            });

            slickSlider.destroy(wrapper);
            slickSlider.init(wrapper, config);
        }
    }

    function initSliderNews() {
        const wideScreenWidth = 900,
            widthScreenForDestroy = 600,
            currentScreenWidth = document.documentElement.clientWidth,
            wrapper = $('.news-and-shares__block'),
            items = wrapper.find('.news-and-shares__item'),
            maxNumberOfVisible = currentScreenWidth > wideScreenWidth ? 3 : 2;

        if (currentScreenWidth < widthScreenForDestroy) {
            slickSlider.destroy(wrapper);
            return
        }

        if (checkNumber(items, maxNumberOfVisible)) {
            const config = slickSlider.configure({
                slidesToShow: maxNumberOfVisible,
                prevArrow: '<span class="fa fa-arrow-left arrow prev"></span>',
                nextArrow: '<span class="fa fa-arrow-right arrow next"></span>'
            });

            slickSlider.destroy(wrapper);
            slickSlider.init(wrapper, config);
        }
    }

    initSliderCourses();
    initSliderNews();

    const debounceInitSliderCourses = debounce(initSliderCourses, 500);
    $(window).on('resize', debounceInitSliderCourses);

    const debounceInitSliderNews = debounce(initSliderNews, 500);
    $(window).on('resize', debounceInitSliderNews);
});;
function debounce(func, wait, immediate) {
    let timeout;

    return function () {
        const context = this, args = arguments;

        const later = function () {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };

        const callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};
/**
* jquery-match-height master by @liabru
* http://brm.io/jquery-match-height/
* License: MIT
*/

;(function(factory) { // eslint-disable-line no-extra-semi
    'use strict';
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery'], factory);
    } else if (typeof module !== 'undefined' && module.exports) {
        // CommonJS
        module.exports = factory(require('jquery'));
    } else {
        // Global
        factory(jQuery);
    }
})(function($) {
    /*
    *  internal
    */

    var _previousResizeWidth = -1,
        _updateTimeout = -1;

    /*
    *  _parse
    *  value parse utility function
    */

    var _parse = function(value) {
        // parse value and convert NaN to 0
        return parseFloat(value) || 0;
    };

    /*
    *  _rows
    *  utility function returns array of jQuery selections representing each row
    *  (as displayed after float wrapping applied by browser)
    */

    var _rows = function(elements) {
        var tolerance = 1,
            $elements = $(elements),
            lastTop = null,
            rows = [];

        // group elements by their top position
        $elements.each(function(){
            var $that = $(this),
                top = $that.offset().top - _parse($that.css('margin-top')),
                lastRow = rows.length > 0 ? rows[rows.length - 1] : null;

            if (lastRow === null) {
                // first item on the row, so just push it
                rows.push($that);
            } else {
                // if the row top is the same, add to the row group
                if (Math.floor(Math.abs(lastTop - top)) <= tolerance) {
                    rows[rows.length - 1] = lastRow.add($that);
                } else {
                    // otherwise start a new row group
                    rows.push($that);
                }
            }

            // keep track of the last row top
            lastTop = top;
        });

        return rows;
    };

    /*
    *  _parseOptions
    *  handle plugin options
    */

    var _parseOptions = function(options) {
        var opts = {
            byRow: true,
            property: 'height',
            target: null,
            remove: false
        };

        if (typeof options === 'object') {
            return $.extend(opts, options);
        }

        if (typeof options === 'boolean') {
            opts.byRow = options;
        } else if (options === 'remove') {
            opts.remove = true;
        }

        return opts;
    };

    /*
    *  matchHeight
    *  plugin definition
    */

    var matchHeight = $.fn.matchHeight = function(options) {
        var opts = _parseOptions(options);

        // handle remove
        if (opts.remove) {
            var that = this;

            // remove fixed height from all selected elements
            this.css(opts.property, '');

            // remove selected elements from all groups
            $.each(matchHeight._groups, function(key, group) {
                group.elements = group.elements.not(that);
            });

            // TODO: cleanup empty groups

            return this;
        }

        if (this.length <= 1 && !opts.target) {
            return this;
        }

        // keep track of this group so we can re-apply later on load and resize events
        matchHeight._groups.push({
            elements: this,
            options: opts
        });

        // match each element's height to the tallest element in the selection
        matchHeight._apply(this, opts);

        return this;
    };

    /*
    *  plugin global options
    */

    matchHeight.version = 'master';
    matchHeight._groups = [];
    matchHeight._throttle = 80;
    matchHeight._maintainScroll = false;
    matchHeight._beforeUpdate = null;
    matchHeight._afterUpdate = null;
    matchHeight._rows = _rows;
    matchHeight._parse = _parse;
    matchHeight._parseOptions = _parseOptions;

    /*
    *  matchHeight._apply
    *  apply matchHeight to given elements
    */

    matchHeight._apply = function(elements, options) {
        var opts = _parseOptions(options),
            $elements = $(elements),
            rows = [$elements];

        // take note of scroll position
        var scrollTop = $(window).scrollTop(),
            htmlHeight = $('html').outerHeight(true);

        // get hidden parents
        var $hiddenParents = $elements.parents().filter(':hidden');

        // cache the original inline style
        $hiddenParents.each(function() {
            var $that = $(this);
            $that.data('style-cache', $that.attr('style'));
        });

        // temporarily must force hidden parents visible
        $hiddenParents.css('display', 'block');

        // get rows if using byRow, otherwise assume one row
        if (opts.byRow && !opts.target) {

            // must first force an arbitrary equal height so floating elements break evenly
            $elements.each(function() {
                var $that = $(this),
                    display = $that.css('display');

                // temporarily force a usable display value
                if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') {
                    display = 'block';
                }

                // cache the original inline style
                $that.data('style-cache', $that.attr('style'));

                $that.css({
                    'display': display,
                    'padding-top': '0',
                    'padding-bottom': '0',
                    'margin-top': '0',
                    'margin-bottom': '0',
                    'border-top-width': '0',
                    'border-bottom-width': '0',
                    'height': '100px',
                    'overflow': 'hidden'
                });
            });

            // get the array of rows (based on element top position)
            rows = _rows($elements);

            // revert original inline styles
            $elements.each(function() {
                var $that = $(this);
                $that.attr('style', $that.data('style-cache') || '');
            });
        }

        $.each(rows, function(key, row) {
            var $row = $(row),
                targetHeight = 0;

            if (!opts.target) {
                // skip apply to rows with only one item
                if (opts.byRow && $row.length <= 1) {
                    $row.css(opts.property, '');
                    return;
                }

                // iterate the row and find the max height
                $row.each(function(){
                    var $that = $(this),
                        style = $that.attr('style'),
                        display = $that.css('display');

                    // temporarily force a usable display value
                    if (display !== 'inline-block' && display !== 'flex' && display !== 'inline-flex') {
                        display = 'block';
                    }

                    // ensure we get the correct actual height (and not a previously set height value)
                    var css = { 'display': display };
                    css[opts.property] = '';
                    $that.css(css);

                    // find the max height (including padding, but not margin)
                    if ($that.outerHeight(false) > targetHeight) {
                        targetHeight = $that.outerHeight(false);
                    }

                    // revert styles
                    if (style) {
                        $that.attr('style', style);
                    } else {
                        $that.css('display', '');
                    }
                });
            } else {
                // if target set, use the height of the target element
                targetHeight = opts.target.outerHeight(false);
            }

            // iterate the row and apply the height to all elements
            $row.each(function(){
                var $that = $(this),
                    verticalPadding = 0;

                // don't apply to a target
                if (opts.target && $that.is(opts.target)) {
                    return;
                }

                // handle padding and border correctly (required when not using border-box)
                if ($that.css('box-sizing') !== 'border-box') {
                    verticalPadding += _parse($that.css('border-top-width')) + _parse($that.css('border-bottom-width'));
                    verticalPadding += _parse($that.css('padding-top')) + _parse($that.css('padding-bottom'));
                }

                // set the height (accounting for padding and border)
                $that.css(opts.property, (targetHeight - verticalPadding) + 'px');
            });
        });

        // revert hidden parents
        $hiddenParents.each(function() {
            var $that = $(this);
            $that.attr('style', $that.data('style-cache') || null);
        });

        // restore scroll position if enabled
        if (matchHeight._maintainScroll) {
            $(window).scrollTop((scrollTop / htmlHeight) * $('html').outerHeight(true));
        }

        return this;
    };

    /*
    *  matchHeight._applyDataApi
    *  applies matchHeight to all elements with a data-match-height attribute
    */

    matchHeight._applyDataApi = function() {
        var groups = {};

        // generate groups by their groupId set by elements using data-match-height
        $('[data-match-height], [data-mh]').each(function() {
            var $this = $(this),
                groupId = $this.attr('data-mh') || $this.attr('data-match-height');

            if (groupId in groups) {
                groups[groupId] = groups[groupId].add($this);
            } else {
                groups[groupId] = $this;
            }
        });

        // apply matchHeight to each group
        $.each(groups, function() {
            this.matchHeight(true);
        });
    };

    /*
    *  matchHeight._update
    *  updates matchHeight on all current groups with their correct options
    */

    var _update = function(event) {
        if (matchHeight._beforeUpdate) {
            matchHeight._beforeUpdate(event, matchHeight._groups);
        }

        $.each(matchHeight._groups, function() {
            matchHeight._apply(this.elements, this.options);
        });

        if (matchHeight._afterUpdate) {
            matchHeight._afterUpdate(event, matchHeight._groups);
        }
    };

    matchHeight._update = function(throttle, event) {
        // prevent update if fired from a resize event
        // where the viewport width hasn't actually changed
        // fixes an event looping bug in IE8
        if (event && event.type === 'resize') {
            var windowWidth = $(window).width();
            if (windowWidth === _previousResizeWidth) {
                return;
            }
            _previousResizeWidth = windowWidth;
        }

        // throttle updates
        if (!throttle) {
            _update(event);
        } else if (_updateTimeout === -1) {
            _updateTimeout = setTimeout(function() {
                _update(event);
                _updateTimeout = -1;
            }, matchHeight._throttle);
        }
    };

    /*
    *  bind events
    */

    // apply on DOM ready event
    $(matchHeight._applyDataApi);

    // use on or bind where supported
    var on = $.fn.on ? 'on' : 'bind';

    // update heights on load and resize events
    $(window)[on]('load', function(event) {
        matchHeight._update(false, event);
    });

    // throttled update heights on resize events
    $(window)[on]('resize orientationchange', function(event) {
        matchHeight._update(true, event);
    });

});
;
function getMaterials(link) {
    $.ajax({
        type: 'POST',
        url: '/Video/GetLinkToMaterials',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        data: JSON.stringify({ linkToMaterials: link }),
        success: function (result) {
            if (result) {
                const link = document.createElement('a');
                link.href = result;
                link.target = '_blank';
                link.download = '';
                link.style.display = 'none';
                document.body.appendChild(link);

                link.click();
                document.body.removeChild(link);
            }
        }
    });
}

function formatNumber(number) {
    var string = number.toString();

    if (string.length == 1) {
        string = '0' + string;
    }

    return string;
}

function stringToDate(dateString) {
    dateString += 'Z';
    return new Date(dateString);
}

function getEndDate(startDate, duration) {
    return new Date(startDate.getTime() + duration * 60000);
}

function showLocalizedDate() {
    $('.date').each(function () {
        let span = $(this),
            dateString = span.attr('data-date'),
            date = stringToDate(dateString);

        span.html(formatNumber(date.getDate()) + '.' + formatNumber((date.getMonth() * 1 + 1)) + '.' + date.getFullYear());
    });

    $('.time').each(function () {
        let span = $(this),
            dateString = span.attr('data-date'),
            duration = span.attr('data-duration'),
            startDate = stringToDate(dateString),
            endDate = getEndDate(startDate, duration * 1),
            startTime = formatNumber(startDate.getHours()) + ':' + formatNumber(startDate.getMinutes()),
            endTime = formatNumber(endDate.getHours()) + ':' + formatNumber(endDate.getMinutes());

        span.html(startTime + ' - ' + endTime);
    });
}

$(document).ready(function () {
    $('.get-materials').on('click', function (e) {
        e.preventDefault();

        var link = $(e.currentTarget).data('link');
        getMaterials(link);
    });

    showLocalizedDate();
});
"use strict";function _classCallCheck(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function");}var _createClass=function(){function n(n,t){for(var i,r=0;r<t.length;r++)i=t[r],i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(n,i.key,i)}return function(t,i,r){return i&&n(t.prototype,i),r&&n(t,r),t}}(),TwoStepFormModal=function(){function n(t){_classCallCheck(this,n);this._container=$("#"+t);this._loader=this._container.find(".application__loader");this._closeBtn=this._container.find(".close-modal");this._step1=this._container.find(".application__step-1");this._form=this._step1.find("form");this._step2=this._container.find(".application__step-2");this._stepSuccess=this._container.find(".application__step-success");this._isDevelopment=window.isDevelopment;this._init()}return _createClass(n,[{key:"showModal",value:function(){this._showBlock(this._step1);this._container.css({display:"flex"})}},{key:"hideModal",value:function(){this._container.hide()}},{key:"setLeelooCode",value:function(n,t){var i=$(".default-message"),r=$(".without-telegram");n||t?(i.hide(),r.show()):(i.show(),r.hide());this._leelooCode=n;this._telegramUrl=t}},{key:"_init",value:function(){var t=this,n;this._showBlock(this._loader);this._bindStep1Events();n=this;this._closeBtn.click(function(){n.hideModal()});$(document).mouseup(function(t){var i=n._container.find(".application__view");i.is(t.target)||i.has(t.target).length!==0||n.hideModal()});$(".application__leeloo-none-upload").find("a").click(function(){t._showBlock(t._stepSuccess)})}},{key:"_showBlock",value:function(n){this._loader.hide();this._step1.hide();this._step2.hide();this._stepSuccess.hide();n.css({display:"flex"})}},{key:"_bindStep1Events",value:function(){var n=this,t=n._form;t.submit(function(i){i.preventDefault();n._submitForm(t)})}},{key:"_submitForm",value:function(n){var e=this,t,i,f,r,u;if(n.valid()){for(t=this,i=n.find("ul.erros"),t._dateWebinar=this._container.attr("data-date"),t._showBlock(t._loader),i.html(""),i.hide(),f=n.serializeArray(),r={},u=0;u<f.length;u++)r[f[u].name]=f[u].value;var o=$(".application__leeloo-none-upload"),s=$("#leeloo-hash"),h=n.attr("action");ITVDN.http.post(h,JSON.stringify(r),"json","application/json; charset=utf-8").then(function(u){var h;if(u.Succeeded===!0){if(o.show().find("a").attr("href",e._telegramUrl),t._leelooCode){var l="?name="+r.Name+" "+r.Surname+"&email="+r.Email+"&phone="+r.Phone+"&language="+localization.cultureUrl+"&time="+t._dateWebinar,c=s.find("iframe"),a=c.attr("src"),f=a+l;f=e._telegramUrl||f;c.attr("src",f);s.hide();o.show().find("a").attr("href",f);c.on("load",function(){s.show();o.hide()})}t._showBlock(t._step2);n[0].reset();n.hasClass("webinar-register")&&!e._isDevelopment&&fbq("trackCustom","eventWebinarRegistration",{webinarName:n.attr("data-webinar-url").split("/").pop()})}else if(u.Message)i.append("<li>"+u.Message+"<\/li>"),i.show(),t._showBlock(t._step1);else if(u.ValidationMessages){for(h=0;h<u.ValidationMessages.length;h++)i.append("<li>"+u.ValidationMessages[h]+"<\/li>");i.show();t._showBlock(t._step1)}else t._showBlock(t._step1)})["catch"](function(n){t._showBlock(t._step1);console.log(n.status+" -> "+n.statusText);console.log(n);alert("Виникла помилка при відправленні заявки, спробуйте заповнити і відправити ще раз! Якщо проблема не зникає, зверніться до служби підтримки ITVDN")})}}}]),n}();;
$('.open-modal').click(function() {
    let leelooCode = $(this).attr('data-leeloo-code'),
        leelooHash = $('#leeloo-hash');
    
    if (leelooCode == '') {
        return false
    }
    
    leelooHash.removeAttr('class');
    leelooHash.addClass('leeloo-hash-' + leelooCode);

    let js = document.createElement('script');
        js.src = 'https://app.leeloo.ai/init.js';
        js.async = true;
        js.className = 'leeloo-script';
    
    let scriptLeeloo = document.querySelector('.leeloo-script');
    
    if (scriptLeeloo) {
        document.getElementsByTagName('head')[0].removeChild(scriptLeeloo);
    }

    window.LEELOO = function(){
        window.LEELOO_INIT = { id: '62b5d49ef3519707ffa194d6' };
        document.getElementsByTagName('head')[0].appendChild(js);
    }; LEELOO();

    window.LEELOO_LEADGENTOOLS = (window.LEELOO_LEADGENTOOLS || []).concat(leelooCode);
});;
$(document).ready(function () {
    const scope = '~/js/custom/webinars/nearest.js';

    function getTimeRemaining(endtime) {
        const t = endtime - Date.parse(new Date()),
            seconds = Math.floor((t / 1000) % 60),
            minutes = Math.floor((t / 1000 / 60) % 60),
            hours = Math.floor((t / (1000 * 60 * 60)) % 24),
            days = Math.floor(t / (1000 * 60 * 60 * 24));

        return {
            'total': t,
            'days': days,
            'hours': hours,
            'minutes': minutes,
            'seconds': seconds
        };
    }

    const webinarStartedText = $.R(scope, "WebinarStarted", "Вебинар начался");

    function initializeClock(clock, endtime) {
        const days = clock.find('.days'),
            hours = clock.find('.hours'),
            minutes = clock.find('.minutes'),
            seconds = clock.find('.seconds');

        const timeinterval = setInterval(function () {
            const t = getTimeRemaining(endtime);

            days.text(t.days);
            hours.text(t.hours);
            minutes.text(t.minutes);
            seconds.text(t.seconds);

            if (t.total <= 0) {
                clearInterval(timeinterval);
                clock.find('> span').text(webinarStartedText);
            }
        }, 1000);
    }

    function initRegisterModal() {
        window.webinarRegistrationModal = new TwoStepFormModal('web-reg-form');
        let modal = window.webinarRegistrationModal,
            openBtn = $('.open-modal')

        openBtn.on('click', function (e) {
            e.preventDefault();
            var btn = $(this),
                webinarUrl = btn.attr('data-webinar-url'),
                webinarId = btn.attr('data-webinar-id'),
                leelooCode = btn.attr('data-leeloo-code'),
                telegramUrl = $(this).attr('data-telegram-url'),
                dateWebinar = btn.parent().siblings().find('[data-date]').attr('data-date');

            showOrHideWebinarExtraQuestions(btn, modal._form);

            modal._form.find('input[name="WebinarId"]').val(webinarId);
            modal.setLeelooCode(leelooCode, telegramUrl);
            modal.showModal();
            $('.application').attr('data-date', dateWebinar);
            $('.application').find('form.webinar-register').attr('data-webinar-url', webinarUrl);

            if (window.userIsAuthenticated == 'True') {
                ITVDN.http.get('/api/cabinet/get-user-data')
                    .then((data) => {
                        let form = modal._form;

                        form.find('input[name="Name"]').val(data.firstName);
                        form.find('input[name="Surname"]').val(data.lastName);
                        form.find('input[name="Email"]').val(data.email);

                        form.find('input.intl-phone-input').intlTelInput('setNumber', data.phoneNumber);
                        form.find('input#phone-input-2').val(data.phoneNumber);
                    });
            }
        });
    }

    function showOrHideWebinarExtraQuestions(btn, form) {
        var isAskConsultationNeed = btn.attr('data-is-ask-consultation-need'),
            isAskVideoRecordingNeed = btn.attr('data-is-ask-video-recording-need'),
            isAskFreeLessonNeed = btn.attr('data-is-ask-free-lesson-need'),
            askConsultationNeedDiv = form.find('div[id="ask-consultation-need"]'),
            askVideoRecordingNeedDiv = form.find('div[id="ask-video-recording-need"]'),
            askFreeLessonNeedDiv = form.find('div[id="ask-free-lesson-need"]');

        if (isAskConsultationNeed == 'True') {
            askConsultationNeedDiv.show();
        }
        else {
            askConsultationNeedDiv.hide();
        }

        if (isAskVideoRecordingNeed == 'True') {
            askVideoRecordingNeedDiv.show();
        }
        else {
            askVideoRecordingNeedDiv.hide();
        }

        if (isAskFreeLessonNeed == 'True') {
            askFreeLessonNeedDiv.show();
        }
        else {
            askFreeLessonNeedDiv.hide();
        }
    }

    $('.timer').each(function () {
        let clock = $(this),
            dateString = clock.attr('data-date');

        initializeClock(clock, stringToDate(dateString));
    });

    function calcHeight() {
        let heightWebinar = $('.height-for-scroll').outerHeight();
        heightWebinar = heightWebinar + 100 + 'px';
        $('.list-of-nearest-webinars').css('height', heightWebinar);
    }

    function checkImageLoad() {
        if (window.matchMedia('(min-width: 901px)').matches) {
            let image = document.querySelector('.main-image');

            if (image.complete) {
                calcHeight();
            } else {
                image.addEventListener('load', function () {
                    calcHeight();
                });
            }
        } else {
            $('.list-of-nearest-webinars').css('height', 'auto');
        }
    }

    $(window).on('resize', () => {
        checkImageLoad();
    });

    checkImageLoad();
    initRegisterModal()
});
;
