/*
* 1. Standalone:
* 	1.1. Создание плеера: если плеер не создан.
* 	1.2. Закритие плеера (в данном случае - всего окна): если установлен флаг закрытия в куке.
	1.3. Восстановление состояний:
		1.3.1. Проигрывание, трек и позицию: если последнее состояние в куке было PLAYING (при первом запуске).
		1.3.2. Mute: если в куке было PLAYING, то только после восстановления позиции (при первом запуске), иначе - всегда.
		1.3.3. Уровень звука из куки всегда.
	1.4. Обновление плейлиста: если установлен флаг обновления в куке.
	1.5. Запись в куку состояний (только если текущий идент соответствует куке и плеер создан):
		1.5.1. Рефрешим короткую куку с ctPlayerTitle.
		1.5.2. Статус, номер трека, позицию трека, громкость, мьют - длинные куки.

2. Обычный плеер на страницах:
	2.1. Создание плеера:
		2.1.1. Если плеер не создан + ctPlayerTitle пустой
		2.1.2. Если нажимаем на кнопень "отобразить плеер" (плейсхолдер). Тут же ставим куку "убить все плееры" кроме своего.
	2.2. Закрытие плеера (убийство плеера и отображение плейсхолдера)
		2.2.1. Если установлен флаг "убить все плееры" и идент не соответствует текущему.
		2.2.2. Если нажали на линку трека с открытием Standalone
	2.3. Восстановление состояний (только если ctPlayerTitle соосветствует иденту):
		2.3.1. Проигрывание, трек и позицию: если последнее состояние в куке было PLAYING (при первом запуске).
		2.3.2. Mute: если в куке было PLAYING, то только после восстановления позиции (при первом запуске), иначе - всегда.
		2.3.3. Уровень звука из куки всегда.
	2.4. Обновление плейлиста: если кликнули по какому-то треку.
	2.5. Запись в куку состояний (только если текущий идент соответствует куке и плеер создан):
		2.5.1. Рефрешим короткую куку с ctPlayerTitle.
		2.5.2. Статус, номер трека, позицию трека, громкость, мьют - длинные куки.
* */

