// (с) Уважаемые господа, здесь вы видите плоды моего труда - зарождающийся фреймворк ;-)
// Если вам хочется использовать что-то из имеющегося или получить большее, например 
// серверные скрипты, которые всё это генерируют в автоматическом режиме или хотите поделиться 
// своим кодом или идеями для развития моего фреймворка, хоите посотрудничать со мной,
// убедительная просьба связаться со мной по e-mail : sbritoff сoбaka comstar тoчка ru.
// Если вы хотите использовать исходный код, но общаться со мной не имеете ни малейшего 
// желания, оставьте этот комментарий и строчку после него
// Данные скрипты безвозмездно взяты на сайте www.baurock.ru во временное пользование :-)


//********************** UserAgent
// Объект для определения типа браузера
function UserAgent () 
{
	this.UserAgent = navigator.userAgent;	
}

UserAgent.prototype =
{
	GetUserAgentName:function() //Возвращает название браузера (в данный момент только для IE, другие пока не нужны :-)
			{
				if (this.UserAgent.indexOf('MSIE') != -1)
				{
					return ("MSIE");
				}
				return ("Unknown")
			}	
}

//********************** Deck
//Объект для работы с накладываемым слоем
//MaskIDName ID контейнера со слоем маски
//DeckIDName ID контейнера рабочим слоем

function Deck (MaskIDName, DeckIDName)
{
	this.MaskID = MaskIDName;
	this.DeckID = DeckIDName;	
	
	this.MyUserAgent = new UserAgent(); //Пытаемся обеспечить кроссбраузерность :-)
	this.yPos   = 0; //сюда будем сохранять положение вертикального скроллирования
}

Deck.prototype =
{
	prepareIE:	function(height, overflow) //Пытаемся обеспечить кроссбраузерность в IE :-) - убиваем скроллинг нах 
			{
				var bod, htm;
				bod = document.getElementsByTagName('body')[0];
				bod.style.height = height;
				bod.style.overflow = overflow;
	
				htm = document.getElementsByTagName('html')[0];
				htm.style.height = height;
				htm.style.overflow = overflow;
			},
	getScroll:	function () //Пытаемся обеспечить кроссбраузерность в IE :-) - сохраняем положение вертикальной прокрутки
			{
				var yScroll;
				if (self.pageYOffset) 
				{
        				yScroll = self.pageYOffset;
				} 
				else if (document.documentElement && document.documentElement.scrollTop)
				{	// Для шестого эксплорера
        				yScroll = document.documentElement.scrollTop; 
				}
				else if (document.body) 
				{	// Для всех остальных эксплореров
        				yScroll = document.body.scrollTop;
				}
        			this.yPos = yScroll;
			},
	setScroll:	function(x, y) 	//Пытаемся обеспечить кроссбраузерность в IE :-) - устанавливаем положение вертикальной и горизонтальной прокрутки 	
			{
				window.scrollTo(x, y); 
			},
	BringupSlideshowDeck:function() //Показываем маску и рабочий слой
			{
				if (this.MyUserAgent.GetUserAgentName() == "MSIE") //Пытаемся обеспечить кроссбраузерность в IE :-)
				{
					this.getScroll();
					this.prepareIE ('100%','hidden');
				}
				document.getElementById(this.MaskID).style.visibility = 'visible'; //делаем видимыми слои маски
				document.getElementById(this.DeckID).style.visibility = 'visible'; //и рабочего слоя
				if (this.MyUserAgent.GetUserAgentName() == "MSIE") //Пытаемся обеспечить кроссбраузерность в IE :-)
				{
					this.setScroll(0,0);
				}
			},
	HideSlideshowDeck:function() //Прячем маску и рабочий слой
			{
				if (this.MyUserAgent.GetUserAgentName() == "MSIE") //Пытаемся обеспечить кроссбраузерность в IE :-)
				{
					this.prepareIE('auto', 'auto');
				}
				document.getElementById(this.MaskID).style.visibility = 'hidden'; //делаем невидимыми слои маски
				document.getElementById(this.DeckID).style.visibility = 'hidden'; //и рабочего слоя
				if (this.MyUserAgent.GetUserAgentName() == "MSIE") //Пытаемся обеспечить кроссбраузерность в IE :-)
				{
					this.setScroll(0,this.yPos);
				}
			}
}

