+++ /dev/null
-/*
-* © 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;
- }
-};