var $Server = {
	domain: $Config.server_addr,
	BOSH: $Config.http_bind_addr,
	MUC: $Config.conf_server_addr
};

$Forms = {
	chatpanel: '<div id="chat_groupchat_panel"><textarea id="chat_field" readonly="readonly" rows="10" ></textarea><div id="chat_history_buttons" ><div class="button"><input type="button" id="chat_menu_form" style="/*width: 31%*/" value="Меню" /></div><div class="button"><input type="button" id="chat_history_mode" value="История" /></div><div class="button"><input type="button" id="chat_switch_mode" style="width:auto;" value="Администратор" /></div></div><textarea id="chat_message_field" rows="3"></textarea><div id="chat_tips"></div></div>',
	chatpanel_ie: '<div id="chat_groupchat_panel"><textarea id="chat_field" readonly="readonly" rows="10" cols="56" ></textarea><div id="chat_history_buttons" ><div class="button"><input type="button" id="chat_menu_form" style="width: 31%" value="Меню" /></div><div class="button"><input type="button" id="chat_history_mode" value="История" /></div><div class="button"><input type="button" id="chat_switch_mode" value="Администратор" /></div></div><textarea id="chat_message_field" rows="3" cols="45"></textarea><div id="chat_tips"></div></div>',
	loginpanel: '<div id="chat_login_panel"><p id="chat_login_header">Пожалуйста войдите: </p><div id="chat_error"></div><fieldset id="chat_inputs" ><div id="chat_login" class="label">Логин: <input id="chat_login_input" type="text" value="" /></div><div id="chat_email" class="label" style="display:none;">Е-mail: <input id="chat_email_input" type="text" value="" /></div><div id="chat_password" class="label">Пароль: <input id="chat_password_input" type="password" value="" /></div></fieldset><div id="chat_buttons" ><div class="chat_button"><input type="button" id="chat_register_button" value="Регистрация" /></div><div class="chat_button_left"><input type="button" id="chat_login_button" value="Войти" /></div></div><div id="chat_tips">* Если вы когда-нибудь использовали наши чаты или сайт, то вы можете войти используя те данные...</div></div>',
	loadingpanel: '<div id="chat_splash_panel"><div id="chat_splash_text"><div id="chat_loader"><img src="http://'+$Config.server_addr+'/clientlibs/icons/loader.gif" alt="" /></div>Соединяемся...</div></div>',
	flashrequiredpanel: '<div id="chat_splash_panel"><div id="chat_splash_text">Для работы чата необходим Adobe Flash.<br>Скачать можно по ссылке:<br><a href="http://get.adobe.com/flashplayer/" target="blank">http://get.adobe.com/flashplayer/</a></div></div>',
	menupanel: '<div id="chat_menu_panel"><p id="chat_login_header">Меню</p><div id="chat_error"></div><!--<fieldset id="chat_inputs" ><div id="chat_pres_change" class="label">Новый статус: <input id="chat_pres_change_input" type="text" value="" /></div><div class="chat_button_lonely"><input type="button" id="chat_pres_change_button" value="Сменить статус" /></div></fieldset>!--><div id="chat_buttons" ><div class="chat_button_center"><input type="button" id="chat_disconnect_button" value="Покинуть чат и комнату" /><input type="button" id="chat_menu_cancel_button" value="Вернуться к чату" /></div></div><div id="chat_tips"></div></div>',
	historypanel: '<div id="chat_history_panel"><p id="chat_history_header">История общения:</p><textarea id="chat_history_field" rows="15" readonly="readonly"></textarea><div id="chat_history_buttons"><div class="button"><input id="chat_history_prev" type="button" value="Пред.стр." /></div><div class="button"><input id="chat_history_back" type="button" value="Назад в чат" /></div><div class="button"><input id="chat_history_next" type="button" value="След.стр." /></div></div></div>'
}

var connection = null;	
var $User = null;

var $RegInfo = null;
var $LastHistory = null;
var $HistoryPage = 1;

var $Client = null;
var $Tip = '';

var $ChatManager = null;
var $ChatGroup = null;
var $ChatHistory = null;
var tmpChat = null;

var $Player = CheckPlayer();

function CheckPlayer(){
    if(flensed.checkplayer().playerVersionDetected == '0.0.0') 
		return false;
    return true;
}