//********************* Film
// Объект для хранения предзагруженных кадров для работы с динамическими кнопками
// Width - ширина кадра
// Height - высота кадра
// URL - местоположение кадра

function Film (Width, Height, URL)
{
	this.Width = Width;
	this.Height = Height;
	this.IMGCont = new Image(this.Width,this.Height);	//а сюда мы "предзагрузим" очередной кадр
	this.IMGCont.src = URL;					//Предзагружаем	
}


//********************** FilmRollover
// Функция для правильной работы с динамическими кнопками ( flash на коленке своими руками :-)
// MyName - имя создаваемого объекта данного класса
// IMGID - ID элемента <img > кнопкой 
// ContainerID - имя кронтейнера (например <div> в котором будет размещаться кнопка)
// ButtonWidth - ширина кнопки
// ButtonHeight - высота кнопки
// Action - имя функции, которая будет выполняться при нажатии на кнопку


function FilmRollover (MyName, IMGID, ContainerID, ButtonWidth, ButtonHeight, Action)

{	this.MyName = MyName;
	this.ImageID = IMGID;
	this.ContainerID=ContainerID;
	this.ButtonWidth = ButtonWidth;
	this.ButtonHeight = ButtonHeight;
	this.Action = Action;
	this.PlayDelay = 15;			//задержка в мс между выводом кадров
	this.FilmPosition = 0;			//номер кадра, воспроизводимиого в данный момент
	this.Films = new Array();		//массив с предзагруженными кадрами
	this.PID = 0;				//"Идентификатор процесса" плеера для его остановки
	this.MyUserAgent = new UserAgent();	//Информация о типе браузера
	this.PlayDirection = "Stop";		//Текущее состояние плеера (возможные значения переменной Forward/Backward/Stop)

}

