$(function(){
	WebSocket.__swfLocation = 'js/WebSocketMain.swf';

	var host = 'ws://shinchan.biz:843/';

	if ($.cookie('sound') === 'true') {
		$('#sound').attr('checked', true);
	} else if ($.cookie('sound') === 'false') {
		$('#sound').attr('checked', false);
	} else {
		$('#sound').attr('checked', true);
	}

	$('#sound').click(function(){
		$.cookie('sound', $('#sound').attr('checked'), { expires: 365 });
	});

	var room = $.query.get('room');
	if (room) {
		$('#room').text(room);

		if (window.Audio) {
			if ((new Audio).canPlayType('audio/ogg') === 'maybe') {
				var ext = 'ogg';
			} else if ((new Audio).canPlayType('audio/mpeg') === 'maybe') {
				var ext = 'mp3';
			}
			if (ext) {
				var openAudio = new Audio('audio/open.' + ext);
				var closeAudio = new Audio('audio/close.' + ext);
				var messageAudio = new Audio('audio/message.' + ext);
			}
		}

		jPrompt('あなたのお名前は？', $.cookie('name'), null, function(name){
			if (name) {
				$.cookie('name', name, { expires: 365 });
			} else {
				name = 'ゲスト' + Math.floor(Math.random() * 1000);
			}

			var socket = new WebSocket(host);
			log('チャットサーバに接続しています。');

			socket.onopen = function(evt) {
				log('チャットサーバに接続しました。');
				socket.send($.toJSON({'status': 'open', 'name': name, 'room': room}));
				setInterval(function(){ socket.send(''); }, 300000);
				$('#form').submit(function(){
					var msg = $('#msg').val();
					if (msg) {
						$('#msg').val('').focus();
						socket.send($.toJSON({'status': 'message', 'msg': msg}));
					}
					return false;
				});
			};

			socket.onmessage = function(evt) {
				var date = new Date();
				var hours = String(date.getHours());
				var minutes = String(date.getMinutes());
				var seconds = String(date.getSeconds());
				var time = (hours.length   === 1 ? '0' + hours   : hours  )
				   + ':' + (minutes.length === 1 ? '0' + minutes : minutes)
				   + ':' + (seconds.length === 1 ? '0' + seconds : seconds);

				var json = $.evalJSON(evt.data);
				if (json.users) {
					$.each(json.users, function(i, user){
						if ($('.ignore[value=' + user.id + ']').attr('checked')) {
							json.users[i].ignore = true;
						} else {
							json.users[i].ignore = false;
						}
					});
					$('#users').empty();
					$.each(json.users, function(i, user){
						$('#users').append($('<input>', {
							'type': 'checkbox',
							'class': 'ignore',
							'value': user.id,
							'checked': user.ignore
						})).append(user.name + '<br>');
					});
				}
				switch (json.status){
					case 'open':
						log(time + ' [' + json.name + '] さんが入室しました。');
						if ($('#sound').attr('checked')) {
							if (openAudio) {
								openAudio.play();
							} else {
								$.sound.play('audio/open.mp3');
							}
						}
						break;
					case 'close':
						log(time + ' [' + json.name + '] さんが退室しました。');
						if ($('#sound').attr('checked')) {
							if (closeAudio) {
								closeAudio.play();
							} else {
								$.sound.play('audio/close.mp3');
							}
						}
						break;
					case 'message':
						if (!$('.ignore[value=' + json.id + ']').attr('checked')) {
							log(time + ' [' + json.name + '] ' + json.msg);
							if ($('#sound').attr('checked')) {
								if (messageAudio) {
									messageAudio.play();
								} else {
									$.sound.play('audio/message.mp3');
								}
							}
						}
						break;
				}
			};

			socket.onclose = function(evt) {
				log('チャットサーバから切断されました。');
			};
		});
	}
});

function log(msg) {
	msg = $('<span>' + msg + '</span>').autolink();
	if (!msg.find('a').length && ($.browser.mozilla || $.browser.opera)) {
		msg = $('<span>' + msg.html().split('').join('<wbr>').replace(/&<wbr>([lg])<wbr>t<wbr>;/g, '&$1t;') + '</span>');
	}
	$('#log').append($('<span>' + msg.html() + '</span><br>')).scrollTo({ top: '100%', left: 0 });
}

