/*****************************
**   AJAX
******************************/

function ajaxLoad(url, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) {
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		var ajaxObject = new XMLHttpRequest();
		ajaxObject.onreadystatechange = function(){
			ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
		}
		ajaxObject.open("GET", url, true);
		ajaxObject.send(null);
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajaxObject) {
			ajaxObject.onreadystatechange = function(){
				ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
			}
			ajaxObject.open("GET", url, true);
			ajaxObject.send();
		}
	}
}

function ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) {
	var ajaxObject = null;
	
	if (window.XMLHttpRequest) { // branch for native XMLHttpRequest object
		ajaxObject = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // branch for IE/Windows ActiveX version
		var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if(ajaxObject){
		ajaxObject.onreadystatechange = function(){
			ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
		}
		ajaxObject.open("POST", url, true);
		ajaxObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		ajaxObject.setRequestHeader("Content-length", data.length);
		ajaxObject.setRequestHeader("Connection", "close");
		ajaxObject.send(data);	
	}
}

function ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction){
	// only if req shows "complete"
	if (ajaxObject.readyState == 4) {
		// only if "OK"
		if (ajaxObject.status == 200) {
			// ...processing statements go here...
			ajaxCallBackFunction.call(callObject, ajaxObject, params);
		} else {
			if(ajaxCallBackErrorFunction){
				ajaxCallBackErrorFunction.call(callObject, ajaxObject, params);	
			} else {
				alert("There was a problem retrieving the XML data:\n" + ajaxObject.statusText);
			}
		}
	}
}

/* AJAX handlers */
ajaxHandler = {
	alertError : function (message) {
		if (message && message != '') {
			alert( message );
		} else {
			alert( 'Ошибка без названия.' );
		}
	},
	checkResponse : function (ajaxObj, text) {
		if (text) {
			var response = JSON.decode(ajaxObj);
		} else {
			var response = JSON.decode(ajaxObj.responseText);
		}
		//var response = JSON.decode(ajaxObj);
		if (!$defined(response)) {
			ajaxHandler.alertError('Сервер почему-то ничего не ответил.');
			return false;
		}
		
		if (!response.status) {
			ajaxHandler.alertError('Сервер ни с того, ни с сего сообщил следующее: «' + ajaxObj.responseText + '»');
			return false;
		}
		
		if (response.status == 'ERR') {
			ajaxHandler.alertError(response.message);
			return false;
		}
		
		if (response.status == 'OK') {
			if (response.message == '') {
				return response;
			} else {
				ajaxHandler.alertError(response.message);
				return response;
			}
		} else {
			ajaxHandler.alertError('Сервер не сообщил об ошибке, но и не подтвердил, что всё прошло хорошо.');
			return response;
		}
	},
	highlightField : function (input, bg_color, highlight_color) {
		var input = $(input);
		var bg_color = bg_color || '#FFFFFF';
		var highlight_color = highlight_color || '#FF0000';
		$(input).set('morph');
		input.style.backgroundColor = highlight_color;
		input.morph({'background-color':bg_color});
		
	}
};