function update($OBJ){
	$OBJ = typeof($OBJ) != 'undefined' ? $OBJ : $('#chat_field');
	$OBJ.append(document.createTextNode(''));
	$OBJ.scrollTop($OBJ.attr('scrollHeight'));
}

function log(msg, $OBJ) 
{
	$separator = '\n';
	if($.browser.msie){
		$separator = '\r';
	}
	
	$OBJ = typeof($OBJ) != 'undefined' ? $OBJ : null ;
	if($OBJ){
		//width = $OBJ.width();
		$OBJ.append(document.createTextNode(msg + $separator));
		$OBJ.scrollTop($OBJ.attr('scrollHeight'));
		//$OBJ.width(width);
	} else {
		$ChatGroup.append(document.createTextNode(msg + $separator));
	}
}

function error(msg){
	loadLoginForm();
	$('#chat_error').empty();
	$('#chat_error').append(msg);
}

function tips(msg){
	$('#chat_tips').empty();
	$('#chat_tips').append(msg);
}

function loadLoginForm(){	
	$('#chat_form').empty();
	$('#chat_form').append($Forms['loginpanel']);
	//Binding Login Logic on button
	$('#chat_login_button').bind('click', login);
	//Binding Register Logic on button
	$('#chat_register_button').bind('click', function(){
		var button = $(this).get(0);
		if (button.value == 'Регистрация'){
			$('#chat_email').css('display', 'block');
			button.value = 'Готово';
		} else if (button.value == 'Готово'){
			var _JID = $('#chat_login_input').get(0).value;
			var _email = $('#chat_email_input').get(0).value;
			var _password = $('#chat_password_input').get(0).value;
			if( !_JID || !_email || !_password){
				$('#chat_error').empty();
				$('#chat_error').append('Заполните все поля для регистрации!');
			}
			$User = {
					nickname: _JID,
					email: _email,
					JID : _JID + '@' + $Server.domain,
					fullJID : _JID + '@' + $Server.domain, // + '/' + Math.random(),//'/SC',
					password: _password	    			
			};
			
			$.ajax({
				url: "http://" + $Config.server_addr + "/users/external_registration/" + $User.nickname + "/" + $User.password + "/" + $User.email +"/callback=?",
				dataType: 'jsonp',
				success: function (data){
					$RegInfo = data;
					$('#chat_error').empty();
					$('#chat_error').append($RegInfo.status + ': ' + $RegInfo.message);
					return false;
				} 
			});
			
			$('#chat_email').css('display', 'none');
			button.value = 'Регистрация';
		}
	});
}

function loadMenuForm(){
	$('#chat_form').empty();
	$('#chat_form').append($Forms['menupanel']);
	$('#chat_disconnect_button').bind('click', function(){
		connection.send($pres({ type: 'unavailable' }).tree());
		connection.send($pres({from: $User.fullJID, to: MUC.room.userJID, type: 'unavailable' }).tree());
		connection.flush();
		disconnect()
	});
	$('#chat_menu_cancel_button').bind('click', function(){
		loadMessageForm();
		$("#chat_field").replaceWith(($Client.mode == 'groupchat')?($ChatGroup):($ChatManager));
                if($Client.mode == 'groupchat')
                    $('#chat_switch_mode').get(0).value = 'Администратор';
                else if ($Client.mode == 'chat')
                    $('#chat_switch_mode').get(0).value = 'Общий чат';
		tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
		tips(tip);
		update();
	});
}

function loadConnectionForm(){
	$('#chat_form').empty();
	$('#chat_form').append($Forms['loadingpanel']);
}

function loadFlashRequiredForm(){
	$('#chat_form').empty();
	$('#chat_form').append($Forms['flashrequiredpanel']);
}

function changeChatMode(){
	button = $('#chat_switch_mode').get(0);
	if($Client){
		if($Client.mode == 'groupchat'){
			button.value = 'Общий чат'
			$Client.mode = 'chat';
			var $tmpChat = $('#chat_field').clone();
			$('#chat_field').replaceWith($ChatManager);
			$ChatGroup = $tmpChat.clone();
			
			$Client.unread = 0;
			$Client.unread_from = "народа"
			tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
			tips(tip);
		}
		else if ($Client.mode == 'chat'){
			button.value = 'Администратор'
			$Client.mode = 'groupchat';
			var $tmpChat = $('#chat_field').clone();
			$('#chat_field').replaceWith($ChatGroup);
			$ChatManager = $tmpChat.clone();

			$Client.unread = 0;
			$Client.unread_from = "администратора"
			tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
			tips(tip);
		}
		
		update(); //Opera 10.5 DOMfix	
	}
}

