//  Универсальный скрипт "фильм", для создания профессиональных, визуальных фильмов.
//  Версия 1.2
//  © 2001 Олег Бугримов, Данила Кольцов и Сергей Севастьянов из веб-студии Promarket.
//
//   film = new Film("film") 						- создается объект "фильм"
//   film.setPeriodBeforeLine(period)			- устанавливает период перед показом линии, которая будет создана
//   film.setGlobalPeriodBetweenLines(period) - общий период между линиями	
//   film.setGlobalPeriodBetweenImages(period)	- устанавливает период между показами картинок в одной линии
//   film.addLine("1.gif", "2.gif", "3.gif")			- добавляется набор картинок для очередного прохода
//   film.addCurrentLine()						- добавляется набор картинок для очередного прохода из текущего отображаемого набора
//   film.setImages("im1", "im2", "im3")		- определяются картинки, на которые будет проецироваться фильм
//   film.setFilter(12, 2)						- определяется фильтр для фильма
//   film.playFilm()							- запускается фильм

function Film(name){
	if( ! name) { alert("Нужно передать имя объекта."); return false }
	// properties
	this.objname = name;		// имя объекта
	this.images = new Array(); 	// хранит объекты картинок
	this.order_type	= new Array();	// хранит тип порядка появления картинок: default, random, select
	this.order	= new Array();	// хранит порядок появления картинок для типа select
	this.default_order_type = 'default';
	this.IE = (navigator.appName.charAt(0)=='M' && navigator.appVersion.charAt(0) > 3) ? true : false;	// IE это или нет?
	this.imagenames = new Array();	// массив имен картинок, на которых показывается фильм
	this.transition = 12;
	this.duration = 1.35;
	this.playing_line = 0;		// линия, с которой начинает свой показ метод playFilm()
	this.repeatFilmsPeriod = 0;	// дополнительный период  между фильмами
	this.debug = 0;			// если =1 то выдаются предупреждающие сообщения
	this.prefix = '';
	this.sufix = '';

	this.period_before_line = new Array();
	this.global_period_between_images = 0;
	this.global_period_between_lines = 0;

	// methods
	this.addLine = addLine;
	this.addCurrentLine = addCurrentLine;
	this.lineComplete = lineComplete;
	this.playFilm = playFilm;
	this.setImages = setImages;
	this.setFilter = setFilter;
	this.setPeriodBeforeLine = setPeriodBeforeLine;
	this.setGlobalPeriodBetweenImages = setGlobalPeriodBetweenImages;
	this.setGlobalPeriodBetweenLines = setGlobalPeriodBetweenLines;
	this.setOrderType = setOrderType;
	this.setDefaultOrderType = setDefaultOrderType;
	this.selectOrder = selectOrder;
	return this;
}

function selectOrder(){
	var line = this.images.length;
	if( this.imagenames.length != selectOrder.arguments.length ){
		alert('selectOrder: неправильное количество аргуметов, каждый аргумент должен соответствовать одной картинке.');
		return false;
	}
	this.order[line] = new Array();
	for(var i=0; i<selectOrder.arguments.length; i++){
		this.order[line][i] = selectOrder.arguments[i];
	}
	return true;
}

function setDefaultOrderType(type){
	this.default_order_type = type;
	return true;
}

function setOrderType(type){
	type = (!type) ? this.default_order_type : type;
	if( type != 'default' && type != 'random' && type != 'select' ){
		alert("setOrder: Неизвестный тип порядка появления картинок: "+type);
	}
	this.order_type[this.images.length] = type;
	return true;
}

function setPeriodBeforeLine(period){
	this.period_before_line[this.images.length] = period;
	return true;
}

function setGlobalPeriodBetweenImages(period){
	this.global_period_between_images = period;
	return true;
}

function setGlobalPeriodBetweenLines(period){
	this.global_period_between_lines = period;
	return true;
}

