/* =========================================================
// 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: 5000,
				speed_left:0,
				speed_top:0,
				top_direction:'',
				direction: 'left',
				control_display: 'auto',
				start_position_left: 0,
				start_position_top: 0,
				auto_start: true,
				mode_360: true
			};
			if(options) $.extend(settings, options);
		
			var elemWidth = parseInt($(this).attr('width'));
			var elemHeight = parseInt($(this).attr('height'));
			elH = elemHeight;
			elW = elemWidth;
			
			var currentElement = this;
			var panoramaViewport, panoramaContainer;
			
			var start_top = (elemHeight-settings.viewport_height)/2;
			settings.start_top = start_top;
			var speed_top = ((settings.speed / elemHeight) * (start_top))*2;
			settings.speed_top = speed_top;
			
			$(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';
				panorama_animate(panoramaContainer, elemWidth, settings, elemHeight);
				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, elemHeight);
				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 = 'up';
				panorama_animate(panoramaContainer, elemWidth, settings, elemHeight);
				return false;
			});
			panoramaViewport.find('a.panorama-control-down').bind('click', function() {
				$(panoramaContainer).stop();
				settings.direction = 'down';
				panorama_animate(panoramaContainer, elemWidth, settings, elemHeight);
				return false;
			});			
			if (settings.control_display == 'yes') {
				panoramaViewport.find('.panorama-control').show();
			}
			else {
				panoramaViewport.bind('mouseover', function(){
					enableScroll();
					return false;
				}).bind('mouseout', function(){
					disableScroll();
					return false;
				});
				
			};
			
			panoramaViewport.bind('mousemove', function(e){
				var x = e.clientX;
				var y = e.clientY;
				var middle_x = offset_left+settings.viewport_width/2 - getScroll().l;
				var middle_y = offset_top+settings.viewport_height/2  - getScroll().t;
				var d_value_left = middle_x - x;
				var d_value_top = middle_y - y;
				settings.top_direction = (y < middle_y) ? 'bottom' : 'top';
				
				var left_speed = 0;
				var part_viewport_width = parseInt(settings.viewport_width/10);
				var offset_left_2 = parseInt(offset_left+settings.viewport_width/2);
				var speed_base = 40;
				if (offset_left < x && x < parseInt(offset_left + part_viewport_width)){
					left_speed = speed_base;
				}
				if (parseInt(offset_left + part_viewport_width) < x && x  < parseInt(offset_left + part_viewport_width*2)){
					left_speed = parseInt(speed_base*75/100);
				}
				if (parseInt(offset_left + part_viewport_width*2) < x && x  < parseInt(offset_left + part_viewport_width*3)){
					left_speed = parseInt(speed_base*50/100);
				}
				if (parseInt(offset_left + part_viewport_width*3) < x && x  < parseInt(offset_left + part_viewport_width*4)){
					left_speed = parseInt(speed_base*25/100);
				}
				if (parseInt(offset_left + part_viewport_width*4) < x && x  < parseInt(offset_left + part_viewport_width*5 - 15)){
					left_speed = parseInt(speed_base*5/100);
				}
				if (parseInt(offset_left_2 + 15) < x && x  < parseInt(offset_left_2 + part_viewport_width)){
					left_speed = -parseInt(speed_base*5/100);
				}
				if (parseInt(offset_left_2 + part_viewport_width) < x && x  < parseInt(offset_left_2 + part_viewport_width*2)){
					left_speed = -parseInt(speed_base*25/100);
				}
				if (parseInt(offset_left_2 + part_viewport_width*2) < x && x  < parseInt(offset_left_2 + part_viewport_width*3)){
					left_speed = -parseInt(speed_base*50/100);
				}
				if (parseInt(offset_left_2 + part_viewport_width*3) < x && x  < parseInt(offset_left_2 + part_viewport_width*4)){
					left_speed = -parseInt(speed_base*75/100);
				}
				if (parseInt(offset_left_2 + part_viewport_width*4) < x && x < parseInt(offset_left_2 + part_viewport_width*5)){
					left_speed = -parseInt(speed_base);
				}
				
				sx = parseInt(parseInt(d_value_left)/40 + left_speed);
				sy = parseInt(parseInt(d_value_top)/25);
			})
		});
		function panorama_animate(element, elemWidth, settings, elemHeight) {
			currentPosition = 0-parseInt($(element).css('margin-left'));
			currentPosition_top = 0-parseInt($(element).css('margin-top'));
			toplimit = 2*settings.start_top;
			
			switch (settings.direction) {
				case 'right':
					var animate={};
					var topspeed;
					if (settings.top_direction=='top') {
						animate={marginTop: '-'+2*settings.start_top};
						topspeed=(settings.speed_top / toplimit) * (toplimit - currentPosition_top);
					}
					else {
						animate={marginTop: 0};
						topspeed=(settings.speed_top / elemHeight) * (currentPosition_top);
					}
					
					if (settings.top_direction!="") {
						settings.top_direction=""
						$(element).animate(animate, topspeed , 'linear', function (){ 
							$(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 {
						$(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);
							}
						});
					}
				break;
			
				case 'left':
					var rightlimit;
					if (settings.mode_360) 
						rightlimit = elemWidth;
					else
						rightlimit = elemWidth-settings.viewport_width;

					var animate={};
					var topspeed;
					if (settings.top_direction=='top') {
						animate={marginTop: '-'+2*settings.start_top};
						topspeed=(settings.speed_top / toplimit) * (toplimit - currentPosition_top);
					}
					else {
						animate={marginTop: 0};
						topspeed=(settings.speed_top / toplimit) * (currentPosition_top);
					}
					
					if (settings.top_direction!="") {
						$(element).animate(animate, topspeed, 'linear', function (){ 
							settings.top_direction="";
							$(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, elemHeight);
								}
							});
						});
					}
					else {
						$(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, elemHeight);
							}
						});
					}
				break;
				
				case 'up':
					toplimit = 2*settings.start_top;
					topspeed=(settings.speed_top / toplimit) * (currentPosition_top);
					$(element).animate({marginTop: 0}, topspeed , 'linear', function (){ 
						
					});
				break;
				
				case 'down':
					topspeed=(settings.speed_top / toplimit) * (toplimit - currentPosition_top);
					$(element).animate({marginTop: '-'+2*settings.start_top}, topspeed , 'linear', function (){ 
						
					});
				break;
				default:
				break;
			}
		}
	};
	//get the scroll infomation
	function getScroll(){
		var t, l, w, h;
		if (document.documentElement && document.documentElement.scrollTop) {
			t = document.documentElement.scrollTop;
			l = document.documentElement.scrollLeft;
			w = document.documentElement.scrollWidth;
			h = document.documentElement.scrollHeight;
		}
		else if (document.body) {
			t = document.body.scrollTop;
			l = document.body.scrollLeft;
			w = document.body.scrollWidth;
			h = document.body.scrollHeight;
		}
		return { t: t, l: l, w: w, h: h };
	} 
})(jQuery);


/*
 Variables init
 */