var CtPlayer = Class.create(CtComponent_Abstract, {


	init: true,
	changeItem: true,
	pe: null,

	placeholder: null,


	initialize: function() {
		this.id = ctPlayer.id;
		this.element = ctPlayer.element;

		var buttons = $$('body')[0].select('a.ctPlayer-play');
		for (var i = 0; i < buttons.length; i++) {
			try {
				var parameters = buttons[i].readAttribute('rel').evalJSON();
				buttons[i].writeAttribute('rel', null);
				buttons[i].observe('click', this.clickHandler.bindAsEventListener(this, parameters));
			} catch (ex) {
				//				e(ex);
			}
		}
		this.placeholder = $('ctPlayer-loader');
		if (this.placeholder) {
			this.placeholder.observe('click', function() {
				this.init = true;
				this.placeholder.hide();
				setCookie('ctPlayerClose', ctPlayer.title, ctPlayer.cookieLong, ctPlayer.cookiePath);
			}.bindAsEventListener(this));
		}

		CtPage.addComponent(this);

//		this.playerCreate();
		this.pe = new PeriodicalExecuter(this.listener.bindAsEventListener(this), 0.5);
	},


	clickHandler: function(event, parameters) {
		var request = CtPage.getRequest(this.id, 'ajax');
		request.url = '/player';
		request.options.parameters = parameters;
		request.send();
	},


	refresh: function(response) {
		if (response && response.json && response.json.messages && response.json.messages.length == 0) {
			/* Если у нас в фоне играет standalone плеер, то просто ставим куку для того, чтобы этот плеер перезагрузил свой плейлист, иначе перезагружаем плейлист в текущем плеере */
			if (getCookie('ctPlayerTitle') == 'standalone') {
				setCookie('ctPlayerRefresh', true, ctPlayer.cookieLong, ctPlayer.cookiePath);
				setCookie('ctPlayerItem', 0, ctPlayer.cookieLong, ctPlayer.cookiePath);
			} else if (ctPlayer.element && ctPlayer.element.sendEvent) {
				ctPlayer.element.sendEvent("ITEM", 0);
				ctPlayer.element.sendEvent("LOAD", ctPlayer.file);
			}
		}
	},


	playerCreate: function() {
		if (this.placeholder && this.placeholder.hide) {
			this.placeholder.hide();
		}

		var flashvars = {
			id: ctPlayer.id,
			file: ctPlayer.file,
			playerOpenAsStandalone: (ctPlayer.title == 'standalone'),
//			file: "/js/ctPlayer/asx.xml",
			config: ctPlayer.config

		};
		var params = {
			allowfullscreen: 'false',
			allowscriptaccess: 'always'
		};
		var attributes = {
			title: ctPlayer.title
		};
		swfobject.embedSWF("/js/ctPlayer/swf/player.swf", 'ctPlayer', 440, 80, "9", '/js/expressInstall.swf', flashvars, params, attributes);
	},

	playerDestroy: function() {
		ctPlayer.element = null;
		ctPlayer.ready = false;
		this.init = true;
		var player = $(ctPlayer.id);
		if (player && player.remove) {
			player.remove();
			$('ctPlayer-container').insert({top: new Element('div', {id: 'ctPlayer'})});
		}
		this.placeholder.show();
	},

	standalonePlayerDestroy: function() {
		ctPlayer.element = null;
		ctPlayer.ready = false;
		this.init = true;
		ctPlayer.element = $(ctPlayer.id);
		var player = $(ctPlayer.id);
		if (player && player.remove) {
			player.remove();
			this.pe.stop();
		}
		try {
			window.close();
		} catch (ex) {

		}
	},

	listener: function() {
		ctPlayer.cookieLong = new Date(); ctPlayer.cookieLong.setMinutes(ctPlayer.cookieLong.getMinutes() + 20);
		ctPlayer.cookieShort = new Date(); ctPlayer.cookieShort.setSeconds(ctPlayer.cookieShort.getSeconds() + 2);

		var ctPlayerClose = getCookie('ctPlayerClose');
		var ctPlayerState = getCookie('ctPlayerState');
		var ctPlayerTime = getCookie('ctPlayerTime') || 0;
		var ctPlayerItem = getCookie('ctPlayerItem') || 0;
		var ctPlayerItemFile = getCookie('ctPlayerItemFile') || '';
		var ctPlayerVolume = getCookie('ctPlayerVolume') || ctPlayer.volume;
		var ctPlayerMute = getCookie('ctPlayerMute') || ctPlayer.mute;

		if (ctPlayer.title == 'standalone') {
			setCookie('ctPlayerTitle', ctPlayer.title, ctPlayer.cookieShort, ctPlayer.cookiePath);

			if (ctPlayer.element === false) {
				return;
			}
			if (!ctPlayer.element && this.init) {
				ctPlayer.element = false;
				this.playerCreate();
				return;
			}

			if (!ctPlayer.element) {
				return;
			}

			if (ctPlayerClose) {
				this.standalonePlayerDestroy();
				return;
			}

			var ctPlayerRefresh = getCookie('ctPlayerRefresh') || 0;
			if (ctPlayerRefresh) {
				delCookie('ctPlayerRefresh', ctPlayer.cookiePath);
				ctPlayer.element.sendEvent("LOAD", ctPlayer.file);
				return;
			}

		} else {
			var ctPlayerTitle = getCookie('ctPlayerTitle');
//e(' ');
//e('-----------------------------------------------------------------------');
//e('ctPlayerTitle', ctPlayerTitle);
//e('anotherPlayerExists', !!((ctPlayerClose && ctPlayerClose != ctPlayer.title) || ctPlayerTitle == 'standalone'));
//e('playerDestroy', !!(((ctPlayerClose && ctPlayerClose != ctPlayer.title) || ctPlayerTitle == 'standalone') && ctPlayer.element));

			if (ctPlayerTitle && ctPlayerTitle != ctPlayer.title) {
				return;
			}

			if ((ctPlayerClose && ctPlayerClose != ctPlayer.title) || ctPlayerTitle == 'standalone') {
				if (ctPlayer.element) {
					this.playerDestroy();
				}
				return;
			}
			delCookie('ctPlayerClose', ctPlayer.cookiePath);


//e('playerElement', ctPlayer.element);
//e('this.init', this.init);
//e('playerCreate', !!(!ctPlayer.element && this.init && ctPlayerTitle != 'standalone'));
			if (ctPlayer.element === false) {
				return;
			}
			if (!ctPlayer.element && this.init && ctPlayerTitle != 'standalone') {
				ctPlayer.element = false;
				setCookie('ctPlayerTitle', ctPlayer.title, ctPlayer.cookieShort, ctPlayer.cookiePath);
				this.playerCreate();
				return;
			}

//e('playerLink', !!ctPlayer.link);
			if (ctPlayer.link) {
				this.placeholder.show();
				ctPlayer.link = false;
				window.open("/player/standalone.html", "Player","location=0,status=0,scrollbars=0,width=490,height=120");
				return;
			}

			setCookie('ctPlayerTitle', ctPlayer.title, ctPlayer.cookieShort, ctPlayer.cookiePath);
		}

//e('playerReady', !!(ctPlayer.ready));
		if (!ctPlayer.ready) {
			return;
		}

		if (this.init) {
			if (ctPlayerItem && ctPlayerState != 'IDLE' && this.changeItem) {
				if (ctPlayer.playlist[ctPlayerItem].file == ctPlayerItemFile) {
					ctPlayer.element.sendEvent("ITEM", ctPlayerItem);
				} else {
					ctPlayer.element.sendEvent("STOP", true);
				}
				this.changeItem = false;
				return;
			}

//e('restoreTime', ctPlayerTime);
//e('ctPlayerState', ctPlayerState);
			if (ctPlayerState && (ctPlayerState == 'PLAYING' || ctPlayerState == 'BUFFERING')) {
				ctPlayer.element.sendEvent("SEEK", ctPlayerTime);
			} else {
				ctPlayer.element.sendEvent("STOP", true);
			}
//
//e('restoreMute', ctPlayerMute);
//e('restoreVolume', ctPlayerVolume);
			ctPlayer.element.sendEvent("VOLUME", ctPlayerVolume);

			if (ctPlayerState == 'IDLE') {
				ctPlayer.element.sendEvent("MUTE", false);
			} else {
				ctPlayer.element.sendEvent("MUTE", ctPlayerMute);
			}

			this.init = false;
		}

		setCookie('ctPlayerState', ctPlayer.state, ctPlayer.cookieLong, ctPlayer.cookiePath);
		setCookie('ctPlayerMute', ctPlayer.mute, ctPlayer.cookieLong, ctPlayer.cookiePath);
		setCookie('ctPlayerVolume', ctPlayer.volume, ctPlayer.cookieLong, ctPlayer.cookiePath);
		setCookie('ctPlayerItem', ctPlayer.item, ctPlayer.cookieLong, ctPlayer.cookiePath);
		setCookie('ctPlayerItemFile', ctPlayer.itemFile, ctPlayer.cookieLong, ctPlayer.cookiePath);
		setCookie('ctPlayerTime', ctPlayer.time, ctPlayer.cookieLong, ctPlayer.cookiePath);
	}
});

