X-Git-Url: https://scm.cri.minesparis.psl.eu/git/Portfolio.git/blobdiff_plain/cd282ee58b2893790d06ce40a8b02c65481abbeb..1ea27804743fca19dca58a1f8e662ccf7787f652:/skins/photo_film_viewer.js diff --git a/skins/photo_film_viewer.js b/skins/photo_film_viewer.js index 3140763..c6f583b 100644 --- a/skins/photo_film_viewer.js +++ b/skins/photo_film_viewer.js @@ -5,8 +5,6 @@ Licence Creative Commons http://creativecommons.org/licenses/by-nc/2.0/ */ var FilmSlider; -var s; - (function(){ var keyLeft = 37, keyRight = 39; @@ -17,7 +15,6 @@ var DEFAULT_IMAGE_SIZES = [500, 600, 800]; FilmSlider = function(filmBar, slider, ctxInfos, image, toolbar, breadcrumbs) { var thisSlider = this; - s = this; this.filmBar = filmBar; this.filmBarWidth = getObjectWidth(this.filmBar); var film = filmBar.firstChild; @@ -148,10 +145,11 @@ FilmSlider.prototype._checkSize = function(evt) { FilmSlider.prototype._checkSizeStability = function(evt) { var self = this; var i; + var checkAgain = function(evt){self._checkSizeStability();}; for (i=0 ; i<this._barSizes.length - 1 ; i++) { if (this._barSizes[i] !== this._barSizes[i+1]) { this._barSizes = []; - setTimeout(function(evt){self._checkSizeStability();}, 250); + setTimeout(checkAgain, 250); return; } } @@ -168,11 +166,12 @@ FilmSlider.prototype.fitToScreen = function(evt) { FilmSlider.prototype._fitToScreen = function(evt) { var wh = getWindowHeight(); + var rb; if (!browser.isMobile) { - var rb = getObjectTop(this.rail) + getObjectHeight(this.rail); // rail bottom + rb = getObjectTop(this.rail) + getObjectHeight(this.rail); // rail bottom } else { - var rb = getObjectTop(this.filmBar) + getObjectHeight(this.filmBar); // film bottom + rb = getObjectTop(this.filmBar) + getObjectHeight(this.filmBar); // film bottom } var delta = wh - rb; var sh = getObjectHeight(this.stretchable); @@ -186,6 +185,7 @@ FilmSlider.prototype._fitToScreen = function(evt) { var src = this.image.src.replace(imgRequestedSize, 'size=' + bestFitSize); this.pendingImage.src = src; } + this.adjustImage(this.image); }; FilmSlider.prototype.getBestFitSize = function(ratio) { @@ -210,6 +210,27 @@ FilmSlider.prototype.getBestFitSize = function(ratio) { return DEFAULT_IMAGE_SIZES[i]; }; +FilmSlider.prototype.adjustImage = function(img) { + var dispWidth = parseInt(this.stretchable.style.width); + var imgWidth = img.naturalWidth; + var dispHeight = parseInt(this.stretchable.style.height); + var imgHeight = img.naturalHeight; + var ratio; + + if (imgHeight > dispHeight) { + ratio = dispHeight / imgHeight; + imgWidth = imgWidth * ratio; + imgHeight = dispHeight; + } + if (imgWidth > dispWidth) { + ratio = dispWidth / imgWidth; + imgHeight = imgHeight * ratio; + imgWidth = dispWidth; + } + img.width = imgWidth; + img.height = imgHeight; +}; + if (!browser.isMobile) { FilmSlider.prototype.centerSlide = function(slideIndex) { if (this.sliderRatio > 1) { return; } @@ -357,6 +378,18 @@ FilmSlider.prototype.mouseOutHandler = function(evt) { } }; +FilmSlider.prototype.translateImgUrl = function(url) { + var canonicalImgUrl; + if (this.ctxUrlTranslation[0]) { + canonicalImgUrl = url.replace(this.ctxUrlTranslation[0], + this.ctxUrlTranslation[1]); + } + else { + canonicalImgUrl = url; + } + return canonicalImgUrl; +}; + FilmSlider.prototype.thumbnailClickHandler = function(evt) { var target = getTargetedObject(evt); while (target.tagName !== 'A' && target !== this.filmBar) { target = target.parentNode; } @@ -373,12 +406,7 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) { history.pushState(target.href, '', target.href); var imgBaseUrl = target.href; - var canonicalImgUrl; - if (this.ctxUrlTranslation[0]) { - canonicalImgUrl = imgBaseUrl.replace(this.ctxUrlTranslation[0], - this.ctxUrlTranslation[1]); - } - else { canonicalImgUrl = imgBaseUrl; } + var canonicalImgUrl = this.translateImgUrl(imgBaseUrl); var ajaxUrl = imgBaseUrl + '/photo_view_ajax'; var thisFS = this; @@ -625,36 +653,36 @@ FilmSlider.prototype.touchMoveHandler = function(evt) { var delta = this.touchStartX - evt.changedTouches[0].screenX; var posX = this.filmStartX - delta; this.setFilmPosition(posX); - this.lastMoveTime = (new Date()).getTime(); + this.lastMoveTime = (new Date()).getTime(); }; FilmSlider.prototype.touchEndHandler = function(evt) { - var x = evt.changedTouches[0].screenX; + var x = evt.changedTouches[0].screenX; var delta = x - this.touchStartX; if (delta) { disableDefault(evt); - var now = (new Date()).getTime(); - if (now - this.lastMoveTime < 100) { - // au delà de 100 ms de maintient, on annule l'inertie - var speed = delta / (now - this.touchStartTime) - var x0 = parseInt(this.film.style.left, 10); - var t0 = (new Date()).getTime(); - var d = 500; // milisecondes - var delta = 0; - var dt = 25 - var self = this; + var now = (new Date()).getTime(); + if (now - this.lastMoveTime < 100) { + // au delà de 100 ms de maintient, on annule l'inertie + var speed = delta / (now - this.touchStartTime); + var x0 = parseInt(this.film.style.left, 10); + var t0 = (new Date()).getTime(); + var d = 500; // milisecondes + delta = 0; + var dt = 25; + var self = this; - function animate() { - // inertie - var t = (new Date()).getTime() - t0; - if (t < d) { - setTimeout(animate, dt); - delta = delta + (1-t/d) * speed * dt; // décelleration linéaire - self.setFilmPosition(x0 + delta); - } - } - animate(); - } + var animate = function() { + // inertie + var t = (new Date()).getTime() - t0; + if (t < d) { + setTimeout(animate, dt); + delta = delta + (1-t/d) * speed * dt; // décelleration linéaire + self.setFilmPosition(x0 + delta); + } + }; + animate(); + } } this.touchStartX = undefined; }; @@ -714,6 +742,7 @@ FilmSlider.prototype.populateViewer = function(req) { }; FilmSlider.prototype.refreshImage = function() { + this.adjustImage(this.pendingImage); this.image.style.visibility = 'hidden'; this.image.src = this.pendingImage.src; this.image.width = this.pendingImage.width; @@ -732,6 +761,7 @@ FilmSlider.prototype.updateBreadcrumbs = function(url, title) { FilmSlider.prototype.startThumbnailsLoadQueue = function(evt) { var thumbnails = this.film.getElementsByTagName('img'); + if (thumbnails.length === 1) { return; } this.thumbnailsLoadingOrder = []; var leftSize = this.center; var rightSize = thumbnails.length - this.center - 1; @@ -742,19 +772,18 @@ FilmSlider.prototype.startThumbnailsLoadQueue = function(evt) { } if (leftSize > rightSize) { for (i = this.center - rightSize - 1 ; i >= 0 ; i--) { - console.log(i); this.thumbnailsLoadingOrder.push(thumbnails[i]); } } else if (leftSize < rightSize) { - for (i = this.center + leftSize ; i < thumbnails.length ; i++) { + for (i = this.center + leftSize + 1 ; i < thumbnails.length ; i++) { this.thumbnailsLoadingOrder.push(thumbnails[i]); } } var next = this.thumbnailsLoadingOrder.shift(); var self = this; addListener(next, 'load', function(evt){self._loadNextThumb(evt);}); - next.src = next.parentNode.href + '/getThumbnail'; + next.src = this.translateImgUrl(next.parentNode.href) + '/getThumbnail'; }; FilmSlider.prototype._loadNextThumb = function(evt) { @@ -762,7 +791,7 @@ FilmSlider.prototype._loadNextThumb = function(evt) { if (!next) {return;} var self = this; addListener(next, 'load', function(evt){self._loadNextThumb(evt);}); - next.src = next.parentNode.href + '/getThumbnail'; + next.src = this.translateImgUrl(next.parentNode.href) + '/getThumbnail'; };