(function($) {
	
	var opts = {};
	var lastUpdateRequest = null;
	var lastMessageReceived = false;
	var initialUpdate = false;

	$.fn.chat = function(options) {
		opts = $.extend({},	$.fn.chat.defaults, options);

		return this.each(function() {
			var $this = $(this);
			if(opts.data.length > 0){
				appendMessages(opts.data);
			}
			setTimeout(function(){update();}, opts.firstUpdateAfter);

			$this.find("form").bind(
				'submit keypress',
				function(event) {
					if(event.type=='keypress' && (event.which == '13' || event.which == '10') || event.type == 'submit'){
						post($(this));
						return false
					}else if(event.type=='keypress' && event.which != '13'){
						if($(this).val().length > opts.characterLimit){
							$(this).val($(this).val().substr(0,opts.characterLimit));
						}else if($(this).val().length > (opts.characterLimit * 0.8)){
								
						}
					}
				}
			);
		});
	};

	function update() {
		if(lastUpdateRequest){
			lastUpdateRequest.abort();
		}
		lastUpdateRequest = $.ajax({
			url: opts.update + lastMessageReceived,
			type: 'post',
			dataType:'json',
			success: function(json) {
				appendMessages(json);
			},
			complete: function(data) {
		        if(opts.autoUpdate){
			        update();
		        }
			},
		   
		});
	};

	function post($obj) {
		if(lastUpdateRequest){
			lastUpdateRequest.abort();
		}
		var $name = $obj.find("input[name='data[Chat][name]']");
		var $message = $obj.find("textarea[name='data[Chat][message]']");
		var $submit = $obj.find("input[type='submit']");
		var $chatWindow = $(".chat_window");

		if (($.trim($message.val()) == "")) {
			return;
		}

		var form = $obj.serialize();
		$message.attr('disabled', true);
		$submit.attr('disabled', true);

		$.ajax({
			type: "POST",
			url: opts.post + lastMessageReceived,
			data: form,
			dataType:'json',
			success: function(json){
				appendMessages(json);
			},
			complete: function() {
				$submit.attr('disabled', false);
				$message.attr('disabled', false);
				$message.val("");
				$message.focus();
				opts.autoUpdate = true;
				update();
			}
		});
	};
	
	function appendMessages(json){
		if(json.length > 0){
			$.each(json, function(index,chat) {
				if(chat.Chat.id > lastMessageReceived){
					var class = ($(".chat_window p").size()%2)==1?'odd':'even';
					$(".chat_window").append(
						'<p class="'+class+'"><span class="chat_time">'+chat.Chat.timestamp+'</span><span class="chat_name"><span class="avatar"><a href="/forum/member.php?u='+chat.Chat.user_id+'" class=" not_me"><img src="/forum/image.php?u='+chat.Chat.user_id+'" alt="" /></a></span><a href="/forum/member.php?u='+chat.Chat.user_id+'" class=" not_me">'+chat.Chat.name+'</a></span>: '+chat.Chat.message+'</p>'
					);
					if(chat.Chat.id > lastMessageReceived){
						lastMessageReceived = chat.Chat.id;
					}
				}
			});
			var chatWindow = $(".chat_window");
			var scrollDown = (chatWindow[0].scrollHeight - chatWindow.css('height').replace('px','') <= chatWindow.scrollTop()+100 || chatWindow[0].scrollHeight == chatWindow.css("height").replace("px",""))?true:false;
			if(scrollDown || !initialUpdate){chatWindow.scrollTop(chatWindow[0].scrollHeight);}
			initialUpdate = true;
		}
	}

	//
	// plugin defaults
	//
	$.fn.chat.defaults = {
		update: '/chat/update/',
		post: '/chat/post/',
		interval: 5000,
		characterLimit: 500,
		timeout:0,
		firstUpdateAfter:5,
		data:[],
		autoUpdate:true
	};
})(jQuery);
