(function($) { $.fn.panorama = function(options) { this.each(function(){ var settings = { viewport_width: 600, speed: 30000, direction: 'left', control_display: 'auto', start_position: 0, auto_start: true, mode_360: true }; if(options) $.extend(settings, options); var elemWidth = parseInt($(this).attr('width')); var elemHeight = parseInt($(this).attr('height')); var currentElement = this; var panoramaViewport, panoramaContainer; var bMouseMove = false; var mouseMoveStart = 0; var mouseMoveMarginStart = 0; $(this).attr('unselectable','on') .css('position', 'relative') .css('-moz-user-select','none') .css('-webkit-user-select','none') .css('margin', '0') .css('padding', '0') .css('border', 'none') .wrap("
"); if (settings.mode_360) $(this).clone().insertAfter(this); panoramaContainer = $(this).parent(); panoramaContainer.css('height', elemHeight+'px').css('overflow', 'hidden').wrap("
").parent().css('width',settings.viewport_width+'px') .append("
<< x >>
"); panoramaViewport = panoramaContainer.parent(); panoramaViewport.mousedown(function(e){ if (!bMouseMove) { bMouseMove = true; mouseMoveStart = e.clientX; } return false; }).mouseup(function(){ bMouseMove = false; mouseMoveStart = 0; return false; }).mousemove(function(e){ if (bMouseMove){ var delta = parseInt((mouseMoveStart - e.clientX)/30); if ((delta>10) || (delta<10)) { var newMarginLeft = parseInt(panoramaContainer.css('marginLeft')) + (delta); if (settings.mode_360) { if (newMarginLeft > 0) {newMarginLeft = -elemWidth;} if (newMarginLeft < -elemWidth) {newMarginLeft = 0;} } else { if (newMarginLeft > 0) {newMarginLeft = 0;} if (newMarginLeft < -elemWidth) {newMarginLeft = -elemWidth;} } panoramaContainer.css('marginLeft', newMarginLeft+'px'); } } }).bind('contextmenu',function(){return false;}); panoramaViewport.css('height', elemHeight+'px').css('overflow', 'hidden').find('a.panorama-control-left').bind('click', function() { $(panoramaContainer).stop(); settings.direction = 'right'; panorama_animate(panoramaContainer, elemWidth, settings); return false; }); panoramaViewport.bind('click', function() { $(panoramaContainer).stop(); }); panoramaViewport.find('a.panorama-control-right').bind('click', function() { $(panoramaContainer).stop(); settings.direction = 'left'; panorama_animate(panoramaContainer, elemWidth, settings); return false; }); panoramaViewport.find('a.panorama-control-pause').bind('click', function() { $(panoramaContainer).stop(); return false; }); if (settings.control_display == 'yes') { panoramaViewport.find('.panorama-control').show(); } else if (settings.control_display == 'auto') { panoramaViewport.bind('mouseover', function(){ $(this).find('.panorama-control').show(); return false; }).bind('mouseout', function(){ $(this).find('.panorama-control').hide(); return false; }); } $(this).parent().css('margin-left', '-'+settings.start_position+'px'); if (settings.auto_start) panorama_animate(panoramaContainer, elemWidth, settings); }); function panorama_animate(element, elemWidth, settings) { currentPosition = 0-parseInt($(element).css('margin-left')); if (settings.direction == 'right') { $(element).animate({marginLeft: 0}, ((settings.speed / elemWidth) * (currentPosition)) , 'linear', function (){ if (settings.mode_360) { $(element).css('marginLeft', '-'+(parseInt(parseInt(elemWidth))+'px')); panorama_animate(element, elemWidth, settings); } }); } else { var rightlimit; if (settings.mode_360) rightlimit = elemWidth; else rightlimit = elemWidth-settings.viewport_width; $(element).animate({marginLeft: -rightlimit}, ((settings.speed / rightlimit) * (rightlimit - currentPosition)), 'linear', function (){ if (settings.mode_360) { $(element).css('margin-left', 0); panorama_animate(element, elemWidth, settings); } }); } } }; $(document).ready(function(){ $("img.panorama").panorama(); }); })(jQuery);