/* =========================================================
// jquery.panorama.js
// Author: OpenStudio (Arnault PACHOT)
// Mail: apachot@openstudio.fr
// Web: http://www.openstudio.fr
// Copyright (c) 2008 Arnault Pachot
// licence : GPL
========================================================= */

(function($) {
	$.fn.panorama = function(options) {
		this.each(function(){ 
			var settings = {
				viewport_width: 720,
				speed: 40000,
				direction: 'left',
				control_display: 'auto',
				start_position: 0,
				auto_start: false,
				mode_360: true
			};
			if(options) $.extend(settings, options);
		
			var elemWidth = parseInt($(this).attr('width'));
			if ( elemWidth == 0 ) { elemWidth = $(this).width(); }
			var elemHeight = parseInt($(this).attr('height'));
			if ( elemHeight == 0 ) { elemHeight = $(this).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', '0px')
				.css('padding', '0px')
				.css('border', 'none')
				.wrap("<div class='panorama-container'></div>");
			if (settings.mode_360) 
				$(this).clone().insertAfter(this);
			
			panoramaContainer = $(this).parent();
			panoramaContainer.css('height', elemHeight+'px').css('overflow', 'hidden').wrap("<div class='panorama-viewport'></div>").parent().css('width',settings.viewport_width+'px')
				.append("<div class='panorama-control'><a href='#' class='panorama-control-left'>&nbsp;</a> <a href='#' class='panorama-control-pause'>&nbsp;</a> <a href='#' class='panorama-control-right'>&nbsp;</a> </div>");
			
			panoramaViewport = panoramaContainer.parent();
			
			var mouseUpHandler = function()
			{ 
				panoramaViewport.removeClass('grabbing');
				bMouseMove = false;
				mouseMoveStart = 0;
				mouseMoveMarginStart = 0; 
				$("body").unbind("mouseup",mouseUpHandler);
			};
			
			panoramaViewport.mousedown(function(e){
				if ( e.which !=  1 ) { return true; }
				panoramaContainer.stop();
				panoramaViewport.addClass('grabbing');
			    if (!bMouseMove) 
			    {
					bMouseMove = true;
					mouseMoveStart = e.clientX;
					mouseMoveMarginStart =  parseInt(panoramaContainer.css('margin-left'));
					$("body").bind("mouseup", mouseUpHandler);
			    }
			    return false;
			}).mousemove(function(e){
			      if (bMouseMove)
			      {
			    	  var clientX = e.clientX;
					  var delta = parseInt( clientX - mouseMoveStart );
				      var newMarginLeft = mouseMoveMarginStart + 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('margin-left', newMarginLeft+'px');
				
					  mouseMoveStart = clientX;
					  mouseMoveMarginStart = newMarginLeft;
			      }
			});//.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('margin-left', '-'+(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);
					}
				});

			}

			
		}
		
	};
})(jQuery);
