]> CRI, Mines Paris - PSL - Portfolio.git/blobdiff - Products/Portfolio/skins/navigateur.js
eggification
[Portfolio.git] / Products / Portfolio / skins / navigateur.js
diff --git a/Products/Portfolio/skins/navigateur.js b/Products/Portfolio/skins/navigateur.js
new file mode 100644 (file)
index 0000000..f21d45f
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+* © 2007 Benoît Pin – Centre de recherche en informatique – École des mines de Paris
+* http://plinn.org
+* Licence Creative Commons http://creativecommons.org/licenses/by-nc/2.0/
+* 
+* 
+*/
+
+function Navigateur(mosaique) {
+       this.mosaique = mosaique;
+       var m = this.mosaique; // shortcut alias
+       
+       this.drawPanel();
+               
+       var thisNav = this;
+       
+       this._ddHandlers = {'down' : function(evt){thisNav._mouseDownHandler(evt);},
+                                               'move' : function(evt){thisNav._mouseMoveHandler(evt);},
+                                               'up' :   function(evt){thisNav._mouseUpHandler(evt);}};
+
+
+       if (m.zoomIndex == m.zoomTable.length - 1)
+               this.zoomInButton.src = this.zoomInButton.src.replace('zoom_in.gif', 'zoom_disabled.gif');
+       if (m.zoomIndex == 0)
+               this.zoomOutButton.src = this.zoomOutButton.src.replace('zoom_out.gif', 'zoom_disabled.gif');
+       
+       this.currentZoomLevel.nodeValue = m.zoomLevel + ' %';
+       
+       this._listeners = new Array();
+       this._listeners.push([this.zoomOutButton, 'click', function(evt){thisNav.zoomOut(evt);}]);
+       this._listeners.push([this.zoomInButton, 'click', function(evt){thisNav.zoomIn(evt);}]);
+       this._listeners.push([document, 'keypress', function(evt){thisNav.zoomByKeybord(evt);}]);
+       
+       var _l;
+       for (var i = 0 ; i<this._listeners.length ; i++) {
+               _l = this._listeners[i];
+               addListener(_l[0], _l[1], _l[2]);
+       }
+}
+
+Navigateur.prototype.unload = function() {
+       var _l;
+       for (var i = 0 ; i<this._listeners.length ; i++) {
+               _l = this._listeners[i];
+               removeListener(_l[0], _l[1], _l[2]);
+       }
+};
+
+Navigateur.prototype.drawPanel = function() {
+       var m = this.mosaique;
+       // panel
+       var panel = document.createElement('div');
+       with(panel.style) {
+               position = 'absolute';
+               width = this.mosaique.thumbnailWidth + 2 + 'px';
+               height = this.mosaique.thumbnailHeight + 38 + 'px';
+               top = '27px';
+               right = '0px';
+               border = '1px solid #4c4c4c';
+               textAlign = 'center';
+               overflow = 'hidden';
+       }
+       
+       // thumbnail
+       var thumbnail = document.createElement('img');
+       thumbnail.src = m.imgUrlBase + '/getThumbnail';
+       thumbnail.width = String(m.thumbnailWidth);
+       thumbnail.height = String(m.thumbnailHeight);
+       panel.appendChild(thumbnail);
+       
+       // red frame
+       var frame = this.frame = document.createElement('div');
+       with(frame.style) {
+           position = 'absolute';
+           left = '0';
+           top = '0';
+           border = '1px solid red';
+           zIndex = '2';
+               cursor = 'move';
+       }
+       panel.appendChild(frame);
+       this.resizeFrame();
+       
+       // for IE >:-(
+       var fill = document.createElement('img');
+       fill.src = portal_url() + '/transparent.gif';
+       with(fill.style) {
+               height = '100%';
+               width = '100%';
+       }
+       frame.appendChild(fill);
+       
+       // table with -/+ buttons and current zoom level
+       var table = document.createElement('table');
+       with (table.style) {
+               width = '100%';
+               background = '#808080';
+               verticalAlign = 'middle';
+       }
+       panel.appendChild(table);
+
+       var tbody = document.createElement('tbody');
+       table.appendChild(tbody);
+       
+       var tr = document.createElement('tr');
+       tbody.appendChild(tr);
+       
+       var td = document.createElement('td');
+       tr.appendChild(td);
+       
+       var img = this.zoomOutButton = document.createElement('img');
+       img.width = '32';
+       img.height = '32';
+       img.src = portal_url() + '/zoom_out.gif';
+       td.appendChild(img);
+
+       var td = document.createElement('td');
+       tr.appendChild(td);
+
+       var text = this.currentZoomLevel = document.createTextNode('10%');
+       td.appendChild(text);
+       
+       var td = document.createElement('td');
+       tr.appendChild(td);
+       
+       var img = this.zoomInButton =  document.createElement('img');
+       img.width = '32';
+       img.height = '32';
+       img.src = portal_url() + '/zoom_in.gif';
+       td.appendChild(img);
+               
+       this.display = panel;
+       this.mosaique.rootElement.appendChild(panel);
+};
+
+Navigateur.prototype.resizeFrame = function() {
+    var m = this.mosaique;
+    var width, height;
+    
+    if (m.screenWidth >= m.imageWidth) {
+        width = m.thumbnailWidth + 'px';
+    }
+    else {
+        var wRatio = m.screenWidth / m.imageWidth;
+        width = Math.round(wRatio * m.thumbnailWidth) + 'px';
+    }
+
+    if (m.screenHeight >= m.imageHeight) {
+        height = m.thumbnailHeight + 'px';
+    }
+    else {
+        var hRatio = m.screenHeight / m.imageHeight;
+        height = Math.round(hRatio * m.thumbnailHeight) + 'px';
+    }
+    
+    var frmStyle = this.frame.style;
+    frmStyle.width = width;
+    frmStyle.height = height;
+    this.alignFrame();
+};
+
+Navigateur.prototype.alignFrame = function() {
+       var m = this.mosaique;
+    var iPosition = m.getImagePosition();
+    iPosition.x = Math.max(0, iPosition.x);
+    iPosition.y = Math.max(0, iPosition.y);
+    
+    var frmPosition = new Point(iPosition.x * (m.thumbnailWidth / m.imageWidth),
+                                iPosition.y * (m.thumbnailHeight / m.imageHeight)
+                                );
+       this.setFramePosition(frmPosition);
+}
+
+Navigateur.prototype.alignImage = function() {
+       var m = this.mosaique;
+       var frmPosition = this.getFramePosition();
+    var iPosition = new Point(frmPosition.x * (m.imageWidth / m.thumbnailWidth),
+                              frmPosition.y * (m.imageHeight / m.thumbnailHeight)
+                                );
+       this.mosaique.loadScreen(iPosition);
+};
+
+Navigateur.prototype.getFramePosition = function() {
+       var x = parseInt(this.frame.style.left);
+       var y = parseInt(this.frame.style.top);
+       var p = new Point(x, y);
+       return p;
+};
+
+Navigateur.prototype.setFramePosition = function(point) {
+       with(this.frame.style) {
+               left = point.x + 'px';
+               top = point.y + 'px';
+       }
+};
+
+/* event handlers */
+Navigateur.prototype._mouseDownHandler = function(evt) {
+       this.initialClickPoint = new Point(evt.clientX, evt.clientY);
+       this.initialPosition = this.getFramePosition();
+       this.dragInProgress = true;
+}
+
+Navigateur.prototype._mouseMoveHandler = function(evt) {
+       disableDefault(evt);
+       if(!this.dragInProgress)
+               return;
+       
+       evt = getEventObject(evt);
+       var currentPoint = new Point(evt.clientX, evt.clientY);
+       var displacement = currentPoint.diff(this.initialClickPoint);
+       this.setFramePosition(this.initialPosition.add(displacement));
+};
+
+Navigateur.prototype._mouseUpHandler = function(evt) {
+       this.dragInProgress = false;
+       this.alignImage();
+};
+
+Navigateur.prototype.zoomIn = function(evt) {
+       var m = this.mosaique;
+       var maxZoomIndex = m.zoomTable.length - 1
+       if (m.zoomIndex < maxZoomIndex) {
+               var targetZoomIndex = m.zoomIndex + 1;
+               m.loadZoomLevel(targetZoomIndex);
+               this.currentZoomLevel.nodeValue = m.zoomLevel + ' %';
+               this.resizeFrame();
+
+               if (targetZoomIndex == maxZoomIndex)
+                       this.zoomInButton.src = this.zoomInButton.src.replace('zoom_in.gif', 'zoom_disabled.gif');
+               if (targetZoomIndex > 0)
+                       this.zoomOutButton.src = this.zoomOutButton.src.replace('zoom_disabled.gif', 'zoom_out.gif');
+       }
+};
+
+Navigateur.prototype.zoomOut = function(evt) {
+       var m = this.mosaique;
+       if (m.zoomIndex > 0 ) {
+               var targetZoomIndex = m.zoomIndex - 1;
+               m.loadZoomLevel(targetZoomIndex);
+               this.currentZoomLevel.nodeValue = m.zoomLevel + ' %';
+               this.resizeFrame();
+
+               if (targetZoomIndex == 0)
+                       this.zoomOutButton.src = this.zoomOutButton.src.replace('zoom_out.gif', 'zoom_disabled.gif');
+               if (targetZoomIndex < m.zoomTable.length - 1)
+                       this.zoomInButton.src = this.zoomInButton.src.replace('zoom_disabled.gif', 'zoom_in.gif');
+       }
+};
+
+Navigateur.prototype.zoomByKeybord = function(evt){
+       evt = getEventObject(evt);
+       var charPress = String.fromCharCode((evt.keyCode) ? evt.keyCode : evt.which);
+       switch (charPress) {
+               case '+' :
+                       this.zoomIn();
+                       break;
+               case '-' : 
+                       this.zoomOut();
+                       break;
+       }
+};