/**
 * Czat
 */
var Chat = {
	// Czas po którym użytkownik zostanie oznaczony jako nieaktywny w milisekundach.
	inactiveTime: 600,

	// Czasy odświeżania wiadomości w milisekundach.
	userRefreshTime: 3000,
	adminRefreshTime: 3000,

	// Okres czasu w sekundach z jakiego wiadomości będą pobierane (np. z ostatnich 10 sekund).
	userRefreshInterval: 10, // Nie zaimplementowane.
	adminRefreshInterval: 10,

	index: function() {
		jQr('#btnSend').click(function(){
			Chat._toUser();

			return false;
		});

		jQr('#messageEditor').keyup(function(e){
			if (e.keyCode == 13 && jQr('#autoEnter').is(':checked')) {
				 Chat._toUser(jQr(this).val());
			}
		});

		// Odświeżaj listę wiadomości i użytkowników.
		Chat._refresh();

		setInterval('Chat._refresh()', Chat.userRefreshTime);
	},

	admin_index: function() {
		jQr('#btnSend').click(function(){
			Chat._toUser();

			return false;
		});

		jQr('#messageEditor').keyup(function(e){
			Chat._newMessage(false);

			if (e.keyCode == 13 && jQr('#autoEnter').is(':checked')) {
				Chat._toUser(jQr(this).val());
			}
		});

		// Otwieranie prywatnej rozmowy z użytkownikiem.
		jQr('.users .openPrivate').live('click', function() {
			Chat._newMessage(false);

			// Zaznacz użytkownika.
			jQr('.users .openPrivate').removeClass('active');
			jQr(this).addClass('active').removeClass('newMessage');

			// Ukryj zakładki.
			jQr('.privateTab').hide();

			var privateTab = jQr('#privateTab' + jQr(this).attr('id').substr(1));

//			alert(jQr(this).attr('href'));
//			alert(jQr(this).attr('id').substr(1));

			// Otwórz zakładkę, jeżeli istnieje.
			if (privateTab.length == 1) {
				privateTab.show();
			}
			// Dodaj nową zakładkę.
			else {
				jQr('.messages').append('<div id="privateTab' + jQr(this).attr('id').substr(1) + '" class="privateTab"></div>');
			}

			return false;
		});

		// Wyloguj żytkownika.
		jQr('.users .logoutUser').live('click', function() {
			// Wyloguj uzytkownika.
			// Musi być var! Inaczej zmienne będą globalne!
			var id = jQr(this).attr('href').substr(4);
			jQr.post('chat.php?action=logout-user', { iduser: id });

//			jQr('#u' + id).remove();
//			jQr('#uOut' + id).remove();

			// Jedno wywołanie zamiast wielu. Bez ponownego przeszukiwania.
			jQr(this).parent().remove();

			// Zakładka z wiadomościami.
			jQr('#privateTab' + id).remove();

			return false;
		});

		// Odświeżaj listę wiadomości z ostatniej godziny i użytkowników.
		Chat._adminRefresh(3600);

		// Odświeżaj listę wiadomości z ostatnich 10 sekund i użytkowników.
		setInterval('Chat._adminRefresh(' + Chat.adminRefreshInterval + ')', Chat.adminRefreshTime);
	},

	_toUser: function() {
		var tab = jQr('.privateTab:visible');

		if (tab.length == 1) {
			var params = {
				// Brak odbiorcy, jeżeli zwykły użytkownik.
				id_receiver: tab.attr('id').replace('privateTab', '') || 0,
				// Treść wiadomości.
				message: jQr('#messageEditor').val()
			};

			jQr.post('chat.php?action=send', params, function(data) {
				if (data.status == 'OK') {
					jQr('#messageEditor').val('');
				}
			}, 'json');
		}
	},

	_write: function(tab, message) {
		tab.append(
			jQr('<p class="entry">' + message + '</p>').hide().fadeIn('slow')
		);
	},

	_errorPrinted: false,

	_refresh: function() {
		jQr.post('chat.php?action=refresh', { }, function(data) {

			if (data.status == 'OK') {

				// Jeżeli wiadomość jest na liście, to ja wyświetl,
				// w przeciwnym razie dodaj nową wiadomość.
				for (var j = 0; j < data.messages.length; ++j) {
//				for (var j in data.messages) {
					var message = jQr('.privateTab #m' + data.messages[j].id_message);

					if (message.length == 0) {
						var tab = jQr('.privateTab');

						tab.append('<div id="m' +
							data.messages[j].id_message + '" class="entry ' + data.messages[j].role + '"><p><span class="login">' +
							data.messages[j].login + '</span> - ' +
							data.messages[j].date + '</p><p>' +
							data.messages[j].content + '</p></div>'
						);

						// Przewiń listę wiadomości na dół.
						tab.animate({scrollTop: tab.attr('scrollHeight')}, 1000);
					}
				}

			}
			else {

				if (Chat._errorPrinted == false) {
					Chat._write(jQr('.privateTab'), data.message);
					Chat._errorPrinted = true;
				}
			}
		}, 'json');
	},

	_adminRefresh: function(time) {
		time = time || 0;

		jQr.post('chat.php?action=admin-refresh', { time: time }, function(data) {

			if (data.status == 'OK') {

				if (data.users.length == 0)
					Chat._newMessage(false);

				// Odśwież listę użytkowników.
				jQr('.users div').hide();
				jQr('.users .openPrivate .logoutUser').hide();

				// Jeżeli użytkownik jest na liście, to go wyświetl,
				// w przeciwnym razie dodaj nowego użytkownika.
				var user = null;
				var i = 0;
				var j = 0;

				for (i = 0; i < data.users.length; ++i) {
//				for (var i in data.users) {
					user = jQr('.users a[id="u' + data.users[i].id_user + '"]');

					if (user.length == 1) {
						user.parent().show();
					}
					else {
						user = jQr('.users').append('<div><a id="u' +
							data.users[i].id_user + '" class="openPrivate" href="#privateTab' +
							data.users[i].id_user + '">' +
							data.users[i].login + '</a> | <a id="uOut'+
							data.users[i].id_user + '" class="logoutUser" href="#out' +
							data.users[i].id_user + '">wyloguj</a></div>'
						);
					}

					// Jeżeli użytkownik nie jest aktywny przez 10 min.,
					// oznacz go inna klasą.
					if (data.users[i].inactive_time > Chat.inactiveTime) {
						user.addClass('inactive');
					}
					else {
						user.removeClass('inactive');
					}
				}

				// Odśwież listę wiadomości.
				//
				// Jeżeli wiadomość jest na liście, to ja wyświetl,
				// w przeciwnym razie dodaj nową wiadomość.
				var soundPlayed = false;

				for (j = 0; j < data.messages.length; ++j) {
//				for (var j in data.messages) {
					var tab = jQr('#privateTab' + data.messages[j].id_user);
					user = jQr('.users #u' + data.messages[j].id_user);

					if (user.length == 1 && tab.length == 0) {
						jQr('.messages').append(jQr('<div id="privateTab' + data.messages[j].id_user + '" class="privateTab"></div>').hide());
					}

					var message = jQr('#privateTab' + data.messages[j].id_user + ' #m' + data.messages[j].id_message);

					if (message.length == 0) {
						tab = jQr('#privateTab' + data.messages[j].id_user);

						tab.append('<div id="m' +
							data.messages[j].id_message + '" class="entry ' + data.messages[j].role + '"><p><span class="login">' +
							data.messages[j].login + '</span> - ' +
							data.messages[j].date + '</p><p>' +
							data.messages[j].content + '</p></div>'
						);

						// Przewiń listę wiadomości na dół.
						tab.animate({ scrollTop: tab.attr('scrollHeight') }, 1000);

						// Zaznacz użytkownika, który dostał nową wiadomość,
						// jeżeli jego okno rozmowy nie jest widoczne.
						if (tab.is(':visible') == false) {
							jQr('.users a[id="u' + data.messages[j].id_user + '"]').addClass('newMessage');
						}

						// Powiadom pracownika.
						if (data.users.length > 0 && data.messages[j].role == 'GUEST') {
							Chat._newMessage(true);
						}

						if (soundPlayed == false) {
							soundPlayed = true;

							Chat._playSound();
						}
					}
				}
			}
			else {
				Chat._newMessage(false);
			}
		}, 'json');
	},

	_flashEnabled: false,
	_timerId: 0,

	_newMessage: function(enable) {
		if (enable == true) {
			if (Chat._flashEnabled == false) {
				Chat._flashEnabled = true;

				Chat.timerId = setInterval('Chat._flashTitle()', 1000);
			}
		}
		else if (enable == false) {
			clearInterval(Chat.timerId);

			document.title = '8a.pl';

			Chat._flashEnabled = false;
		}
	},

	_flashTitle: function() {
		if (document.title == '8a.pl')
			document.title = 'Nowa wiadomość!';
		else
			document.title = '8a.pl';
	},

	_playSound: function() {
		jQr('#chatSound').remove();
		jQr('body').append(
			'<embed id="chatSound" src="' + 'wav/chat1.mid" type="application/x-mplayer2" autostart="1" playcount="1" height="0" width="0" />'
		);
	}
}

