/*
 * jQuery Ajax Chat Plugin
 *
 * Adds a nice flexible chat to your website
 *
 * Requires:
 * 1. jQuery 1.2.x or newer
 * 2. Server side code to store/return messages and users data
 *    (see below for JSON format)
 *
 * Author: Damian Gaweda (damian.gaweda@gmail.com)
 *
 * Available under GPL licence
 * http://www.gnu.org/licenses/gpl.html
 */

/*
 * Expected JSON data format:
 *
{
    'timestamp': '1234271714',
    'users': { '0': 'Damian', '1': 'George', '2': 'Lisa' },
    'messages': {
        '0': {
            'user': 'Damian',
            'message': 'Hello there',
            'time': '2 hours ago'
        },
        '1': {
            'user': 'George',
            'message': 'Hi Mate!',
            'time': '2 hours ago'
        }
    }
}
*/

(function($){
		$.fn.ajaxChat = function(options) {
				defaults = {
					 chatForm: '.ajaxchat-form',
					 messagesContainer: ".ajaxchat-messages-container",
					 messagesScroller: ".ajaxchat-messages-scroller",
					 messageTemplate: ".ajaxchat-message-template",
					 messageInput: ".ajaxchat-input",
					 messageSubmit: ".ajaxchat-submit",
					 usersContainer: ".ajaxchat-users-container",
					 userTemplate: ".ajaxchat-user-template",
					 updateInterval: 6000 // default: 5 sec.
				};

				var options = $.extend(defaults, options);

				function chat(mainContainer) {

					 var timestamp = 0;
					 var chatForm = mainContainer.find(options.chatForm);
					 var messagesContainer = mainContainer.find(options.messagesContainer);
					 var messageTemplate = mainContainer.find(options.messageTemplate);
					 var messageInput = mainContainer.find(options.messageInput);
					 var messageSubmit = mainContainer.find(options.messageSubmit);
					 var usersContainer = mainContainer.find(options.usersContainer);
					 var userTemplate = mainContainer.find(options.userTemplate);
					 var updateTimer = null;

					 // Load all messages and users on document load
					 getUpdate(null);

					 // Event: Submit form when submit clicked
					 messageSubmit.click(function(){
					   getUpdate(chatForm.serialize() + '&ajaxChatSubmit=1');
					   messageInput.blur();
					   messageInput.attr("disabled", "disabled");
					   return false;
					 });

					 // This pulls data from the server
					 // formPostData is optional (required only to submit a message)
					 function getUpdate(formPostData) {
						clearTimeout(updateTimer);
                  var postData = 'timestamp=' + timestamp + '&' + formPostData;

						jQuery.post( chatForm.attr('action'), postData, function(response) {
							var template;
							var templateInner;

							// Append new messages from server to message window
							for (i in response.messages ) {
								template = messageTemplate.clone();
								templateInner = template.html();
								templateInner = templateInner.replace(/\{\{message\}\}/, response.messages[i].message);
								if(response.messages[i].user == 'Remedium') {
									templateInner = templateInner.replace(/\{\{user\}\}/, '<strong>'+ response.messages[i].user +'</strong>');
								} else {
									templateInner = templateInner.replace(/\{\{user\}\}/, response.messages[i].user);
								}
								templateInner = templateInner.replace(/\{\{time\}\}/, response.messages[i].time);
								template.html(templateInner);
								template.css('display', 'block');
								template.removeAttr('id');
								messagesContainer.append(template);
							}

							// Scroll down the messagesScroller, if configured in options
							if ((options.messagesScroller != null) && (jQuery(options.messagesScroller).length > 0) ) {
							 	var messagesScroller = jQuery(options.messagesScroller).get(0);
							 	var currentHeight = 0;
							 	if (messagesScroller.scrollHeight > 0) currentHeight = messagesScroller.scrollHeight;
					    		else if (messagesScroller.offsetHeight > 0) currentHeight = messagesScroller.offsetHeight;
					    		messagesScroller.scrollTop = currentHeight;
							}

							// Replace list of users with current list from server
							usersContainer.empty();
							for (i in response.users ) {
								template = userTemplate.clone();
								templateInner = template.html();
								templateInner = templateInner.replace(/\{\{user\}\}/, response.users[i]);
								template.html(templateInner);
								template.css('display', 'block');
								template.removeAttr('id');
								usersContainer.append(template);
							}

							// Update timestamp so we don't get all messages next time
							if(response.timestamp > timestamp) {
								timestamp = response.timestamp;
							}
//							console.log('timestamp:'+timestamp);

							if (postData.match(/ajaxChatSubmit/)) {
								messageInput.attr('disabled', '');
								messageInput.val('');
								messageInput.focus();
							}

							// Set timer to pull an update again
							updateTimer = setTimeout(getUpdate, options.updateInterval);

						}, 'json'); // end of jQuery.post

					 } // end of function getUpdate

				} // end of function chat

				return this.each(function() {
					chat($(this));
				});
		};
})(jQuery);

