Team:Sevilla/Notebook
From 2011.igem.org
(Difference between revisions)
Line 4: | Line 4: | ||
<html> | <html> | ||
+ | <script type="text/javascript"> | ||
+ | /* panorama360 - plugin for jQuery | ||
+ | * Copyright (c) 2011 Minimalistic Studio (http://minimalisticstudio.com/) | ||
+ | * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) | ||
+ | * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. | ||
+ | * Thanks to: http://www.openstudio.fr for the initial idea. | ||
+ | * | ||
+ | * Some changes were made by Evgeny Likov (http://likov.spb.ru): fixed drag and kinetic scroll (thanks man!) | ||
+ | */ | ||
+ | (function($) { | ||
+ | $.fn.panorama360 = function(options){ | ||
+ | this.each(function(){ | ||
+ | var settings = { | ||
+ | start_position: 0, | ||
+ | image_width: 0, | ||
+ | image_height: 0, | ||
+ | mouse_wheel_multiplier: 20, | ||
+ | bind_resize: true | ||
+ | }; | ||
+ | if(options) $.extend(settings, options); | ||
+ | var viewport = $(this); | ||
+ | var panoramaContainer = viewport.children('.panorama-container'); | ||
+ | var viewportImage = panoramaContainer.children('img:first'); | ||
+ | if(settings.image_width<=0 && settings.image_height<=0){ | ||
+ | settings.image_width = parseInt(viewportImage.data("width")); | ||
+ | settings.image_height = parseInt(viewportImage.data("height")); | ||
+ | if (!(settings.image_width) || !(settings.image_height)) return; | ||
+ | } | ||
+ | var image_ratio = settings.image_height/settings.image_width; | ||
+ | var elem_height = parseInt(viewport.height()); | ||
+ | var elem_width = parseInt(elem_height/image_ratio); | ||
+ | var image_map = viewportImage.attr('usemap'); | ||
+ | var image_areas; | ||
+ | var isDragged = false; | ||
+ | var mouseXprev = 0; | ||
+ | var scrollDelta = 0; | ||
+ | viewportImage.removeAttr("usemap").css("left",0).clone().css("left",elem_width+"px").insertAfter(viewportImage); | ||
+ | |||
+ | panoramaContainer.css({ | ||
+ | 'margin-left': '-'+settings.start_position+'px', | ||
+ | 'width': (elem_width*2)+'px', | ||
+ | 'height': (elem_height)+'px' | ||
+ | }); | ||
+ | |||
+ | setInterval( function() { | ||
+ | if (isDragged) return false; | ||
+ | scrollDelta = scrollDelta * 0.98; | ||
+ | if (Math.abs(scrollDelta)<=2) scrollDelta = 0; | ||
+ | scrollView(panoramaContainer, elem_width, scrollDelta); | ||
+ | }, 1); | ||
+ | viewport.mousedown(function(e){ | ||
+ | if (isDragged) return false; | ||
+ | $(this).addClass("grab"); | ||
+ | isDragged = true; | ||
+ | mouseXprev = e.clientX; | ||
+ | scrollOffset = 0; | ||
+ | return false; | ||
+ | }).mouseup(function(){ | ||
+ | $(this).removeClass("grab"); | ||
+ | isDragged = false; | ||
+ | scrollDelta = scrollDelta * 0.45; | ||
+ | return false; | ||
+ | }).mousemove(function(e){ | ||
+ | if (!isDragged) return false; | ||
+ | scrollDelta = parseInt((e.clientX - mouseXprev)); | ||
+ | mouseXprev = e.clientX; | ||
+ | scrollView(panoramaContainer, elem_width, scrollDelta); | ||
+ | return false; | ||
+ | }).bind("mousewheel",function(e,distance){ | ||
+ | var delta=Math.ceil(Math.sqrt(Math.abs(distance))); | ||
+ | delta=distance<0 ? -delta : delta; | ||
+ | scrollDelta = scrollDelta + delta * 5; | ||
+ | scrollView(panoramaContainer,elem_width,delta*settings.mouse_wheel_multiplier); | ||
+ | return false; | ||
+ | }).bind('contextmenu',stopEvent).bind('touchstart', function(e){ | ||
+ | if (isDragged) return false; | ||
+ | isDragged = true; | ||
+ | mouseXprev = e.originalEvent.touches[0].pageX; | ||
+ | scrollOffset = 0; | ||
+ | }).bind('touchmove', function(e){ | ||
+ | e.preventDefault(); | ||
+ | if (!isDragged) return false; | ||
+ | var touch_x = e.originalEvent.touches[0].pageX; | ||
+ | scrollDelta = parseInt((touch_x - mouseXprev)); | ||
+ | mouseXprev = touch_x; | ||
+ | scrollView(panoramaContainer, elem_width, scrollDelta); | ||
+ | }).bind('touchend', function(e){ | ||
+ | isDragged = false; | ||
+ | scrollDelta = scrollDelta * 0.45; | ||
+ | }); | ||
+ | |||
+ | if (image_map) { | ||
+ | $('map[name='+image_map+']').children('area').each(function(){ | ||
+ | switch ($(this).attr("shape").toLowerCase()){ | ||
+ | case 'rect': | ||
+ | var area_coord = $(this).attr("coords").split(","); | ||
+ | $area1 = $("<a class='area' href='"+$(this).attr("href")+"' title='"+$(this).attr("alt")+"'</a>"); | ||
+ | panoramaContainer.append($area1.data("stitch",1).data("coords",area_coord)); | ||
+ | panoramaContainer.append($area1.clone().data("stitch",2).data("coords",area_coord)); | ||
+ | break; | ||
+ | } | ||
+ | }); | ||
+ | $('map[name='+image_map+']').remove(); | ||
+ | image_areas = panoramaContainer.children(".area"); | ||
+ | image_areas.mouseup(stopEvent).mousemove(stopEvent).mousedown(stopEvent); | ||
+ | repositionHotspots(image_areas,settings.image_height,elem_height,elem_width); | ||
+ | } | ||
+ | |||
+ | if (settings.bind_resize){ | ||
+ | $(window).resize(function(){ | ||
+ | elem_height = parseInt(viewport.height()); | ||
+ | elem_width = parseInt(elem_height/image_ratio); | ||
+ | panoramaContainer.css({ | ||
+ | 'width': (elem_width*2)+'px', | ||
+ | 'height': (elem_height)+'px' | ||
+ | }); | ||
+ | viewportImage.css("left",0).next().css("left",elem_width+"px"); | ||
+ | if (image_map) repositionHotspots(image_areas,settings.image_height,elem_height,elem_width); | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | function stopEvent(e){ | ||
+ | e.preventDefault(); | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | function scrollView(panoramaContainer,elem_width,delta){ | ||
+ | var newMarginLeft = parseInt(panoramaContainer.css('marginLeft'))+delta; | ||
+ | if (newMarginLeft > 0) newMarginLeft = -elem_width; | ||
+ | if (newMarginLeft < -elem_width) newMarginLeft = 0; | ||
+ | panoramaContainer.css('marginLeft', newMarginLeft+'px'); | ||
+ | } | ||
+ | |||
+ | function repositionHotspots(areas,image_height,elem_height,elem_width){ | ||
+ | var percent = elem_height/image_height; | ||
+ | areas.each(function(){ | ||
+ | area_coord = $(this).data("coords"); | ||
+ | stitch = $(this).data("stitch"); | ||
+ | switch (stitch){ | ||
+ | case 1: | ||
+ | $(this).css({ | ||
+ | 'left': (area_coord[0]*percent)+"px", | ||
+ | 'top': (area_coord[1]*percent)+"px", | ||
+ | 'width': ((area_coord[2]-area_coord[0])*percent)+"px", | ||
+ | 'height': ((area_coord[3]-area_coord[1])*percent)+"px", | ||
+ | }); | ||
+ | break; | ||
+ | case 2: | ||
+ | $(this).css({ | ||
+ | 'left': (elem_width+parseInt(area_coord[0])*percent)+"px", | ||
+ | 'top': (area_coord[1]*percent)+"px", | ||
+ | 'width': ((area_coord[2]-area_coord[0])*percent)+"px", | ||
+ | 'height': ((area_coord[3]-area_coord[1])*percent)+"px", | ||
+ | }); | ||
+ | break; | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | })(jQuery); | ||
+ | </script> | ||
<img src="https://lh5.googleusercontent.com/-CIHTtaRbdgM/TiAa0Y3zubI/AAAAAAAAAO4/1dhIyuanIzc/s640/IMG_4497.JPG" height="192" width="288" /> | <img src="https://lh5.googleusercontent.com/-CIHTtaRbdgM/TiAa0Y3zubI/AAAAAAAAAO4/1dhIyuanIzc/s640/IMG_4497.JPG" height="192" width="288" /> |
Revision as of 12:35, 22 July 2011