function setFilter(transition, duration){
	this.transition = transition;
	this.duration = duration;
	return true;
}

function setImages(){
	for(var i=0; i<setImages.arguments.length; i++){
		this.imagenames[i] = setImages.arguments[i];
	}
	return true;
}

function addLine(){ // метод добавления очередного прохода картинок
	if( addLine.arguments.length != this.imagenames.length ){
		alert("addLine: Количество указанных адресов не соответствует количеству картинок!");
		return false;
	}
	var line = this.images.length;
	if( ! this.order_type[line] ){
		this.setOrderType();
	}
	this.images[line] = new Array();
	for(var i=0; i < addLine.arguments.length ; i++){
		this.images[line][i] = new Image();
		this.images[line][i].src = this.prefix+addLine.arguments[i]+this.sufix;
	}

	return true;
}

function addCurrentLine(){ // метод добавления очередного прохода картинок 
	var line = this.images.length;
	if( ! this.order_type[line] ){
		this.setOrderType();
	}
	this.images[line] = new Array();
	for(var i=0; i < this.imagenames.length ; i++){
		this.images[line][i] = new Image();
		this.images[line][i].src = eval("document."+this.imagenames[i]+".src");
	}

	return true;
}

function lineComplete(line){
	if( line >= this.images.length ){ alert("lineComplete: линии с номером "+line+" не существует."); return false }
	for(var i=0; i < this.images[line].length; i++){
		if( ! this.images[line][i].complete ){
			if( this.debug ){
				window.status = "Не загружается картинка: "+this.images[line][i].src;
			}
			return false;
		}
	}
	return true;
}

function playFilm(){
	if( playFilm.arguments.length >0 ) { alert("Функции playFilm() не нужны параметры"); return false }
	var theperiod = 500;	// через сколько запускать этот метод снова, изменяется в зависимости от того, загружена линия или нет.
	if( this.lineComplete(this.playing_line) ){
		var num;	// порядковый номер появления картинки
		var tmp_arr = new Array(this.imagenames.length); // времменый массив, используемый для случайного порядка картинок, чтобы избежать повторения
		for(var i=0; i < this.imagenames.length; i++){
			switch ( this.order_type[this.playing_line] ) { 
				case 'default':
					num = i;
					break;
				case 'random': 
					do{
						num = rnd(0,this.imagenames.length-1);
					} while( tmp_arr[num] );
					tmp_arr[num] = true;
					break;
				case 'select':
					num = this.order[this.playing_line][i];
					break;
				default:
					alert("playFilm: Неизвестный тип порядка появления картинок: "+this.order_type[this.playing_line]);
				return false;
			}
			setTimeout('playFilter('+this.IE+',document.'+this.imagenames[i]+', "'+this.images[this.playing_line][i].src+'", '+this.duration+', '+this.transition+')', num*this.global_period_between_images);
		}
		if(this.playing_line >= this.images.length-1){
			this.playing_line = 0;
			theperiod = this.repeatFilmsPeriod;
		} else {
			this.playing_line++;	
			theperiod = 0;
		}
		theperiod += (this.period_before_line[this.playing_line] > 0) ? this.period_before_line[this.playing_line] : this.global_period_between_lines;
		theperiod += this.imagenames.length*this.global_period_between_images;
	}
	setTimeout(this.objname+".playFilm()",  theperiod);
	return true;
}

function playFilter(IE, img, src, duration, transition){
	if(  IE ){
		if( img.filters.item(0).status == 2 ){
			return false;
		}
		img.filters.item(0).Duration = duration;
		img.filters.item(0).Transition = transition;
		img.filters.item(0).Apply();
	}
	img.src = src;
	if( IE ){ 
		img.filters.item(0).Play();
	}
	return true;
}
function rnd(c, x){var therange = x-c+1;	return (Math.floor(Math.random() * Math.pow(10,("" + therange).length)) % therange) + parseInt(c);}