function getHistory(page){
	$.ajax({
		url: "http://" + $Config.server_addr + "/messages/external_request/" + $Config.room_id + "/" + page + "/callback=?",
		dataType: 'jsonp',
		success: function (data){ 
			$LastHistory = data;
			$lastpage = false;
			
			$('#chat_history_field').empty();
			
			for(var $elem in $LastHistory){
				if($elem != 'callback' && $elem != 'lastpage') {
					log($LastHistory[$elem].Message.user_jid + ' (' + $LastHistory[$elem].Message.post_time +'): ' + $LastHistory[$elem].Message.content, $('#chat_history_field'))
				} else if ($elem == 'lastpage'){
					$lastpage = true;
				}
			}
			$('#chat_history_field').scrollTop(0);
			$('#chat_history_prev').removeAttr('disabled');
			$('#chat_history_next').removeAttr('disabled');

			if(page == 1){
				$('#chat_history_prev').attr('disabled', 'true');
			}
			if ($lastpage) {
				$('#chat_history_next').attr('disabled', 'true');
			}

			return true;
		}});
			
	return false;
}

function loadHistoryForm(){
	$('#chat_form').empty();
	$('#chat_form').append($Forms['historypanel']);
	$ChatHistory = $('#chat_history_field').clone();
	getHistory($HistoryPage)
	$('chat_history_field').replaceWith($ChatHistory);
	$('#chat_history_prev').bind('click', function(){ getHistory(--$HistoryPage) });
	$('#chat_history_next').bind('click', function(){ getHistory(++$HistoryPage) }); 
	$('#chat_history_back').bind('click', function(){
		loadMessageForm();
               if($Client.mode == 'groupchat')
                    $('#chat_switch_mode').get(0).value = 'Администратор';
                else if ($Client.mode == 'chat')
                    $('#chat_switch_mode').get(0).value = 'Общий чат';
		$("#chat_field").replaceWith(($Client.mode == 'groupchat')?($ChatGroup):($ChatManager));
		tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
		tips(tip);
		update();
		
	});
}

function loadMessageForm(){
	$('#chat_form').empty();
	//$('#chat_form').append($Forms['chatpanel']);
	if ($.browser.msie) {
		$('#chat_form').append($Forms['chatpanel_ie']);
	} else {
		$('#chat_form').append($Forms['chatpanel']);
	}
	$('#chat_switch_mode').bind('click', changeChatMode);
	$('#chat_history_mode').bind('click', loadHistoryForm);
	$('#chat_menu_form').bind('click', loadMenuForm);
	$('#chat_message_field').bind('keyup', function(event){
		if (event.keyCode == '13') {
			if (connection){
				var str = $(this).get(0).value;
				//msg = str.substr(0, str.length - 1);
				var msg = str.replace(/(^(\s+))|((\s+)$)/gi, '');
				if (msg != '')
					sendMessage(msg);
			}						
			$(this).get(0).value = "";
		}
	});
	//var $Tips = 'Your name:' + $User.nickname + ', Unread: ' + $Client.unread + ' from ' + $Client.unread_from + '...';
}

function login(){
	var _JID = $('#chat_login_input').get(0).value;
	var _password = $('#chat_password_input').get(0).value;
	if (_JID == '' || _password == ''){
		error('Пустые логин или пароль.');
		return;
	}	
	$User = {
		nickname: _JID,
		JID : _JID + '@' + $Server.domain,
		fullJID : _JID + '@' + $Server.domain, //+ '/SC',
		password: _password	    			
	};	
	connection = new Strophe.Connection($Server.BOSH);
	connection.connect($User.fullJID, $User.password, onConnect);
}

function disconnect(){
	if ( MUC.room ){
		connection.send($pres({from: $User.fullJID, to: MUC.room.userJID, type: 'unavailable' }).tree());
		connection.flush();
	}
	connection.send($pres({ type: 'unavailable' }).tree());
	connection.flush();

	connection.disconnect();
}

