jslint
[Portfolio.git] / skins / photo_film_viewer.js
index 70fef4e..cfd7df5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-* © 2008 Benoît Pin – Centre de recherche en informatique – École des mines de Paris
+* © 2008-2014 Benoît Pin – Centre de recherche en informatique – MINES ParisTech
 * http://plinn.org
 * Licence Creative Commons http://creativecommons.org/licenses/by-nc/2.0/
 * 
@@ -20,7 +20,7 @@ FilmSlider = function(filmBar, slider, ctxInfos, image, toolbar, breadcrumbs) {
        var thisSlider = this;
        this.filmBar = filmBar;
        var film = filmBar.firstChild;
-       if (film.nodeType == 3)
+       if (film.nodeType === 3)
                film = film.nextSibling;
        this.film = film;
        this.slider = slider;
@@ -36,10 +36,16 @@ FilmSlider = function(filmBar, slider, ctxInfos, image, toolbar, breadcrumbs) {
        
        this.buttons = new Array();
        this.toolbar = toolbar;
-       var bcElements = breadcrumbs.getElementsByTagName('a');
-       this.lastBCElement = bcElements[bcElements.length-1];
-       var imgSrcParts = image.src.split('/');
-       this.lastBCElement.innerHTML = imgSrcParts[imgSrcParts.length-2];
+       if (breadcrumbs) {
+               var bcElements = breadcrumbs.getElementsByTagName('a');
+               this.lastBCElement = bcElements[bcElements.length-1];
+               var imgSrcParts = image.src.split('/');
+               this.lastBCElement.innerHTML = imgSrcParts[imgSrcParts.length-2];
+               this.hasBreadcrumbs = true;
+       }
+       else {
+               this.hasBreadcrumbs = false;
+       }
        
        var buttons = toolbar.getElementsByTagName('img');
        var b, name;
@@ -92,18 +98,18 @@ FilmSlider.prototype.resizeSlider = function(evt) {
        var filmWidth = this.slideSize * this.filmLength;
        var sliderRatio = this.sliderRatio =  filmBarWidth / filmWidth;
        var sliderWidth = filmBarWidth * sliderRatio;
+       this.rail.style.width = filmBarWidth + 'px';
+       this.rail.style.display = 'block';
+       this.rail.style.visibility = 'visible';
        if (sliderRatio < 1) {
-               this.rail.style.width = filmBarWidth + 'px';
                this.slider.style.width = Math.round(sliderWidth) + 'px';
-               this.rail.style.display = 'block';
-               this.rail.style.visibility = 'visible';
+               this.slider.style.visibility = 'visible';
        }
        else {
-               this.rail.style.display = 'none';
-               this.rail.style.visibility = 'hidden';
+               this.slider.style.visibility = 'hidden';
        }
        
-       this.winSize = {'width'  : getWindowWidth(),
+       this.winSize = {'width'  : getWindowWidth(),
                                        'height' : getWindowHeight()};
        this.maxRightPosition = filmBarWidth - sliderWidth
        this.sliderSpeedRatio = - (filmBarWidth - sliderWidth) / (filmWidth - filmBarWidth);
@@ -122,9 +128,10 @@ FilmSlider.prototype.fitToScreen = function(evt) {
 
 FilmSlider.prototype._fitToScreen = function(evt) {
        var wh = getWindowHeight();
-       var ch = document.body.clientHeight;
+       var rb = getObjectTop(this.rail) + getObjectHeight(this.rail); // rail bottom
+       var delta = wh - rb
        var sh = getObjectHeight(this.stretchable);
-       var newSize = sh + wh - ch;
+       var newSize = sh + delta;
        this.stretchable.style.height = newSize + 'px';
        
        var ratio = this.image.height / this.image.width;
@@ -202,12 +209,12 @@ FilmSlider.prototype.loadSibling = function(previous) {
        var slide = null;
        if (previous) {
                slide = this.selectedSlide.parentNode.previousSibling;
-               if (slide && slide.nodeType==3)
+               if (slide && slide.nodeType===3)
                        slide = slide.previousSibling;
        }
        else {
                slide = this.selectedSlide.parentNode.nextSibling;
-               if (slide && slide.nodeType==3)
+               if (slide && slide.nodeType===3)
                        slide = slide.nextSibling;
        }
        
@@ -296,7 +303,7 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) {
        if (target.tagName != 'A')
                return;
        else {
-               if (this.viewMode == 'full') {
+               if (this.viewMode === 'full') {
                        this.mosaique.unload();
                        this.mosaique = null;
                        this.viewMode = 'medium';
@@ -304,12 +311,13 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) {
                disableDefault(evt);
                disablePropagation(evt);
                target.blur();
+        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]);
+                                                                                                this.ctxUrlTranslation[1]);
                else
                        canonicalImgUrl = imgBaseUrl;
                
@@ -327,7 +335,7 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) {
 
                var toggleSelectionBtn = this.buttons['toggle_selection'];
                var toggleSelectionLink = toggleSelectionBtn.parentNode;
-               this.selectedSlideInSelection = (target.className=='selected');
+               this.selectedSlideInSelection = (target.className==='selected');
                if (this.selectedSlideInSelection) {
                        toggleSelectionBtn.src = portal_url() + '/unselect_flag_btn.gif';
                        toggleSelectionBtn.alt = toggleSelectionLink.title = 'Retirer de la sélection';
@@ -371,7 +379,7 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) {
                                        break;
                                case 4 :
                                        hideProgressImage();
-                                       if (req.status == '200')
+                                       if (req.status === '200')
                                                thisFS.populateViewer(req);
                                        else
                                                //window.location.href = target.href;
@@ -391,7 +399,7 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) {
 
                for (i in classes) {
                        name = classes[i];
-                       if (name == 'displayed')
+                       if (name === 'displayed')
                                continue;
                        else
                                newClasses.push(name);
@@ -410,7 +418,7 @@ FilmSlider.prototype.thumbnailClickHandler = function(evt) {
 
 FilmSlider.prototype.toolbarClickHandler = function(evt) {
        var target = getTargetedObject(evt);
-       if(target.tagName == 'IMG' && target.getAttribute('name')){
+       if(target.tagName === 'IMG' && target.getAttribute('name')){
                switch(target.getAttribute('name')) {
                        case 'previous' :
                                disableDefault(evt);
@@ -432,7 +440,7 @@ FilmSlider.prototype.toolbarClickHandler = function(evt) {
                                disableDefault(evt);
                                disablePropagation(evt);
                                target.parentNode.blur();
-                               if (this.viewMode == 'full') {
+                               if (this.viewMode === 'full') {
                                        this.mosaique.unload();
                                        this.mosaique = null;
                                        this.viewMode = 'medium';
@@ -508,7 +516,7 @@ FilmSlider.prototype.toolbarClickHandler = function(evt) {
                                disableDefault(evt);
                                disablePropagation(evt);
                                target.blur();
-                               if (this.viewMode == 'full') {
+                               if (this.viewMode === 'full') {
                                        this.mosaique.unload();
                                        this.mosaique = null;
                                        this.viewMode = 'medium';
@@ -568,10 +576,9 @@ FilmSlider.prototype.keyDownHandler = function(evt) {
 
 FilmSlider.prototype.keyPressHandler = function(evt) {
        var target = getTargetedObject(evt);
-       if (target.tagName == 'INPUT' || target.tagName== 'TEXTAREA')
+       if (target.tagName === 'INPUT' || target.tagName=== 'TEXTAREA')
                return;
-       var evt = evt = getEventObject(evt);
-       evt = getEventObject(evt);
+       var evt = getEventObject(evt);
        var charPress = String.fromCharCode((evt.keyCode) ? evt.keyCode : evt.which);
        switch(charPress) {
                case 'f':
@@ -588,20 +595,20 @@ FilmSlider.prototype.populateViewer = function(req) {
                switch (element.nodeName) {
                        case 'fragment' :
                                var dest = document.getElementById(element.getAttribute('id'));
-                               dest.innerHTML = element.firstChild.nodeValue;
+                               if (dest) { dest.innerHTML = element.firstChild.nodeValue; }
                                break;
                        case 'imageattributes' :
                                var link = this.buttons['back_to_portfolio'].parentNode;
                                link.href = element.getAttribute('backToContextUrl');
                                link = this.buttons['show_buyable'].parentNode;
                                var buyable = element.getAttribute('buyable');
-                               if(buyable == 'True')
+                               if(buyable === 'True')
                                        link.className = null;
-                               else if(buyable == 'False')
+                               else if(buyable === 'False')
                                        link.className = 'hidden';
                                this.image.alt = element.getAttribute('alt');
-                               this.lastBCElement.href = element.getAttribute('lastBcUrl');
-                               this.lastBCElement.innerHTML = element.getAttribute('img_id');
+                               this.updateBreadcrumbs(element.getAttribute('lastBcUrl'),
+                                                                          element.getAttribute('img_id'));
                                break;
                }
        }
@@ -619,33 +626,62 @@ FilmSlider.prototype.refreshImage = function() {
                this.image.parentNode.className = '';
 };
 
+FilmSlider.prototype.updateBreadcrumbs = function(url, title) {
+       if (this.hasBreadcrumbs) {
+               this.lastBCElement.href = element.getAttribute('lastBcUrl');
+               this.lastBCElement.innerHTML = element.getAttribute('img_id');
+       }
+};
+
 FilmSlider.prototype.startSlideShow = function() {
-       this.slideShowSlide = this.selectedSlide;
-       this.nextSlideShowSlide = this.selectedSlide;
+       this.slideShowSlide = this.pendingSlideShowSlide = this.selectedSlide;
        return this.slideShowSlide.href;
 };
 
 FilmSlider.prototype.slideShowNext = function() {
-       this.slideShowSlide = this.nextSlideShowSlide;
        var nextSlide = this.slideShowSlide.parentNode.nextSibling;
-       if (nextSlide && nextSlide.nodeType==3)
+       if (nextSlide && nextSlide.nodeType===3)
                nextSlide = nextSlide.nextSibling;      
 
        if (nextSlide) {
                nextSlide = nextSlide.getElementsByTagName('a')[0];
-               this.nextSlideShowSlide = nextSlide;
-               return nextSlide.href;
+               this.pendingSlideShowSlide = nextSlide;
+               return this.pendingSlideShowSlide.href;
        }
        else {
                var row = this.slideShowSlide.parentNode.parentNode;
                var first = row.firstChild;
-               if (first.nodeType==3)
+               if (first.nodeType===3)
                        first = first.nextSibling;
-               this.nextSlideShowSlide = first.getElementsByTagName('a')[0];
-               return this.nextSlideShowSlide.href;
+               this.pendingSlideShowSlide = first.getElementsByTagName('a')[0];
+               return this.pendingSlideShowSlide.href;
        }
 };
 
+FilmSlider.prototype.slideShowPrevious = function() {
+       var previousSlide = this.slideShowSlide.parentNode.previousSibling;
+       if (previousSlide && previousSlide.nodeType===3)
+               previousSlide = previousSlide.previousSibling;
+
+       if (previousSlide) {
+               previousSlide = previousSlide.getElementsByTagName('a')[0];
+               this.pendingSlideShowSlide = previousSlide;
+               return this.pendingSlideShowSlide.href;
+       }
+       else {
+               var row = this.slideShowSlide.parentNode.parentNode;
+               var last = row.lastChild;
+               if (last.nodeType===3)
+                       last = last.previousSibling;
+               this.pendingSlideShowSlide = last.getElementsByTagName('a')[0];
+               return this.pendingSlideShowSlide.href;
+       }
+};
+
+FilmSlider.prototype.slideShowImageLoaded = function() {
+       this.slideShowSlide = this.pendingSlideShowSlide;
+};
+
 FilmSlider.prototype.stopSlideShow = function() {
        raiseMouseEvent(this.slideShowSlide, 'click');
        var index = parseInt(this.selectedSlide.getAttribute('portfolio:position'));