var sx = 0;
var sy = 0;
var elH;
var elW;
var timerScroll;

/*
 Enabling the scroll
 */
function enableScroll(){
	timerScroll = setInterval("scroll();", 50);
}

/*
 Disabling the scroll
 */
function disableScroll(){
	clearInterval(timerScroll);
}

/*
 Scrolling
 */
function scroll(){
	if(parseInt($(".panorama-container").css('marginTop'))+sy > 0){
		sy = 0;
		$(".panorama-container").css('marginTop', "0px");
	}
	if(parseInt($(".panorama-container").css('marginTop'))+sy < 0-elH+parseInt($(".panorama-viewport").css("height"))){
		sy = 0;
		$(".panorama-container").css('marginTop', "-"+(elH-parseInt($(".panorama-viewport").css("height")))+"px");
	}
	if(parseInt($(".panorama-container").css('marginLeft'))+sx > 0){
		$(".panorama-container").css('marginLeft', "-"+(elW)+"px");
	}
	if(parseInt($(".panorama-container").css('marginLeft'))+sx < 0-(2*elW)+parseInt($(".panorama-viewport").css("width"))){
		$(".panorama-container").css('marginLeft', "-"+(elW-parseInt($(".panorama-viewport").css("width")))+"px");
	}

	$(".panorama-container").css('marginLeft', (parseInt(parseInt($(".panorama-container").css('marginLeft'))+sx)+'px'));
	$(".panorama-container").css('marginTop', (parseInt(parseInt($(".panorama-container").css('marginTop'))+sy)+'px'));
}