Event.observe(document, 'dom:loaded', function() {
	ctPlayer.object = new CtPlayer();
});



var dateNow = new Date();
var ctPlayer = {
	object: null,
	ready: false,
	element: null,
    time: 0,
    item: 0,
    itemFile: '',
    volume: 90,
	stateOld: 'IDLE',
	state: 'IDLE',
	mute: true,
    playlist: [],
	openLink: false,

	id: 'ctPlayer',
	title: (document.location.href.indexOf('/player/standalone.html') !== -1) ? 'standalone' : 'ctPlayer' + dateNow.getHours() + dateNow.getMinutes() + dateNow.getSeconds() + dateNow.getMilliseconds(),
	config: '/player/config.html',
	file: '/player/playlist.html',

	cookieShort: null,
	cookieLong: null,
	cookiePath: '/'

};

var playerReady = function(event) {
	ctPlayer.element = $(event['id']);
	setTimeout(function() {ctPlayer.ready = true;}, 500);
	ctPlayer.element.addControllerListener('ITEM', 'ctPlayerListenerItem');
	ctPlayer.element.addControllerListener('PLAYLIST', 'ctPlayerListenerPlaylist');
    ctPlayer.element.addControllerListener('MUTE', 'ctPlayerListenerMute');
    ctPlayer.element.addControllerListener('VOLUME', 'ctPlayerListenerVolume');
	ctPlayer.element.addModelListener('STATE', 'ctPlayerListenerState');
	ctPlayer.element.addModelListener('TIME', 'ctPlayerListenerTime');
};
var ctPlayerListenerPlaylist = function(event) {ctPlayer.playlist = event.playlist;};
var ctPlayerListenerItem = function(event) {ctPlayer.item = event.index; ctPlayer.itemFile = ctPlayer.playlist[ctPlayer.item].file};
var ctPlayerListenerState = function(event) {ctPlayer.state = event.newstate; ctPlayer.stateOld = event.oldstate;};
var ctPlayerListenerTime = function(event) {ctPlayer.time = event.position;};
var ctPlayerListenerVolume = function(event) {ctPlayer.volume = event.percentage;};
var ctPlayerListenerMute = function(event) {ctPlayer.mute = event.state;};

var playerDeletePlaylistItem = function(jsonString) {
	try {
		var json = jsonString.evalJSON(true);
	} catch (ex) {
		return;
	}
	var request = new CtRequest_Ajax('deletePlaylist', Prototype.emptyFunction);
	request.url = '/player';
	json.del = 1;
	request.options.parameters = json;
	request.send();
};
var playerOpenStandalone = function() {
	ctPlayer.link = true;
	$(ctPlayer.id).remove();
	ctPlayer.element = null;
	ctPlayer.ready = false;
	$('ctPlayer-container').insert({top: new Element('div', {id: 'ctPlayer'})});
};
var playerCloseStandalone = function() {
//	ctPlayer.object.init = true;
//	setCookie('ctPlayerClose', ctPlayer.title, ctPlayer.cookieLong, ctPlayer.cookiePath);
//	window.close();
};

CtPage.registerScript("CtPlayer");