FilmRollover.prototype = 
{
	GetFilmSize	:function ()		//Возвращает количество кадров в изображении кнопки
			{
				return this.Films.length;
			},
	UpdatePage	:function()		//Выводим кадр с номером this.FilmPosition
			{
				document.getElementById(this.ImageID).src = this.Films[this.FilmPosition].IMGCont.src;
			},
	DrawButton	:function()		//Выводим кнопку со всеми "потрохами"
			{
				var overlay = document.createElement("DIV"); 	//создаём новый div
				overlay.id = this.ContainerID;			//c id=this.ContainerID
				document.body.insertBefore (overlay, document.body.firstChild); //и размещаем его первым в body
				document.getElementById(this.ContainerID).innerHTML = "<img src=\"/layout1/images/gallery/transparentpixel.gif\" id=\""+this.ImageID+"\" border=\"0\" width=\""+this.ButtonWidth+"\" height=\""+this.ButtonHeight+"\" onclick=\"javascript:"+this.Action+";\" onmouseover=\"javascript:"+this.MyName+".SetHandler('PlayForward');\" onmouseout=\"javascript:"+this.MyName+".SetHandler('PlayBackward');\" class= \"button_style\" alt= \"Слайдшоу\"  title = \"Слайдшоу\">";
				if (this.MyUserAgent.GetUserAgentName() == "MSIE")	//Боремся за кроссбраузорность (спасибо) 
				{							//Роме Воронежскому и Юре Васильчикову
											//Из дизайнбюро Тёмы Лебедева за идею
					document.body.style.background = 'url(http://www.baurock.ru/layout1/images/gallery/transparentpixel.gif) no-repeat'; 
					document.body.style.backgroundAttachment = 'fixed';
				}
				this.UpdatePage();
			},
	AddFilm		:function(Width, Height, URL)	// Добавляем новый кадр шириной Width и высотой Height, расположенный по
							// адресу URL к изображению кнопки
			{
				this.Films[this.GetFilmSize()] = new Film(Width, Height, URL);
			},
	PlayForward	:function()			//воспроизводим "Вперёд"
			{
				if (this.FilmPosition < (this.GetFilmSize()-1)) //Если не достигли конца , то
				{
					this.FilmPosition++;
					this.UpdatePage();
				}
				else						//иначе останавливаем воспроизведение
				{
					this.DropHandler();	
				}
			},
	PlayBackward	:function ()			//Воспроизводим назад
			{
				if (this.FilmPosition > 0)	//Если не достигли начала, то
				{
					this.FilmPosition--;
					this.UpdatePage();
				}
				else				// иначе останавливаем воспроизведение
				{
					this.DropHandler();
				}
			},
	//В следующем методе мы вспомним борьбу за живучесть резидентной программы в однозадачном DOS'е
	//Ох уж эта нереентерабельность системных вызовов DOS'а :-)
	SetHandler	:function (direction)			// Запускаем воспроизведение в направлении direction
			{					//возможные значения direction "PlayForward" и "PlayBackward"
				var self=this;			// сохраняем текущий объект во внутреннюю переменную self функции
				if ( this.PlayDirection == "Stop") //если воспроизведение остановлено
				{
					if ((direction == "PlayForward") && (this.FilmPosition < (this.GetFilmSize()-1))) 
					{// начинаем воспроизводить вперёд если задано воспроизведение вперёд и не достигнут конец
						this.PID = setInterval(function(){ self.PlayForward()}, this.PlayDelay);
						this.PlayDirection = "Forward";
					}
					if ((direction == "PlayBackward") && (this.FilmPosition > 0))
					{// начинаем воспроизводить назад если задано воспроизведение назад и не достигнуто начало
						this.PID = setInterval(function(){ self.PlayBackward()}, this.PlayDelay);
						this.PlayDirection = "Backward";
					}
				}
				else //если в данный момент происходит воспроизведение
				{
					if ((direction == "PlayForward") && (this.PlayDirection == "Backward") && (this.FilmPosition < (this.GetFilmSize()-1)))
					{// начинаем воспроизводить вперёд, если задано воспроизведение вперёд и происходит воспроизведение назад и не достигнут конец
						this.DropHandler();
						this.PID = setInterval(function(){ self.PlayForward()}, this.PlayDelay);
						this.PlayDirection = "Forward";
					}
					if ((direction == "PlayBackward") && (this.PlayDirection == "Forward") && (this.FilmPosition > 0))
					{// начинаем воспроизводить назад, если задано воспроизведение назад и происходит воспроизведение вперёд и не достигнуто начало
						this.DropHandler();
						this.PID = setInterval(function(){ self.PlayBackward()}, this.PlayDelay);
						this.PlayDirection = "Backward";
					}
				}
			},
	DropHandler	:function ()	// останавливаем воспроизведение
			{
				if ( this.PlayDirection != "Stop") //если оно происходит :-)
				{
					clearInterval(this.PID);
					this.PlayDirection = "Stop";
				}
			}
}


//********************* Slide
// объект для хранения информации об одном элементе слайдшоу
// SmallPicWidth - ширина превьюшки
// SmallPicHeight - высота превьюшки
// SmallPicFilename - url превьюшки
// LargePicWidth - ширина большой картинки
// LargePicHeight - высота большой картинки
// LargePicFilename - url большой картинки
// Description - описание элемента

function Slide (SmallPicWidth, SmallPicHeight, SmallPicFilename, LargePicWidth, LargePicHeight, LargePicFilename, Description)
{
	this.SmallPicWidth = SmallPicWidth;
	this.SmallPicHeight = SmallPicHeight;
	this.SmallPicFilename = SmallPicFilename;
	this.LargePicWidth = LargePicWidth;
	this.LargePicHeight = LargePicHeight;
	this.LargePicFilename = LargePicFilename;
	this.Description = Description; 
}


//********************** Projector
// Проектор - объект для демонстрации слайдшоу

function Projector()
{
	this.SlideBoxPosition = 0;	// Номер воспроизводимого слайда
	this.SlideBox = new Array();	// Коробка со слайдами
	this.WorkingURL = "";		// Каталог со слайдами
	this.PlayDelay = 3000;		// Задержка между воспроизведением слайдов
	this.PID = 0;			// "Идентификатор процесса" плеера для его остановки
	this.PlayerRunning = false;	// Идёт ли в данный момент воспроизведение
}



