/*
  Универсальный скрипт "фильм", для создания профессиональных,
  визуальных фильмов.  Версия 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")		- определяются картинки, на которые будет проецироваться фильм

  # порядок появления картинок в наборах: default, random, select
 film.setDefaultOrderType(type)
 film.setOrderType(type)

  # порядок появления картинок в наборе при типе: select
 film.selectOrder(2,1,5,6,7)

 film.setFilter(12, 2)						- определяется фильтр для фильма
 film.playFilm()							- запускается фильм
 film.Stop();            -останавливает фильм
 film.SpoilLines(); - перепутывает между собой наборы в случайном порядке

*/

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.timeout;
      	this.numFilters = 1;   // кол-во использованных фильтров
        this.filters = new Array();     // фильтры
        this.flag_for_filter = new Array(); // 1 = фильтр уже использовался  
        this.default_filter_type = "default";
        this.filters_order_type;
	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;
        this.Stop = Film_Stop;
        this.SpoilLines = Film_SpoilLines;

	this.setFilterType = Film_SetFilterType;
        this.addToFiltersList = Film_AddToFiltersList;
        this.addFlagForFilter = Film_AddFlagForFilter;  
	this.addToFilters = Film_AddToFilters;
	this.clearFlagsFilter = Film_ClearFlagsFilter; 
	return this;
}


function Film_SpoilLines(){
  var i,rand;
  var temp = new Array();
  for(i=0; i<this.images.length; i++){
    do{
      rand = rnd(0,this.images.length-1)
    } while( rand == i );
    temp = this.images[i];
    this.images[i] = this.images[rand];
    this.images[rand] = temp;
  }
}


function Film_Stop(){
  clearTimeout(this.timeout);
}


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();
	}

        if( !this.filters_order_type) {
		alert("Popal");
                this.setFilterType();
	}

	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();
	}

        if( !this.filters_order_type) {
               this.setFilterType();
	}

	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;	// через сколько запускать этот метод снова, изменяется в зависимости от того, загружена линия или нет.
	var maxFilter = this.filters.length;
	

        if( this.lineComplete(this.playing_line) ){
		var num;	// порядковый номер появления картинки
		var tmp_arr = new Array(this.imagenames.length); // времменый массив, используемый для случайного порядка картинок, чтобы избежать повторения

                            switch ( this.filters_order_type ) {
                        	case 'default':
   					this.setFilter(12,1.35);
					break;
				case 'random': 
					   do{
				            num_filter = rnd(0,this.filters.length-1);
				            if (this.numFilters > maxFilter) {
                                              this.clearFlagsFilter();			
                                            }				      		
                                                                                       
					} while (this.flag_for_filter[num_filter]!=0);
					this.numFilters++;	
					this.flag_for_filter[num_filter]=1;
					this.setFilter(this.filters[num_filter][0],this.filters[num_filter][1]);
					break;
 				default:
					alert("playFilm: Неизвестный тип фильтра: "+this.filter_order_type[this.playing_line]);
				return false;       
                        }                           

		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;

			}

                this.timeout = 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);}


                  
function Film_SetFilterType (type){
        type = (!type) ? this.default_filter_type : type;
	if( type != 'default' && type != 'random'){
		alert("Неизвестный тип фильра: "+type);
        } 

        this.filters_order_type = type;
	return type;
}


function Film_AddToFilters (){
        var args = Film_AddToFilters.arguments;
        for (var i=0; i < (args.length); i+=2){
        this.addToFiltersList (args[i],args[i+1]);
        }
        this.setFilterType ("random");
        return true;	  
}
                            

function Film_AddToFiltersList (dr,tr){
	var filter = this.filters.length;
	this.filters[filter] = new Array();
	this.filters[filter][0] = dr;
	this.filters[filter][1] = tr; 
       	this.addFlagForFilter();
	return true; 
}

function Film_AddFlagForFilter (){
	var flag = this.flag_for_filter.length;
	this.flag_for_filter[flag]=0;
  	return true;
}

function Film_ClearFlagsFilter(){
      	var flag = this.flag_for_filter.length-1;
        for (i=0; i<=flag; i++){
           this.flag_for_filter[i]=0;
        } 
        this.numFilters = 1;
	return true;
}