$(document).ready(function () {
	$('#chat_form_header').bind('click', function(){
		if($Player){
			if($('#chat_form').css('display') == 'block' && !connection){
				$('#chat_form').css('display', 'none');
				$('#chat_form').empty();
			} else if($('#chat_form').css('display') == 'none' && !connection){
				loadLoginForm(); //Loading login form
				$('#chat_form').css('display', 'block'); //showin it.
			} else if($('#chat_form').css('display') == 'block' && connection){
				$('#chat_form').css('display', 'none');
			} else if($('#chat_form').css('display') == 'none' && connection){
				$('#chat_form').css('display', 'block');
				update();
			}
		} else {
			if($('#chat_form').css('display') == 'block'){
				$('#chat_form').css('display', 'none');
				$('#chat_form').empty();
			} else if($('#chat_form').css('display') == 'none'){
				loadFlashRequiredForm();
				$('#chat_form').css('display', 'block');
			}
		}
	});
});

function sendMessage(msg){
	if($Client != null){
		if($Client.mode == 'groupchat'){
			reply = $msg({to: MUC.room.JID, from: $User.JID, type: 'groupchat'}).c('body', msg);
			$.ajax({
				url: "http://" + $Config.server_addr + "/messages/external_add/" + $Config.room_id + "/" + $User.JID + "/" + msg + "/callback=?",
				dataType: 'jsonp',
				success: function (data){ return false;} 
			});
		} else {
			log($User.nickname + ': ' + msg, $ChatManager);
			reply = $msg({to: $Config.owner_jid, from: $User.JID, type: 'chat'}).c('body', msg);
		}
		connection.send(reply.tree());

	}
}

function onConnect(status) {
    if (status == Strophe.Status.CONNECTING) {
		loadConnectionForm();
    } else if (status == Strophe.Status.DISCONNECTING) {
		loadConnectionForm();
		var tmpPic = $('#chat_loader').clone();
		$('#chat_splash_text').empty();
		$('#chat_splash_text').append(tmpPic).append('Рассоединяемся...');
    } else if (status == Strophe.Status.AUTHFAIL) {
		error('Неправильные логин или пароль...');
		connection = null;
    } else if (status == Strophe.Status.CONNFAIL) {
		error('Внутренняя ошибка сервера.');
		$('#chat_login_input').get(0).value = $User.nickname;
		$('#chat_password_input').get(0).value = $User.password;
		connection.flush();
		connection.pause();
		connection = null;
    } else if (status == Strophe.Status.DISCONNECTED) {
		error('Соединение разорвано.');
		$('#chat_login_input').get(0).value = $User.nickname;
		$('#chat_password_input').get(0).value = $User.password;
		connection = null;
		$ChatGroup = null;
		$ChatManager = null;
    } else if (status == Strophe.Status.CONNECTED) {
		loadMessageForm();
		$ChatManager = $('#chat_field').clone();
		$ChatGroup = $('#chat_field').clone();

		$('#chat_field').replaceWith($ChatGroup);
		
		$Client = { mode : 'groupchat', status: 'connected', unread: 0, unread_from: 'админинстратора' };
		connection.send($pres().tree());
		connection.flush();
		connection.addHandler(onMessage, null, 'message', null, null, null);
		connection.addHandler(onMUCStanza, null, null, null, null, $Server.MUC, null);

		log('Тут сидит представитель сайта или комнаты. Если у вас есть какието вопросы то вы можете задать их ему прямо сейчас, и он обязательно ответит на них в скором времени...', $ChatManager);
		tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
		tips(tip);
		MUC.enterToRoom($Config.room_jid);
    }

}

function onMessage(msg) {
	var id = msg.getAttribute('id');
    var to = msg.getAttribute('to');
    var from = msg.getAttribute('from');
    var type = msg.getAttribute('type');
    var elems = msg.getElementsByTagName('body');
    
    if (type == "chat" && elems.length > 0 ) {
		if ($Client && $Client.mode == 'groupchat'){
			$Client.unread ++;
			$Client.unread_from = 'админинстратора';
			tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
			tips(tip);
		}
		var body = elems[0];
		var nick = Strophe.getNodeFromJid(from);
		log( nick + ': ' + Strophe.getText(body), $ChatManager);
	} 
    if (type == "groupchat" && elems.length > 0 ) {
		if ($Client && $Client.mode == 'chat'){
			$Client.unread ++;
			$Client.unread_from = 'народа';
			tip = 'Вы зашли как ' + $User.nickname + ', непрочитано: ' + $Client.unread + ' от ' + $Client.unread_from;
			tips(tip);
		}
		var body = elems[0];
		var nick = (Strophe.getResourceFromJid(from) || 'Service');
		log( nick + ': ' + Strophe.getText(body), $ChatGroup);
	} 
    // we must return true to keep the handler alive.  
    // returning false would remove it after it finishes.
    return true;
}

