Address: | 635 W Washington Blvd Suite #200, Los Angeles, 90015 |
Phone: | +1 213-474-3305 |
Website: | Go to site |
Social networks: | |
Work time: | Monday:6AM-7PM Tuesday:6AM-7PM Wednesday:6AM-7PM Thursday:6AM-7PM Friday:6AM-7PM Saturday:6AM-5PM Sunday:Closed |
| |
Nissan of Downtown LA Auto Parts is located at 635 W Washington Blvd Suite #200 Los Angeles 90015, US Nissan Service Specials in Los Angeles | Nissan of Downtown L.A. Our rotating car repair specials help you save on the services your Nissan needs most. Explore our current offers online! .slider3588-slider .video-wrapper, .slider3588-slider .swiper-container[class='swiper-container'] { padding-top: 17.857142857143% } .slider3588-slider .swiper-container[class='swiper-container'] { height: 0; overflow: hidden; position: relative; } .slider3588-slider .swiper-container[class='swiper-container'] .swiper-wrapper { position: absolute; top: 0; left: 0; } @media (max-width: 767px) { .slider3588-slider .video-wrapper, .slider3588-slider .swiper-container[class='swiper-container'] { padding-top: 66.666666666667%; } } jQuery(document).ready(function($) { var Personalization = { sliderObject: {}, sliderguid: '', cookieName: '', filterKey: '', slider: '', slidesList: [], main: function(sliderJSON) { this.sliderObject = sliderJSON this.sliderguid = this.sliderObject.guid var cookieParts = this.sliderObject.cookiename.split('.') this.cookieName = cookieParts[0] if (cookieParts[1]) { this.filterKey = cookieParts[1] } if(this.cookieName === 'di_query_string'){ this.setupQueryCookie(window.location.search) } this.setSlider() this.getSlides() if(this.shouldFilter()) { this.filterInit() } }, cookieExists: function(cookieName) { if (this.getCookie(cookieName)) { return true } }, setSlider: function() { this.slider = $("[data-disliderguid='" + this.sliderguid + "']") }, getSlides: function() { this.slidesList = this.slider[0].querySelectorAll(".swiper-wrapper .di-slide") }, shouldFilter: function() { return this.slider[0].querySelectorAll('.swiper-wrapper .di-slide:not([data-filtervalue=""])').length > 0 }, setupQueryCookie: function(url){ if(!this.cookieExists(this.cookieName) && this.cookieName === 'di_query_string'){ DealerInspireCookie.CreateCookie(this.cookieName, '', 5) } var params = new URLSearchParams(url), items = []; for (const key of params.keys()){ if (key.includes(this.filterKey)){ items.push(params.get(key)) } } if(items.length){ var obj = {} obj[this.filterKey] = items DealerInspireCookie.CreateCookie(this.cookieName, JSON.stringify(obj), 5) } }, filterInit: function() { if (this.cookieName && typeof this['filter__' + this.cookieName] === 'function') { this['filter__' + this.cookieName]() } }, filter__di_vehicle_history: function() { if (this.getCookie(this.cookieName) && this.filterKey) { var self = this, reorderedSlides = [], unfilteredSlides = []; try { // Required for Personalizer 1.5.0+ vehicleHistoryArray = JSON.parse(this.cookieName); } catch (error) { // Legacy (currently '1.4.36.5', '1.4.36.6', '1.4.36.7') vehicleHistoryArray = this.unserialize(decodeURIComponent(this.getCookie(this.cookieName))); } if (Object.keys(vehicleHistoryArray).length && vehicleHistoryArray[this.filterKey].length) { var slideSpliceKeys = [] vehicleHistoryArray[this.filterKey].forEach(function(v, k) { v = v.split('+').join(' ').toLowerCase() for (var i = 0; i 1) } function playVideoSlide(slide, swiper) { if (slide.type != "video") { return } var slidePlayer, activeIndex = swiper.activeIndex, realSlide = swiper.slides[activeIndex], isDuplicateSlide = $(realSlide).hasClass('swiper-slide-duplicate'), useSlideAudio = slide.videoSlideAudio, slideID = (isDuplicateSlide) ? slide.guid + "-video-duplicate" : slide.guid + "-video"; $currentSlide = $('[data-guid="'+slide['guid']+'"]'); if (isDuplicateSlide && typeof slide.playerDuplicate == 'object' && typeof slide.videoStart != 'undefined') { slidePlayer = slide.playerDuplicate } else if (! isDuplicateSlide && typeof slide.player == 'object' && typeof slide.videoStart != 'undefined') { slidePlayer = slide.player } // if (typeof slidePlayer != 'undefined' && typeof slidePlayer.seekTo == 'function' && slidePlayer) { if (slidePlayer) { slidePlayer.seekTo(slide.videoStart) slidePlayer.pauseVideo() if (! useSlideAudio) { slidePlayer.playVideo() } else { showPlayButton($currentSlide) } if (hasNextSlide(slide, swiper)) { slideAfterDuration(slide) } return; } // - stop swiper autoplay if video needs to go to next slide after duration is done so slides don't prematurely transition if the page takes longer to load // - Video will automatically go to next slide and autoplay will be re-enabled if there are other images in the slider // - If custom duration is not set and videos prematurely transition, a longer duration would need to be set on the main slider if (hasNextSlide(slide, swiper)) { swiper.autoplay.stop() } // if slide is supposed to slide to next slide after duration, do not loop the video var ytConfigLoop = (hasNextSlide(slide, swiper)) ? 0 : 1 var player = new YT.Player(slideID, { videoId: slide.videoId, width: '100%', height: '100%', host: 'https://www.youtube-nocookie.com', playerVars: { origin: window.location.host, autoplay: 1, loop: ytConfigLoop, rel: 0, controls: 0, showinfo: 0, modestbranding: 1, fs: 0, // Hide fullscreen button cc_load_policy: 0, // Disable closed captions iv_load_policy: 3, // Disable video annotations autohide: 1, mute: 1 // do not used playlist property, if playlist property is used, after video is played, playerstate = 0 is never fired. Need to know when player is finished with video }, events: { onReady: function(event) { /* Maybe deprecate this since youtube videos could be played if using the audio option */ if (useSlideAudio) { // due to the nature of youtube, we must use stopVideo here // or else there will be a loading icon that appears // with no graphic of the video to let the user know // what video they're playing event.target.stopVideo() addPlayButton(slide) addPauseButton(slide) if(event.target.isMuted()) { event.target.unMute() } } else { if(! event.target.isMuted()) { event.target.mute() } } if (slide.videoStart && ! useSlideAudio) { event.target.seekTo(slide.videoStart) } if (! useSlideAudio) { event.target.playVideo() } // if slide to next slide after duration is set then check current youtube // video time and slide to next slide once duration is complete if (hasNextSlide(slide, swiper)) { slideAfterDuration(slide) } }, onStateChange: function(event) { /* Maybe deprecate this since youtube videos could be played if using the audio option */ /* if (isMobile()) { return false } */ var hasCustomTiming = slide.videoEnd if (hasCustomTiming) { // IF custom timing is defined, and Slide to next slide after video is done = false then restart video to videoStart position // If autoplay has been disabled (when clicking on prev/next/pagination) then loop the video if (! hasNextSlide(slide, swiper)) { if (event.data == YT.PlayerState.PLAYING) { var videoStart = (slide.videoStart ? slide.videoStart : 0), videoEnd = (slide.videoEnd ? slide.videoEnd : 0), duration = (videoEnd - videoStart) * 1000 setTimeout(function() { if (event.target && slide.active) { playVideoSlide(slide, swiper) } }, duration) } // handle videos that naturally end and change to next slide if (event.data === YT.PlayerState.ENDED) { if (typeof swiper != 'undefined') { swiper.slideNext(); if (! slider.disableAutoplay) { swiper.autoplay.start(); } return } } } } else { if (! hasNextSlide(slide, swiper)) { // loop video if no custom end timing has been set if (event.data === YT.PlayerState.ENDED) { // if slide.videoSlideAudio = true then do not loop the video and show the play button if (useSlideAudio) { showPlayButton($currentSlide) if(event.target.isMuted()) { event.target.unMute() } } else { var seekToTime = (typeof slide.videoStart != 'defined' && slide.videoStart) ? slide.videoStart : 0; event.target.seekTo(seekToTime) event.target.playVideo() } } } } } } }) // e/o: youtube iframe player if (isDuplicateSlide) { slide.playerDuplicate = player } else { slide.player = player } /** * If current video time matches videoEnd time or the video naturally ended return true * @return boolean return true if either current video time matches videoEnd time or the video naturally ended */ function maybeTransitionVideoSlide(interval) { var _player = (isDuplicateSlide) ? slide.playerDuplicate : slide.player, playerState = _player.getPlayerState(); // stop the autoplay until video reaches custom endpoint or end of video swiper.autoplay.stop() if ((slide.videoEnd && _player.getCurrentTime() >= parseInt(slide.videoEnd) - 0.5) || playerState == YT.PlayerState.ENDED) { if (typeof swiper != 'undefined') { clearInterval(slide.videoEndInterval) swiper.slideNext(); if (! slider.disableAutoplay) { swiper.autoplay.start(); } return true } } } /** * Stops the slideshow to play the full video or custom duration and transitions to next slide if video has ended or custom duration has been ran */ function slideAfterDuration(slide) { // handle videos with custom videoEnd values and go to next slide if (typeof slide.videoEnd != 'undefined') { slide.videoEndInterval = setInterval(function() { maybeTransitionVideoSlide(slide.videoEndInterval) }, 1000) } } } // e/o: playVideoSlide() /** * Retrieve a query variable from the URL * * @param string variable The GET variable to retrieve value for * @return string The value of the GET variable retrieved */ function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } /** * Go to a specific slide using the slide title or by `slide` GET parameter * * @param object slider The slider object * @return int The slide position / number */ function getDeepLinkedSlide(slider, slideTitle) { var foundSlide = false if (getQueryVariable('di_slide') && slider.slides && slider.slides.length > 1) { if (! slideTitle) { var slideTitle = getQueryVariable('di_slide') } if ($('[data-disliderguid="'+slider['guid']+'"]').find('[data-title="'+slideTitle+'"]').length) { var $slide = $('[data-disliderguid="'+slider['guid']+'"]').find('[data-title="'+slideTitle+'"]'), slideGuid = $slide.data('guid'); slider.slides.forEach(function(slide, i) { if (slide.guid == slideGuid) { foundSlide = i+1 } }) } } return foundSlide; } function removeDuplicateSlides(slider) { if ($('[data-disliderguid="'+slider.guid+'"]').length) { $('[data-disliderguid="'+slider.guid+'"] .swiper-slide-duplicate').each(function(i, el) { $(el).remove() }) } } /** * Depending on current window width and the visibility of the slides * we only use the slides needed and remove the ones not needed to * keep swiper indexes in check * * @param object slider the slider object * @param object swiper the swiper object * @return null */ function maybeCleanUpSlides(slider, swiper) { var removedSlideIndexes = [] slider.slides.forEach(function(slide, i) { if (slide.slideVisibility != 'both') { if (window.innerWidth >= 768 && isMobileSlide(slide)) { removedSlideIndexes.push(i) } if (window.innerWidth < 768 && isDesktopSlide(slide)) { removedSlideIndexes.push(i) } } }) if (removedSlideIndexes.length) { swiper.removeSlide(removedSlideIndexes) } if (window.innerWidth >= 768) { slider.slides = slider.slides.filter(function (e) { return e.slideVisibility != 'mobile'; }); } if (window.innerWidth < 768) { slider.slides = slider.slides.filter(function (e) { return e.slideVisibility != 'desktop'; }); } // make sure after removal that we turn off seamless looping and we // remove all duplicated slides if the amount of slides is less than // or equal to one slide if (slider.slides.length |