/**
 * @author Dmitriy Kotelnikov (dimonnot@design.ru)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * 24.09.2008
 */

//Открытая часть панорамы, которую используют флеш и JavaScript 
var panoram;
 
//Скрываем внутреннюю часть.
$(function(){
	var bFlash = 0;
	var oContainers = $('.panoramaopen');
	var oOpened = 0;
	var aConnectors = new Array();
	var oPanorams = $('.panorama');

	panoram = {
		/*
		  *  Когда флешка проинициализирована, она вызывает этот метод и мы ей можем слать сообщения
		  */
		initialized:function(id){
			aConnectors[id].init();
		},
		
		/*
		 *  Скрывает открытые панорамы
		 */
		hide:function(){
			if( oOpened ){
				oOpened.hide();
			}
		},
		
		/*
		  *  Отображает/скрывает панораму
		  */
		finishhide:function(){
			if( oOpened ){
				oOpened.finishhide();
			}
		}
	};

	oPanorams.click(
		function(){
			this.toggle();
			return false;
		}
	).each(function(){
		var oOpener = this;
		var oOpenerImage = $(this).find('img')[0];
		var oContainer = oContainers.filter('.'+oOpener.id);
		var oPanoram = oContainer.find('.scroll');
		
		var oPanoramReal = oPanoram[0];
		var oImage = oContainer.find('.scroll img');
					
		if( oContainer.length > 0 && oOpenerImage && oImage.length > 0 ){
			var iIndex = oContainers.index(oContainer[0]);	
			var iConnectionId = ++my.connector;
			oContainer.find('.inner:first').attr('id','flash-'+iConnectionId);
			aConnectors[iConnectionId] = this;
			
			var sMessage = "";
			var bHidden = 1,bReady = 0;
			oContainer[0].innerHTML += '<div id="connector-'+iConnectionId+'"></div>';
			
			/*
			  *  Центрует панораму по вертикале
			  */
			var centerpanoram = function(){
				var top = 0;
		
				if( document.documentElement && document.documentElement.scrollTop )
					top = document.documentElement.scrollTop;
				else if( document.body.scrollTop )
					top = document.body.scrollTop;
				top += Math.round((document.body.clientHeight - 556)/2);
		
				if( top > 0 )
					oContainer.css('top',top+'px');
			};
			
			/*
			  *  Функция отправляет сообщение msg флешке
			  */
			var messagetoflash = function(msg){	
				if( !bReady ){
					sMessage = msg;
					return;
				}
				swfobject.embedSWF("/flash/connector.swf", "connector-"+iConnectionId, "1", "1", "9.0.0","/flash/expressInstall.swf", {method:'onCallbackHandler',message:msg,connection_id:iConnectionId}, {allowScriptAccess:'always',movie:'/flash/connector.swf'}, {id:'connector-'+iConnectionId});
			};
			
			/*
			  *  Функция вызывается, когда панораму можно скрыть
			  */
			this.finishhide = function(id){
				//Востанавливаем прежнюю картинку
				oOpenerImage.src = oOpenerImage.firstsrc;
				if( fixPNG )
					fixPNG(oOpenerImage);
		
				oContainer.css('left','-1000%');
				my.lock = 0;
				bHidden = 1;
				
				oOpened = 0;
			};
			
			this.init = function(){
				bReady = 1;
				messagetoflash(sMessage);
			};
			
			this.toggle = function(){
				if( bHidden )
					this.show();
				else
					this.hide();
			};
			
			/*
			  *  Отображает панораму
			  *  isshownight - отобразить ночную панораму?
			  */
			this.show = function(){
				if( my.lock )
					return;
				
				bHidden = 0;
		
				my.hide();
				
				oOpened = oOpener;
			
				//Если сработал Fixpng, то путь к картинке лежит в параметре link
				oOpenerImage.firstsrc = oOpenerImage.link ? oOpenerImage.link : oOpenerImage.src;
				oOpenerImage.src = '/i/nopanorama.png';
				if( fixPNG )
					fixPNG(oOpenerImage);
		
				//Центруем панораму
				centerpanoram();
		
				oContainer.removeClass('hidden');
				if( bFlash ){
					oPanoramReal.scrollLeft = Math.round(oImage.attr('width') / 2);
					oContainer.css('left','50%');
				}
				else{
					oContainer.css('left','50%');
					messagetoflash('show');
				}
			};
			
			this.hide = function(){
				if( my.lock )
					return;
				
				my.lock = 1;
			
				if( !bFlash )//Java Script
					this.finishhide();
				else
					messagetoflash('hide');
			};
			
			swfobject.embedSWF(my.panorams[iIndex][0], "flash-"+iConnectionId, "968", "593", "9.0.0","/flash/expressInstall.swf", {method:'onCallbackHandler',connection_id:iConnectionId,step:10,cycle:my.panorams[iIndex][1],image:oImage.attr('src')}, {wmode:'transparent',allowScriptAccess:'always',movie:my.panorams[iIndex][0]}, {style:'visibility:hidden'});
			
			if( $('flash-'+iConnectionId).length < 1 ){
				bFlash = 1;
			}{
				bFlash = 0;
				var bStopped = 0,bSide = 0;
				var iSpeed,iCursorX,iMove;
				
				var oLeft = oContainer.find('a.pan-left');
				var oRight = oContainer.find('a.pan-right');
				
				/*
				  *  Функция - свободного движения панорамы, после того, как пользователь её отпустил.
				  */
				var freemove = function(){
					if( iSpeed != 0 )
					{
						var pixelspeed = Math.round(iSpeed);
						if( pixelspeed + oPanoramReal.scrollLeft <= 0 )
						{
							oPanoramReal.scrollLeft = 0;
							iSpeed = 0;
							oLeft.addClass('hidden');
						}
						else if( pixelspeed + oPanoramReal.scrollLeft >= oPanoramReal.scrollWidth - oPanoramReal.offsetWidth )
						{
							oPanoramReal.scrollLeft = oPanoramReal.scrollWidth - oPanoramReal.offsetWidth;
							iSpeed = 0;
							oRight.addClass('hidden');
						}
						else
							oPanoramReal.scrollLeft += Math.round(iSpeed);
						iSpeed = iSpeed * 0.98;
						setTimeout(freemove,30);
					}
				};
				
				/*
				  *  Навигация с клавиатуры
				  */
				var keynavigation = function(e){
					switch (e.keyCode ? e.keyCode : e.which ? e.which : null)
					{
						case 0x25:
							bSide = 1;
							move();	
						break;
					
						case 0x27:
							bSide = 0;
							move();
						break;
					}			
				};
				
				/*
				  *  Передвижение панорамы при помощи мыши
				  */
				var move = function(){
					iSpeed = 0;
					if( iSide ){
						if( oPanoramReal.scrollLeft > 10 ){
							oRight.removeClass('hidden');
							oPanoramReal.scrollLeft -= 10;
						}
						else{
							oPanoramReal.scrollLeft = 0;
							oLeft.addClass('hidden');
						}
					}
					else{
						if( oPanoramReal.scrollLeft + 10 < oPanoramReal.scrollWidth - oPanoramReal.offsetWidth ){
							oLeft.removeClass('hidden');
							oPanoramReal.scrollLeft += 10;
						}
						else{
							oPanoramReal.scrollLeft = oPanoramReal.scrollWidth - oPanoramReal.offsetWidth;
							oRight.addClass('hidden');
						}
					}
	
					if( !bStopped )
						setTimeout(move,50);
				};
				
				$(window).keydown(keynavigation).mouseup(
					function(){
						bStopped = 1
					}
				);
				
				oPanoram.mousedown(
					function(e){
						iSpeed = 0;
						iCursorX = e.screenX;
						bStopped = 0;
				
						if(e.stopPropagation)
							e.stopPropagation();
						else
							e.cancelBubble = true;
				
						if(e.preventDefault)
							e.preventDefault();
						else
							e.returnValue = false;
					}
				).mouseup(
					function(){
						bStopped = 1;
						if( Math.abs(iSpeed) < 10 )
							iSpeed = 0;
						setTimeout(freemove,50);
						return false;
					}
				);
			
				oPanoram.mousemove(
					function(e){
						if( !bStopped ){
							var iMove = iCursorX - e.screenX;
							if( oPanoramReal.scrollLeft + iMove <= 0 ){
								oPanoramReal.scrollLeft = 0;
								oLeft.addClass('hidden');
							}
							else if( oPanoramReal.scrollLeft + iMove >= oPanoramReal.scrollWidth - oPanoramReal.offsetWidth )
							{
								oPanoramReal.scrollLeft = oPanoramReal.scrollWidth - oPanoramReal.offsetWidth;
								oRight.addClass('hidden');
							}
							else
							{
								oPanoramReal.scrollLeft += iMove;
								oLeft.removeClass('hidden');
								oRight.removeClass('hidden');
							}
							iSpeed = iMove;
							iCursorX = e.screenX
						}
					}
				).mouseup(
					function(){
						bStopped = 1;
						if( Math.abs(iSpeed) < 10 )
							iSpeed = 0;
						setTimeout(freemove,50);
						return false
					}
				);
			
			
				oLeft.mousedown(
					function(e){
						if(e.preventDefault)
							e.preventDefault();
						bStopped = 0;
						bSide = 1;
						setTimeout(move,50);
						return false
					}
				).mouseup(
					function(e){
						bStopped = 1;
						return false
					}
				).click(
					function(){
						return false
					}
				);
			
				oRight.mousedown(
					function(){
						oStopped = 0;
						oSide = 0;
						setTimeout(move,50);
						return false
					}
				);
				oRight.mouseup(
					function(){
						oStopped = 1;
						return false
					}
				).click(
					function(){
						return false
					}
				);
			
				oContainer.find('a.pann-close').click(
					function(){
						hide();
						return false
					}
				);
			}
		}
	});
});