/**
 * @author Vlad Yakovlev (red.scorpix@gmail.com)
 * @link www.scorpix.ru
 * @version 0.1
 * @date 2009-10-09
 * @requires jQuery
 * @requires jCommon
 * @requires jTweener
 */

function chat(elements, fillFunc, params) {

	if (!params) {
		params = {};
	}

	var
		formEl = $(elements.form),
		inputEl = elements.input ? $(elements.input) : formEl.find('input:text'),
		submitEl = elements.submit ? $(elements.submit) : formEl.find('input:submit');

	var
		isFirst = true,
		ajaxUrl = formEl.attr('action'),
		timeoutId,
		timeInterval = params.interval ? params.interval : 10000,
		isAjax = false,
		turn = [];

	formEl.submit(function() {

		ajaxLoad(inputEl.val());
		inputEl.val('');

		return false;
	});

	ajaxLoad();

	function ajaxLoad(message) {
		clearTimeout(timeoutId);

		message = undefined === message ? '' : $.trim(message);
		message && turn.push(message);

		if (isAjax) return;

		isAjax = true;

		var now = new Date();
		var params = { now: Math.round(now.getTime() / 1000) };

		if (turn.length) {
			params.message = turn.shift();
		}
		if (isFirst) {
			params.first = 1;
			isFirst = false;
		}

		$.ajax({
			cache: false,
			type: 'POST',
			dataType: 'text',
			url: ajaxUrl,
			data: params,
			success: function(data, status) {
				if ('success' == status) {
					var xmlData = $('root', $c.getXml(data));
					fillFunc(xmlData);
				}

				isAjax = false;

				if (turn.length) {
					ajaxLoad();
				} else {
					timeoutId = setTimeout(function() {
						ajaxLoad();
					}, timeInterval);
				}
			}
		});
	}
}

$(function() {
	$('.chat').each(function() {
		var rootEl = $(this);
		var cloneEl = $(this).find('.template').removeClass('template').remove();

		var months = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
		var year = 'года';

		chat({
			form: rootEl.find('form')
		}, function(xmlData) {

			var now = new Date();

			var isScroll = false;
			var containerHeight = rootEl.find('.messages .container').outerHeight();
			var messagesHeight = rootEl.find('.messages').height();

			rootEl.find('.messages').scrollTop(rootEl.find('.messages').scrollTop() - 1);

			if (containerHeight <= messagesHeight) {
				isScroll = true;
			} else if (10 > containerHeight - rootEl.find('.messages').scrollTop() - messagesHeight) {
				isScroll = true;
			}

			var els = xmlData.find('response message');
			if (!els.length) return;

			els.each(function() {

				var mTime = new Date();
				mTime.setTime($(this).attr('date') * 1000);

				var dateStr = mTime.getDate() + ' ' + months[mTime.getMonth()];

				if (now.getYear() != mTime.getYear()) {
					dateStr += ' ' + (1900 + mTime.getYear()) + ' ' + year;
				}

				var minutes = mTime.getMinutes().toString();

				if (2 > minutes.length) {
					minutes = '0' + minutes;
				}

				dateStr += ', ' + mTime.getHours() + ':' + minutes;

				var el = cloneEl.clone();
				el.find('p.date').text(dateStr);
				el.find('p.message').html('<strong>' + $(this).find('user>name').text() + ':</strong> ' + $(this).find('content').text());
				el.appendTo(rootEl.find('.messages .container'));
			});

			if (!isScroll) return;

			jTweener.removeTween(rootEl);

			var startTop = rootEl.find('.messages').scrollTop();
			var finishTop = rootEl.find('.messages .container').outerHeight() - rootEl.find('.messages').height();

			if (finishTop <= startTop) return;

			$t(rootEl, {
				time: 1,
				moveX: function(value) {
					rootEl.find('.messages').scrollTop(parseInt(startTop + (finishTop - startTop) * value));
				}
			}).tween();
		});
	});
});