soundManager.debugMode = false; // disable debug mode
soundManager.flashVersion = 9;
soundManager.url = '/static/js/sound/swf/';
soundManager.useHighPerformance = true;
soundManager.useConsole = false;
soundManager.defaultOptions.multiShot = true;
soundManager.onload = function(){
	var sound = soundManager.createSound({
		id: 'twttr',
		url: '/static/js/audio/logout.mp3'
	});
};

var log = function(){
	if (window.console && typeof window.console.log == 'function'){
		console.log(arguments);
	}
};

var utils = {
	uuid: function(){
		var s = [];
		var itoh = String('0123456789ABCDEF');
		var i;
		for (i = 0; i < 36; i++) {
			s.push(Math.floor(Math.random() * 0x10));
		}
		s[14] = 4;  // Set 4 high bits of time_high field to version
		s[19] = (s[19] & 0x3) | 0x8;
		for (i = 0; i <36; i++){
			s[i] = itoh.charAt(s[i]);
		}
		s[8] = s[13] = s[18] = s[23] = '-';
		return s.join('');
	},
	escapeHtml: function (html){
		return html.replace(/&/gmi, '&amp;').replace(/"/gmi, '&quot;').replace(/>/gmi, '&gt;').replace(/</gmi, '&lt;');
	},
	scrollDown: function(){
		window.scrollBy(0, 100000000000000000);
	},
	isBlank: function(text){
		var blank = /^\s*$/;
        return (text.match(blank) !== null);
	}
};

var psm = {
	inChat: false,
	glob: {
		init: function(){
			$('#sound_change_link').click(function(){
				if($('#sound_state').text() == 'Звук включен'){
					//выключаем
					soundManager.getSoundById('twttr').mute();
					$('#sound_img').attr({'src':'/static/img/sound_mute.png'});
					$('#sound_change_link').text('Включить звук');
					$('#sound_state').text('Звук выключен');
				}else{
					//включаем
					soundManager.getSoundById('twttr').unmute();
					$('#sound_img').attr({'src':'/static/img/sound.png'});
					$('#sound_state').text('Включить звук');
					$('#sound_change_link').text('Выключить звук');
					$('#sound_state').text('Звук включен');
				}
				return false;
			});
		}
	},
	home: {
		init: function(){
			$('#start').click(function(){
				psm.wait.init();
			});
			
			/*
			//detect if we can create streamed connection
			var begin = new Date();
			$.ajax({
				url: '/detect/',
				cache: false,
				dataType: 'json',
				type: 'GET', 
				success: function(data){
					if ((new Date() - begin < 3000) && (data.answer == 42)){
						alert('Извините, к сожалению ваша конфигурация сети и программного обеспечения не позволяет использовать наш чат. Попробуйте отключить антивирус');
					}
				}
			});
			*/
		}
	},
	wait: {
		inWait: false,
		init: function(){
			if (!psm.wait.inWait){
				psm.wait.inWait = true;
				$('#prelog').hide();
				$('#messages').empty();
				$('#postlog').show();
				$('#disconnect_btn').attr({'disabled':'disabled'});
				$('#status_select').attr({'disabled':'disabled'});
				$('#progressbar').show();
				psm.wait.getPartner();
			}
		},
		getPartner: function(){
			psm.chat.uid = utils.uuid();
			$.ajax({
				url:'/get_partner/'+psm.chat.uid+'/',
				dataType: 'json',
				type: 'GET',
				cache: false,
				success: function(data){
					log('get partner data>>', data);
					psm.chat.partner = data.partner;
					psm.chat.init();
				}
			});
		}
	},
	chat: {
		uid: null,
		typingFlag: false,
		lastTypingTime: null,
		receiveTyping: function(){
			$('#partner_typing').html('Собеседник печатает...');
		},
		receiveStopTyping: function(){
			$('#partner_typing').html('');
		},
		showMyMessage: function(message){
			var nick = '<div class="msg_to"><span class="name">Я:<\/span>';
			$('#messages').append(nick+utils.escapeHtml(message+'')+'<\/div>');
			$('#messages').scrollTop(100000000);
		},
	    showMessage: function(message) {
			var nick = '<div class="msg_from"><span class="name">Некто:<\/span>';
			$('#messages').append(nick+message+'<\/div>');//we don't escape it there: it's already done on server
			$('#messages').scrollTop(100000000);
	    },
		newMessages: function(data){
			if (data && (data.users_count !== undefined)){
				$('#online').html(data.users_count);
			}
			if (data.disconnected){
				if (psm.inChat){
					psm.disconnect.init('partner');
				}
				return;
			}else if(data.reconnect){
				return
			}else{
				for (var i = 0; i < data.messages.length; i++) {
					if (data.messages[i].type == 'system'){
						switch(data.messages[i].msg){
							case 'disconnect': psm.disconnect.init('partner');
											   return;
							case 'typing': psm.chat.receiveTyping();
							break;
							case 'stop_typing': psm.chat.receiveStopTyping();
							break;
						}					
					}else{
						soundManager.play('twttr');
						psm.chat.showMessage(data.messages[i].msg);
					}
				}			
			}
		},
		init: function(){
			psm.inChat = true;
			psm.chat.lastTypingTime = new Date();
			$('#progressbar').hide();
			$('#disconnect_btn').attr({'disabled':''});
			
			$('#disconnect_btn').click(function(){
				if (confirm("Вы действительно хотите прервать беседу?")){
					psm.disconnect.init('i');
				}
			});
			var e_keypress = jQuery.Event("keypress");
			e_keypress.which = 13;
		
			$('#submit_btn').click(function(){
				if($('#text').val() != ""){
					$('#text').trigger(e_keypress);
				}
			});
			
			$("#text").keypress(function (e) {
				if (e.which === 13) {
					e.preventDefault();
					var msg = $("#text").attr("value");
					if (!utils.isBlank(msg)) {
						psm.msgqueue.addMsg(msg);
					}
					$("#text").attr("value", "");
				}else{
					if (e.which !== 0){
						if (!psm.chat.typingFlag){
							psm.chat.typingFlag = true;
							psm.msgqueue.addSystemMsg('typing');
						}
						psm.chat.lastTypingTime = new Date();
					}
				}
		    });
		    
			psm.chat.checkStopTyping = setInterval(function(){
				if (psm.chat.typingFlag){
					var diff = new Date() - psm.chat.lastTypingTime;
					if (diff > 2800){
						psm.chat.typingFlag = false;
						psm.msgqueue.addSystemMsg('stop_typing');
					}
				}
			}, 500);
			
		    psm.updater.init();
			$('#messages').append('<div class="new_chat">Беседа начата. Поприветствуйте собеседника.</div>')
		},
		destroy: function(){
			psm.inChat = false;
			clearInterval(psm.chat.checkStopTyping);
			clearInterval(psm.msgqueue.sendingCheck);
			psm.msgqueue.sendingCheck = null;
			clearInterval(psm.updater.poller);
			psm.updater.poller = null;
		}
	},
	msgqueue: {
		queue: [],
		sending: false,
		sendingCheck: null,
		addSystemMsg:function(message){
			var msg = {
				type: 'system',
				msg: message
			};
			this.add(msg);
		},
		addMsg: function(message){
			psm.chat.showMyMessage(message);
			var msg = {
				type: 'msg',
				msg: message
			};
			this.add(msg);
		},
		add: function(msg){
			var message = jQuery.extend.call(msg, {
				time: new Date().getTime()
			});
			log(message);
			this.queue.push(message);
			this.send();
		},
		send: function(){
			if (!psm.msgqueue.sending){
				this.sendQueue();
			}else{
				if (psm.msgqueue.sendingCheck === null){
					psm.msgqueue.sendingCheck = setInterval(function(){
						if (!psm.msgqueue.sending){
							psm.msgqueue.sendQueue();
						}
					}, 500);
				}
			}
		},
		sendQueue: function(){
			if (this.queue.length === 0){
				clearInterval(psm.msgqueue.sendingCheck);
				psm.msgqueue.sendingCheck = null;
			}else{
				psm.msgqueue.sending = true;
			}
			//TODO: sort messages, filter unneeded typing/stop_typing, etc.
			//TODO: make it more beatiful
			var data = {};
			for (var i = 0; i<psm.msgqueue.queue.length; i++){
				data['type-'+i] =  psm.msgqueue.queue[i].type;
				data['msg-'+i] =   psm.msgqueue.queue[i].msg;
				data['time-'+i] =  psm.msgqueue.queue[i].time;
			}
			psm.msgqueue.queue = [];
			psm.msgqueue._send = $.ajax({
				url: '/send/'+psm.chat.uid+'/',
				data: data,
				dataType: 'json',
				type: 'POST',
				success: function(){
					psm.msgqueue.sending = false;
				},
				error: function(){
					psm.msgqueue.sending = false;
				}
			});
		}
	},//eo msgqueue
	updater: {
		polling: false,
		poller: null,
		init: function(){
			psm.updater.poller = setInterval(psm.updater.poll, 100);
			psm.updater.poll();
		},
		poll: function(){
			if (!psm.updater._poll || !psm.updater.polling){
				psm.updater.polling = true;
				psm.updater._poll = $.ajax({
					url: '/poll/'+psm.chat.uid+'/',
					type: 'GET',
					cache: false,
					dataType: 'json',
					success: function(data){
						psm.updater.polling = false;
						psm.chat.newMessages(data);
					},
					error: function(){
						psm.updater.polling = false;
					}
				});
			}
		}
	},
	disconnect: {
		init: function(who){
			if (who == 'i') {
				$.ajax({
					url: '/send/'+psm.chat.uid+'/',
					data: {
						'type-0': 'system',
						'msg-0': 'disconnect',
						'time-0': new Date().getTime()
					},
					dataType: 'json',
					type: 'POST',
					success: function(){
						psm.disconnect.destroyAndRebuild();
					},
					error: function(){
						psm.disconnect.destroyAndRebuild();
					}
				});
			}else{
				psm.disconnect.destroyAndRebuild();
			}
		},
		destroyAndRebuild: function(){
			psm.inChat = false;
			psm.wait.inWait = false;
			psm.chat.uid = null;
			psm.chat.destroy();
			if (psm.updater._poll){
				psm.updater._poll.abort();
			}
			psm.updater._poll = null;
			
			$('#disconnect_btn').attr({'disabled':'disabled'});
			$('#partner_typing').empty();
			var log = $('#messages').html();
			$('#messages').append('<div class="disconnected">Беседа прервана. Начать <span id="retalk">новую беседу<\/span> или <span id="save_log">сохранить лог<\/span><\/div>');
			$('#messages').scrollTop(100000000);
			$('#retalk').bind('click', function(){
				psm.wait.init();
			});
			$('#save_log').bind('click', function(){
				$('#log_html').attr({value:log});
				$('#log').submit();
			});
		}
	}
};


jQuery(document).ready(function(){
	psm.glob.init();
	psm.home.init();
});