/* Chat */
chatHandler = {
	size : 400,
	opened : false,
	loading : false,
	loadingInterval : null,
	sending : false,
	sendingInterval : null,
	chatHolderFx : false,
	chatMessageFx : false,
	chatResizerDrag : false,
	waitToSend : false,
	firstOpening : true,
	open : function ()  {
		if (Browser.Engine.trident && Browser.Engine.version < 5) {
			if ($('post_status')) {
				$('post_status').setStyle('visibility','hidden');
			}
		}
		$('chat').set('morph', {'duration':300});
		$('chat').removeClass('hidden');
		$('chat').morph({'margin-top':0});
		$('js-chat_send_message_holder').set('morph', {'duration':300});
		chatHandler.opened = true;
		$('js-chat_input').focus();
		chatHandler.load();
		if (!chatHandler.chatResizerDrag) {
			chatHandler.chatResizerDrag = new _Drag($('js-chat_resizer'), {'style':true, onDrag:function () {
				$('js-chat_messages_overflow_holder').style.height = chatHandler.size - this.mouse.start.y + this.mouse.now.y + 'px';
			}, onComplete:function() {
				chatHandler.size = chatHandler.size - this.mouse.start.y + this.mouse.now.y;
			}});
		}
	},
	close : function () {
		$('chat').set('morph', {'duration':300, onComplete: function () {
			$('chat').addClass('hidden');
			chatHandler.opened = false;
			if (Browser.Engine.trident && Browser.Engine.version < 5) {
				if ($('post_status')) {
					$('post_status').setStyle('visibility','visible');
				}
			}
		}});
		$('chat').morph({'margin-top':-chatHandler.size - 32});
		$clear(chatHandler.loadingInterval);
		chatHandler.firstOpening = true;
	},
	draw : function (response) {
		if ($('js-chat_messages_overflow_holder').getScrollSize().y - chatHandler.size - $('js-chat_messages_overflow_holder').getScroll().y > 10) {
			var scroll = false;
		} else {
			var scroll = true;
		}
		var messages = new Hash(response.messages);
		for (var i = 0; i < messages.getLength(); i++){
			var message = messages.get(i);
			if (message.body.lastIndexOf(chatHandler.username + ':') == 0) {
				var newMessage = new Element('div', {'class':'message message_to_me', 'id':'chat_message_'+message.id});
			} else {
				var newMessage = new Element('div', {'class':'message', 'id':'chat_message_'+message.id});
			}
			
			var iHTML = '';
			
			if (message.user_login == '#System' ) {
				iHTML += '<span class="system_msg">[' + message.createdate + '] <span class="user_name">Системное сообщение&gt;</span>&nbsp;' + message.body + '</span>';
			}
			else {
				if (message.user_login == chatHandler.username) {
					newMessage.style.color = '#FFF';
					var color = '#FFFFFF';
					iHTML += '[' + message.createdate + '] <span class="user_name" style="color:'+ color +';">';
					iHTML += '<a style="color:'+ color +';" href="http://c-s.net.ua/forum/user'+ message.id_user +'.html" onclick="chatHandler.answerName(this); return false;">'+ message.user_login +'</a>';
				} else {
					iHTML += '[' + message.createdate + '] <span class="user_name">';
					iHTML += '<a href="http://c-s.net.ua/forum/user'+ message.id_user +'.html" onclick="chatHandler.answerName(this); return false;">'+ message.user_login +'</a>';
				}
				iHTML += '&gt;</span>&nbsp;' + message.body;
			}
			newMessage.innerHTML = iHTML;
			newMessage.inject($('js-chat_messages_holder'));
			if (i == messages.getLength() - 1) {
				$('js-chat_last').value = message.id;
			}
			
		}
		if (scroll || chatHandler.firstOpening) {
			//$('js-chat_messages_overflow_holder').scrollTo(0, $('js-chat_messages_overflow_holder').getScrollSize().y - chatHandler.size);
			var myChatScrollFx = new Fx.Scroll($('js-chat_messages_overflow_holder')).toBottom();
		}
		chatHandler.firstOpening = false;
	},
	load : function () {
		if (!chatHandler.loading) {
			chatHandler.loading = true;
			//$('js-chat_messages_overflow_holder').addClass('loading_messages');
			var data = 'last=' + $('js-chat_last').value;
			ajaxLoadPost('/forum/chat/', data, function (ajaxObj) {
				chatHandler.loading = false;
				//$('js-chat_messages_overflow_holder').removeClass('loading_messages');
				var response = ajaxHandler.checkResponse(ajaxObj);
				if (response) {
					chatHandler.draw(response);
				}
				if (!chatHandler.waitToSend) {
					chatHandler.loadingInterval = (function () {chatHandler.load()}).delay(10000);
				} else {
					chatHandler.send();
				}
			});
		}
	},
	send : function () {
		if( $('js-chat_input').value.toLowerCase() == 'close' ) {
			chatHandler.close();
			$('js-chat_input').value = '';
		}
		else if (!chatHandler.sending) {
			if (!chatHandler.waitToSend) {
				$clear(chatHandler.loadingInterval);
				$('js-chat_send_message_holder').morph({'height':0});
				$('js-chat_input').addClass('sending_message');
				$('js-chat_input').set({'readonly':'readonly'});
			}
			var data = $('js-chat_send_message_form').toQueryString();
			if (!chatHandler.loading) {
				chatHandler.sending = true;
				chatHandler.loading = true;
				ajaxLoadPost('/forum/chat/', data, function (ajaxObj) {
					chatHandler.waitToSend = false;
					chatHandler.sending = false;
					chatHandler.loading = false;
					$('js-chat_send_message_holder').morph({'height':32});
					$('js-chat_input').removeClass('sending_message');
					$('js-chat_input').set({'readonly':''});
					$('js-chat_input').value = '';
					var response = ajaxHandler.checkResponse(ajaxObj);
					if (response) {
						chatHandler.draw(response);
					}
					chatHandler.loadingInterval = (function () {chatHandler.load()}).delay(10000);
				});
			} else {
				chatHandler.waitToSend = true;
				chatHandler.sending = false;
			}
		}
	},
	answerName : function (button) {
		$('js-chat_input').value = button.innerHTML + ': ' + $('js-chat_input').value;
		$('js-chat_input').focus();
	}
};


/* global domready */
window.addEvent('domready', function() {
	if ($('chat')) {
		document.addEvent('keydown', function (e) {
			e = new Event(e);
			if ((e.control || e.metaKey) && (e.code == 192 || e.code == 221 || e.code == 1025)) {
				if (chatHandler.opened) {
					chatHandler.close();
				} else {
					chatHandler.open();
				}
			}
		});
	}
})