Projector.prototype = 
{
	SetWorkingURL	:function (wurl) //задаём каталог со слайдами
			{
				this.WorkingURL = wurl;
			},
	GetSlideBoxSize	:function () //возвращает количество слайдов в коробке
			{
				return this.SlideBox.length;
			},
	GetSlideBoxPos	:function() //возвращает номер воспроизводимого слайда
			{
				return this.SlideBoxPosition;
			},
	AddSlide 	:function(SmallPicWidth, SmallPicHeight, SmallPicFilename, LargePicWidth, LargePicHeight, LargePicFilename, Description)
			{ //добавляем слайд к слайдшоу
				this.SlideBox[this.GetSlideBoxSize()] = new Slide(SmallPicWidth, SmallPicHeight, SmallPicFilename, LargePicWidth, LargePicHeight, LargePicFilename, Description);
				
			},
	
	// Чтобы картинки не деформировались при выводе их на экран приходится вывод картинок осуществлять в три этапа итак
	//ДЕЛАЙ РАЗ
	// Очищаем экран от старых картинок
	ClearOld	:function()
			{
				// Определяем местоположение картинок

				var transppixel = "/layout1/images/gallery/transparentpixel.gif"
				var prevpic = document.getElementById("prevpic");
				var mainpic = document.getElementById("mainpic");
				var nextpic = document.getElementById("nextpic");
				var largepic = document.getElementById("largepic");
				
				// Затираем избражение
				prevpic.src = transppixel;
				mainpic.src = transppixel;
				nextpic.src = transppixel;
				largepic.src = transppixel;
				
			},
	
	// ДЕЛАЙ ДВА
	// Задаём размеры картинок, выводим подписи или стираем подписи если их нет у новых картинок
	ShowNewSizes	:function()
			{
				var prevpic_width, prevpic_height, prevpic_subtitle, prevpic_title;
				var mainpic_width, mainpic_height, mainpic_subtitle, mainpic_title;
				var nextpic_width, nextpic_height, nextpic_subtitle, nextpic_title;
				
				// Определяем местоположение картинок

				var prevpic = document.getElementById("prevpic");
				var mainpic = document.getElementById("mainpic");
				var nextpic = document.getElementById("nextpic");
				var largepic = document.getElementById("largepic");
				
				
				// Определяем местоположение подписей к картинкам
				
				var prevpic_sub = document.getElementById("prevpic_title");
				var mainpic_sub = document.getElementById("mainpic_title");
				var nextpic_sub = document.getElementById("nextpic_title");
				var largepic_sub = document.getElementById("largepic_title");
				
				// Осуществляем предзагрузку изображений и информации об изображении
				
				// Большая картинка
				var largepic_width = this.SlideBox[this.SlideBoxPosition].LargePicWidth;
				var largepic_height = this.SlideBox[this.SlideBoxPosition].LargePicHeight;			
				var largepic_subtitle = this.SlideBox[this.SlideBoxPosition].Description;
				var largepic_subtitle_class = (this.SlideBox[this.SlideBoxPosition].Description == "") ? "big_image_signature_empty" : "big_image_signature";
				
				// Маленькие картинки
				if ((this.SlideBoxPosition-1) >= 0)
				{
					prevpic_width = this.SlideBox[this.SlideBoxPosition-1].SmallPicWidth;
					prevpic_height = this.SlideBox[this.SlideBoxPosition-1].SmallPicHeight;
					prevpic_subtitle = eval(this.SlideBoxPosition) + " / " + eval(this.GetSlideBoxSize());
					prevpic_title = this.SlideBox[this.SlideBoxPosition-1].Description;
				}
				else
				{
					prevpic_width = "170";
					prevpic_height = "152";
					prevpic_subtitle = "&nbsp;";
					prevpic_title = "Пустой слайд";
				}

				mainpic_width = this.SlideBox[this.SlideBoxPosition].SmallPicWidth; 
				mainpic_height = this.SlideBox[this.SlideBoxPosition].SmallPicHeight; 
				mainpic_subtitle = eval(this.SlideBoxPosition+1) + " / " + eval(this.GetSlideBoxSize());
				mainpic_title = this.SlideBox[this.SlideBoxPosition].Description;
				
				if ((this.SlideBoxPosition+1) <= (this.GetSlideBoxSize()-1))
				{
					nextpic_width = this.SlideBox[this.SlideBoxPosition+1].SmallPicWidth;
					nextpic_height = this.SlideBox[this.SlideBoxPosition+1].SmallPicHeight;
					nextpic_subtitle = eval(this.SlideBoxPosition+2) + " / " + eval(this.GetSlideBoxSize());
					nextpic_title = this.SlideBox[this.SlideBoxPosition+1].Description;
				}
				else
				{
					nextpic_width = "170";
					nextpic_height = "152";
					nextpic_subtitle = "&nbsp;";
					nextpic_title = "Пустой слайд";
				}
				
				// Выводим новые изображения
				
				largepic_sub.innerHTML = largepic_subtitle;
				largepic_sub.className = largepic_subtitle_class;
				largepic.width = largepic_width;
				largepic.height = largepic_height;
				largepic.title = largepic_subtitle;
				largepic.alt = largepic_subtitle;
				
				prevpic_sub.innerHTML = prevpic_subtitle;
				prevpic.height = prevpic_height;
				prevpic.width = prevpic_width;
				prevpic.title = prevpic_title;
				prevpic.alt = prevpic_title;
				
				mainpic_sub.innerHTML = mainpic_subtitle;
				mainpic.height = mainpic_height;
				mainpic.width = mainpic_width;
				mainpic.title = mainpic_title;
				mainpic.alt = mainpic_title;
								
				nextpic_sub.innerHTML = nextpic_subtitle;
				nextpic.height = nextpic_height;
				nextpic.width = nextpic_width;
				nextpic.title = nextpic_title;
				nextpic.alt = nextpic_title;	
			},
	// ДЕЛАЙ ТРИ
	// Выводим новые картинки
	ShowNewPictures	:function()
			{
				var prevpic_width, prevpic_height, prevpic_preload;
				var mainpic_width, mainpic_height, mainpic_preload;
				var nextpic_width, nextpic_height, nextpic_preload;				
				
				// Определяем местоположение картинок

				var prevpic = document.getElementById("prevpic");
				var mainpic = document.getElementById("mainpic");
				var nextpic = document.getElementById("nextpic");
				var largepic = document.getElementById("largepic");
				
				
				
				// Осуществляем предзагрузку изображений и информации об изображении
				
				// Большая картинка
				var largepic_width = this.SlideBox[this.SlideBoxPosition].LargePicWidth;
				var largepic_height = this.SlideBox[this.SlideBoxPosition].LargePicHeight;			
				var largepic_preload = new Image(largepic_width, largepic_height);
				largepic_preload.src = this.WorkingURL+this.SlideBox[this.SlideBoxPosition].LargePicFilename;
				
				// Маленькие картинки
				if ((this.SlideBoxPosition-1) >= 0)
				{
					prevpic_width = this.SlideBox[this.SlideBoxPosition-1].SmallPicWidth;
					prevpic_height = this.SlideBox[this.SlideBoxPosition-1].SmallPicHeight;
					prevpic_preload = new Image(prevpic_width, prevpic_height);
					prevpic_preload.src = this.WorkingURL+this.SlideBox[this.SlideBoxPosition-1].SmallPicFilename;

				}
				else
				{
					prevpic_width = "170";
					prevpic_height = "152";
					prevpic_preload = new Image(prevpic_width, prevpic_height);
					prevpic_preload.src = "/layout1/images/gallery/dummy_slide1.gif";
				}

				mainpic_width = this.SlideBox[this.SlideBoxPosition].SmallPicWidth; 
				mainpic_height = this.SlideBox[this.SlideBoxPosition].SmallPicHeight; 
				mainpic_preload = new Image(mainpic_width, mainpic_height);
				mainpic_preload.src = this.WorkingURL+this.SlideBox[this.SlideBoxPosition].SmallPicFilename;
				
				if ((this.SlideBoxPosition+1) <= (this.GetSlideBoxSize()-1))
				{
					nextpic_width = this.SlideBox[this.SlideBoxPosition+1].SmallPicWidth;
					nextpic_height = this.SlideBox[this.SlideBoxPosition+1].SmallPicHeight;
					nextpic_preload = new Image(nextpic_width, nextpic_height);
					nextpic_preload.src = this.WorkingURL+this.SlideBox[this.SlideBoxPosition+1].SmallPicFilename;
				}
				else
				{
					nextpic_width = "170";
					nextpic_height = "152";
					nextpic_preload = new Image(nextpic_width, nextpic_height);
					nextpic_preload.src = "/layout1/images/gallery/dummy_slide1.gif";
				}
				
				// Выводим новые изображения
				
				largepic.src = largepic_preload.src;
				prevpic.src = prevpic_preload.src;
				mainpic.src = mainpic_preload.src;
				nextpic.src = nextpic_preload.src;
			
			},
	
	UpdatePage	:function() //Эта функция вызывает три предыдущие с временнЫми задержками чтобы избежать искажения картинок
			{ 
				var self=this;
				setTimeout(function(){ self.ClearOld()}, 1);		// время ззадержек
				setTimeout(function(){ self.ShowNewSizes()}, 2);	// подбиралось 
				setTimeout(function(){ self.ShowNewPictures()}, 50);	// методом аналитической эклектики :-)
			},
			
	MoveSlideBoxPos	:function (i) //Перемещаем указатель слайдпроектора на i слайдов (i может быть и отрицательным)
			{
				if ((i != 0) && (this.PlayerRunning == false)) //если воспроизведение не происходит
				{
					if (i > 0) 
					{
						if ( this.SlideBoxPosition >= (this.GetSlideBoxSize()-1)) 
						{
							return;
						};
						this.SlideBoxPosition = ((this.SlideBoxPosition + i) >= (this.GetSlideBoxSize()-1)) ? (this.GetSlideBoxSize()-1) : (this.SlideBoxPosition + i);
					}
					else
					{
						if (this.SlideBoxPosition == 0)
						{
							return;
						};
						this.SlideBoxPosition = ((this.SlideBoxPosition + i) <= 0) ? 0 : (this.SlideBoxPosition + i);
					};
					this.UpdatePage();
				}
			},
	SetSlideBoxPos	:function (i) // Перемещаем указатель слайдпроектора на слайд i
			{
				if ((i >= 0) && (i <= (this.GetSlideBoxSize()-1)) && ( i!= this.SlideBoxPosition) && (this.PlayerRunning == false))
				{  //если i не выходит за границы коробки со слайдами, i не совпадает с текущим положением указателя и воспроизведение не происходит
					this.SlideBoxPosition = i;
					this.UpdatePage();
				}
			},
	PlayForward	:function()
			{
				if (this.SlideBoxPosition < (this.GetSlideBoxSize()-1))
				{ //Воспроизводим вперёд, если не достинут конец коробки со слайдами
					this.SlideBoxPosition++;
				}
				else
				{ // иначе переходим к началу коробки
					this.SlideBoxPosition=0;
				}
				this.UpdatePage();
			},
	PlayBackward	:function ()
			{
				if (this.SlideBoxPosition > 0)
				{ //Воспроизводим назад, если не достигнуто начало коробки со слайдами
					this.SlideBoxPosition--;
				}
				else
				{// иначе переходим к концу коробки
					this.SlideBoxPosition = this.GetSlideBoxSize()-1;
				}
				this.UpdatePage();
			},
	SetHandler	:function (mode)
			{// запускаем воспроизведение вперёд (mode = "PlayForward") или назад (mode = "PlayBackward")
				var self=this; //сохраняем объект во внутреннюю переменную - в этом ключ к успеху нашей авантюры :-)
				if ( this.PlayerRunning == false)
				{ // если воспроизведение не происходит то начинаем воспроизводить
					if (mode == "PlayForward")
					{
						this.PID = setInterval(function(){ self.PlayForward()}, this.PlayDelay);
					}
					if (mode == "PlayBackward")
					{
						this.PID = setInterval(function(){ self.PlayBackward()}, this.PlayDelay);
					}
					this.PlayerRunning = true;
				}
			},
	DropHandler	:function ()
			{ // останавливаем воспроизведение
				if ( this.PlayerRunning == true)
				{ //если оно происходит
					clearInterval(this.PID);
					this.PlayerRunning = false;
				}
			}
}