/* =========================================================
// 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: 475,
				viewport_height: 320,
				start_top:0,
				speed: 8000,
				speed_left:0,
				speed_top:0,
				increase_speed_left:0,
				top_direction:'top',
				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;


			$(this).css('position', 'relative')
				.css('margin', '0')
				.css('padding', '0')
				.css('border', 'none')
				.wrap("<div class='panorama-container'></div>");
			if (settings.mode_360)
				$(this).clone().insertAfter(this);

			panoramaContainer = $(this).parent();
			panoramaContainer.wrap("<div class='panorama-viewport'></div>").parent().css({'width':settings.viewport_width+'px','height':settings.viewport_height+'px'})
				.append("<div class='panorama-control'><a href='#' class='panorama-control-left'><<</a><a href='#' class='panorama-control-up'>UP</a> <a href='#' class='panorama-control-pause'>x</a><a href='#' class='panorama-control-down'>DOWN</a><a href='#' class='panorama-control-right'>>></a> </div>");

			panoramaViewport = panoramaContainer.parent();
			var offset_left=$(panoramaViewport).offset().left;
			var offset_top=$(panoramaViewport).offset().top;

			panoramaViewport.find('a.panorama-control-left').bind('click', function() {
				$(panoramaContainer).stop();
				settings.direction = 'right';
				settings.speed_left=settings.speed*(2-settings.increase_speed_left);
				//alert(settings.speed);
				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';
				settings.speed_left=settings.speed*(2-settings.increase_speed_left);
				panorama_animate(panoramaContainer, elemWidth, settings);
				return false;
			});
			panoramaViewport.find('a.panorama-control-pause').bind('click', function() {
				$(panoramaContainer).stop();
				return false;
			});
			panoramaViewport.find('a.panorama-control-up').bind('click', function() {
				$(panoramaContainer).stop();
				settings.direction = 'down';
				panorama_animate(panoramaContainer, elemWidth, settings, elemHeight);
				return false;
			});
			panoramaViewport.find('a.panorama-control-down').bind('click', function() {
				$(panoramaContainer).stop();
				settings.direction = 'up';
				panorama_animate(panoramaContainer, elemWidth, settings, elemHeight);
				return false;
			});
			if (settings.control_display == 'yes') {
				panoramaViewport.find('.panorama-control').show();
			} else {
				panoramaViewport.bind('mouseover', function(ev){
					$(this).find('.panorama-control').show();
					return false;
				}).bind('mouseout', function(){
					$(this).find('.panorama-control').hide();
					settings.increase_speed_left=0;
					return false;
				});

			}
			panoramaViewport.bind('mousemove', function(e){
				var x=e.clientX;
				var y=e.clientY;
				var middle_x=offset_left+settings.viewport_width/2+20;
				var middle_y=offset_top+settings.viewport_height/2+20;

				var d_value_left=(x < middle_x)?(middle_x-x):(x-middle_x);
				var d_value_top=(y < middle_y)?(middle_y-y):(y-middle_y);
				settings.top_direction=(y < middle_y)?'top':'bottom';
				//console.log('d_value_left:'+d_value_left+'---d_value_top:'+d_value_top);
				if(d_value_left<50 && d_value_top<50){
					$(panoramaContainer).stop();
					return;
				}

				settings.increase_speed_left = d_value_left/(settings.viewport_width/2);
				if(x < middle_x){
					if(d_value_left>50){
						panoramaViewport.find('a.panorama-control-left').click();
					}else{
						if(y < middle_y)
							panoramaViewport.find('a.panorama-control-up').click();
						else
							panoramaViewport.find('a.panorama-control-down').click();
					}
				}
				else{
					if(d_value_left>50){
						panoramaViewport.find('a.panorama-control-right').click();
					}else{
						if(y < middle_y)
							panoramaViewport.find('a.panorama-control-up').click();
						else
							panoramaViewport.find('a.panorama-control-down').click();
					}
				}
			})

			var start_top = ($(this).attr('height')-settings.viewport_height)/2;
			settings.start_top = start_top;
			var speed_top = ((settings.speed / elemHeight) * (start_top))/2;
			settings.speed_top = speed_top;
			$(this).parent().css({'margin-left': '-'+settings.start_position+'px','margin-top': '-'+start_top+'px'});

			if (settings.auto_start)
				panorama_animate(panoramaContainer, elemWidth, settings);

		});
		function panorama_animate(element, elemWidth, settings, elemHeight) {
			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);
					}
				});
			}
			*/
			switch(settings.direction)
		   {
			case 'right':
				var animate={};

				if(settings.top_direction=='top'){
					animate={marginLeft: 0,marginTop: '-'+2*settings.start_top};
				}else {
					animate={marginLeft: 0,marginTop: 0};
				}
				//console.log('animate '+settings.top_direction+' right:'+animate);
				$(element).animate(animate, ((settings.speed_left / elemWidth) * (currentPosition)) , 'linear', function (){
					if (settings.mode_360) {
						$(element).css('marginLeft', '-'+(parseInt(parseInt(elemWidth))+'px'));
						panorama_animate(element, elemWidth, settings);
					}
				});
			break

			case 'left':
				var rightlimit;
				if (settings.mode_360)
					rightlimit = elemWidth;
				else
					rightlimit = elemWidth-settings.viewport_width;

				var animate={};
				if(settings.top_direction=='top'){
					animate={marginLeft: -rightlimit,marginTop: '-'+2*settings.start_top};
				}else {
					animate={marginLeft: -rightlimit,marginTop: 0};
				}
				//console.log('animate '+settings.top_direction+' left:'+animate);
				$(element).animate(animate, ((settings.speed_left / rightlimit) * (rightlimit - currentPosition)), 'linear', function (){
					if (settings.mode_360) {
						$(element).css('margin-left', 0);
						panorama_animate(element, elemWidth, settings);
					}
				});
			break

			case 'up':
				$(element).animate({marginTop: 0}, settings.speed_top , 'linear', function (){
					//alert(1);
				});
			break

			case 'down':
				$(element).animate({marginTop: '-'+2*settings.start_top}, settings.speed_top , 'linear', function (){

				});
			break
			default:

			}


		}

	};

$(document).ready(function(){
	$("img.panorama").panorama();
});
})(jQuery);