function onMUCStanza(msg){
	var id = msg.getAttribute('id');

	MUC.parceMessage(msg);

	return true;
}

/* 	Strophe MUC Extension
**	Release a XEP-0045 protocol's extension
*/
var $Disco = {
	getInfo: function ( userJID, resourceId ){
		return $iq({ from: userJID, id: 'disco', to: resourceId, type: 'get' })
					.c('query', { xmlns: Strophe.NS.DISCO_INFO });
	},

	getItems: function ( userJID, serverId ){
		return $iq({ from: userJID, id: 'disco2', to: serverId, type: 'get' })
					.c('query', { xmlns: Strophe.NS.DISCO_ITEMS });
	}
};

var MUC = {
	rooms: new Array(),
	
	parceMessage: function(msg) {
		var query = msg.children[0];
		var xmlns = query.getAttribute('xmlns');
        
		if ( xmlns == Strophe.NS.DISCO_INFO ){
			for ( i = 0; i < query.children.length; i++){
				if ( query.children[i].getAttribute('var') == Strophe.NS.MUC ){
					this.isGoodServer = true;
				}
				else if(query.children[i].getAttribute('conference') == Strophe.NS.MUC ){
				}
			}
		}
		return true;
	},

	onMUCPresence : function(msg) {
		var from = msg.getAttribute('from');
		var nick = Strophe.getResourceFromJid(from);
		
		var type = msg.getAttribute('type') || 'available';
		
		var items = msg.getElementsByTagName('item');
		if(items && items[0]){
			var role = items[0].getAttribute('role');
			if(MUC.room.users[nick] && MUC.room.users[nick] != ''){
				if(type == 'unavailable'){
					var status = msg.getElementsByTagName('status');
					if(status && status[0])
						if(status[0].getAttribute('code') == 307){
							connection.send($pres({ type: 'unavailable' }).tree());
							connection.flush();
							connection._changeConnectStatus(Strophe.Status.CONNFAIL, null);
							error('Возможно ктото зашёл в эту же комнату с вашего аккаунта...');
						}
					if(nick == $User.nickname && !connection.disconnecting){
						connection.send($pres({ type: 'unavailable' }).tree());
						connection.flush();
						connection._changeConnectStatus(Strophe.Status.CONNFAIL, null);
						error('Неизвестная ошибка сервера...');
					}
					MUC.room.users[nick] = '';
					log( nick + ' покидает нас...');
				} else {
					MUC.room.users[nick] = (!type)?('available'):(type);
					log( nick + ' изменил свой статус на ' + type);
				}
			} else {
			    MUC.room.users[nick] = (!type)?('available'):(type);
		    	    log( nick + '... +1 пользователь');
			}
		}
		
		return true;
	}, 
	
	enterToRoom: function(_roomJID){
        connection.flush();
	     
		this.room = { JID: _roomJID, server: $Server.MUC }; 
		log("Прямо сейчас соединяемся с комнатой " + this.room.JID);
		
		connection.flush();
		packet = $iq(
					{	from: $User.fullJID,
						id: 'getnick1',
						to: this.room.JID,
						type: 'get'
					})
					.c('query', 
							{	xmlns: Strophe.NS.DISCO_INFO,
								node: 'x-roomuser-item'
							})
					.tree();
		connection.send(packet);
		connection.flush();
		
		this.room.userJID = this.room.JID + '/' + $User.nickname;
		packet = $pres(
					{	from: $User.fullJID,
						to: this.room.userJID
					})
					.c( 'x', { xmlns: Strophe.NS.MUC })
					.c( 'history', { maxstanzas: '3' })
					.tree();
		
		connection.flush();
		connection.send(packet);
		connection.flush();
		
		this.room.users = new Array();
		connection.addHandler(this.onMUCPresence, null, 'presence', null, null, this.room.JID, {matchBare : true});
		
		reciever = MUC.room.JID;
		//$('#recvJID').get(0).value = reciever;
		
		return true;

	}
};